MyBatis-Plus及多数据源入门教程

开发环境配置

JDK 1.8、Maven 3.8.8、 IDEA CE 2023.2、MySQL 8.0.34

框架介绍

MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。MyBatis 是一款非常优秀的开源框架,用来简化数据库应用程序的开发,使开发人员能够专注于应用程序逻辑,而不必关注数据库和 SQL 语句细节

框架依赖

在 pom 文件中添加 MyBatis-Plus 、MySQL 依赖,如下:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.32</version><scope>compile</scope></dependency></dependencies>

开始使用

enity 层定义数据库实体类:
package com.zdxlz.lwq.enity;import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;@TableName("grade")
public class Grade {@TableIdprivate  int id;@TableField("p_id")private String p_id;@TableField("score")private int score;@TableField("level")private String level;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getP_id() {return p_id;}public void setP_id(String p_id) {this.p_id = p_id;}public int getScore() {return score;}public void setScore(int score) {this.score = score;}public String getLevel() {return level;}public void setLevel(String level) {this.level = level;}
}
注解详解

@TableName 表名注解,标识实体类对应的表

@TableId 主键注解,标识实体类主键字段

@TableField 字段注解,标识实体类非主键字段

更多注解参阅:注解 | MyBatis-Plus

重要说明:实体类所对应的数据库及表、字段应提前在 MySQL 中创建完毕,且名称、字段类型完全一致,并在 application.yml 中正确配置数据库信息,如下:

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://192.168.22.82:3306/my_db?useUnicode=true&useSSL=falseusername: rootpassword: 123456
创建 Mapper

Mapper 是 MyBatis 中最重要的文件,文件中包含一组 SQL 语句(例如查询、添加、删除、修改),这些语句称为映射语句或者 SQL 映射语句。一个完整的 Mapper 映射器有Java 接口和 XML 文件(或注解)共同组成,它的作用包括:

  • 定义参数类型

  • 配置缓存

  • 提供 SQL 语句和动态 SQL

  • 定义查询结果和 POJO 的映射关系

具体介绍及使用可参阅:【Java ee】MyBatis核心配置——Mapper元素_mybatis映射文件中mapper元素_鸡兄长高了的博客-CSDN博客

为了简化开发,我们使用 MyBatis-Plus 提供的 Mapper 及一系列 SQL 接口,Mapper 实现如下:

package com.zdxlz.lwq.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zdxlz.lwq.enity.Grade;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface GradeMapper extends BaseMapper<Grade> {}

Mapper 开发完毕后,需要在 Application 中增加 @MapperScan 注解,@MapperScan 注解用于扫描 Mapper 接口,并将其实例化后交给 Spring 容器管理,使得可以在其他组件中使用这些 Mapper 接口的实现类。如下:

@SpringBootApplication
@MapperScan("com.zdxlz.lwq.mapper")
public class SpringBootDemoApplication {public static void main(String[] args) {SpringApplication.run(SpringBootDemoApplication.class,args);}
}
创建 Service

符合 Spring 开发 MVC 规范,创建 Service 层,在该层进行业务逻辑的具体实现

package com.zdxlz.lwq.service;import com.zdxlz.lwq.enity.Grade;
import com.zdxlz.lwq.mapper.GradeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;@Service
public class GradeService {@AutowiredGradeMapper gradeMapper;public void insertMsg(String p_id,int score,String level){Grade grade=new Grade();grade.setP_id(p_id);grade.setScore(score);grade.setLevel(level);//插入一条新数据gradeMapper.insert(grade);}public void deleteMsgByID(int id){//根据主键删除数据gradeMapper.deleteById(id);}public void deleteMsgByMap(String key,String value){//根据条件删除数据Map<String,Object> map=new HashMap<>();map.put(key,value);gradeMapper.deleteByMap(map);}}

各层详细说明见:Spring Boot项目中的Controller、Service、Mapper和Entity层的作用与联系_mapper层的作用_琴剑飘零西复东的博客-CSDN博客,MyBatis-Plus 的 Mapper 提供一系列的 CRUD 接口,方便我们快速开发、使用,相关接口使用参阅:CRUD 接口 | MyBatis-Plus

Controller 层操作数据库

在 Controller 中的自定义方法中操作数据库,代码如下:

   @Autowiredprivate GradeService gradeService;@PostMapping("insertMsg")public String insertMsg(String p_id,int score,String level){gradeService.insertMsg(p_id,score,level);return "插入成绩:"+new Date();}@PostMapping("deleteMsgByID")public String deleteMsgByID(int id){gradeService.deleteMsgByID(id);return "删除成绩:"+new Date();}@PostMapping("deleteMsgByMap")public String deleteMsgByMap(String key,String value){gradeService.deleteMsgByMap(key,value);return "删除一组成绩:"+new Date();}

Postman 中发起网络请求,传递对应参数,即可完成数据库的相关操作

多数据源操作

dynamic-datasource-spring-boot-starter 是一个基于 Spring Boot 的快速集成多数据源的启动器,框架只做切换数据源这件核心的事情,不限制你的具体操作,切换了数据源可以做任何 CRUD,详细介绍参阅:基础必读(免费) · dynamic-datasource · 看云

在 pom 文件中增加该框架依赖,版本选择参阅(版本记录和选择建议(免费) · dynamic-datasource · 看云):

<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.2</version>
</dependency>

yml 文件配置数据库信息:

spring:datasource:dynamic:primary: db1 #设置默认的数据源或者数据源组,默认值即为masterstrict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源datasource:db1:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://192.168.22.82:3306/order_db_1?useUnicode=true&useSSL=falseusername: rootpassword: 123456db2:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://192.168.22.82:3306/order_db_2?useUnicode=true&useSSL=falseusername: rootpassword: 123456

定义数据库实体:

package com.zdxlz.lwq.enity;import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;import java.math.BigDecimal;
import java.util.Date;@TableName("t_order_1")
public class Order {@TableIdprivate BigDecimal order_id;@TableField("price")private int price;@TableField("user_id")private int user_id;@TableField("status")private String status;@TableField("create_date")private Date create_date;public BigDecimal getOrder_id() {return order_id;}public void setOrder_id(BigDecimal order_id) {this.order_id = order_id;}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}public int getUser_id() {return user_id;}public void setUser_id(int user_id) {this.user_id = user_id;}public String getStatus() {return status;}public void setStatus(String status) {this.status = status;}public Date getCreate_date() {return create_date;}public void setCreate_date(Date create_date) {this.create_date = create_date;}
}

创建 Mapper:

package com.zdxlz.lwq.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zdxlz.lwq.enity.Order;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface OrderMapper extends BaseMapper<Order> {}

创建 Service:

package com.zdxlz.lwq.service;import com.baomidou.dynamic.datasource.annotation.DS;
import com.zdxlz.lwq.enity.Order;
import com.zdxlz.lwq.mapper.OrderMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.math.BigDecimal;
import java.util.Date;
import java.util.Random;@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;//插入默认数据源public void insertDB1(int price,int user_id){Order order=new Order();BigDecimal order_id=new BigDecimal(new Random().nextInt(999999));order.setOrder_id(order_id);order.setPrice(price);order.setUser_id(user_id);order.setStatus("SUCCESS");order.setCreate_date(new Date());orderMapper.insert(order);}//插入 DB2@DS("db2")public void insertDB2(int price,int user_id){Order order=new Order();BigDecimal order_id=new BigDecimal(new Random().nextInt(999999));order.setOrder_id(order_id);order.setPrice(price);order.setUser_id(user_id);order.setStatus("SUCCESS");order.setCreate_date(new Date());orderMapper.insert(order);}}

注解说明:自定义方法未添加 @DS 注解,操作默认数据源,添加 @DS 注解,将操作指定数据源,详见:基础必读(免费) · dynamic-datasource · 看云

Controller 操作数据库:

   @Autowiredprivate OrderService orderService;@PostMapping("insertDB1")public String insertDB1(int price,int user_id){orderService.insertDB1(price,user_id);return "插入默认数据库DB1:"+new Date();}@PostMapping("insertDB2")public String insertDB2(int price,int user_id){orderService.insertDB2(price,user_id);return "插入数据库DB2:"+new Date();}

测试验证:

使用 Postman 分别发起请求 insertDB1、insertDB2,请求完成后使用 MySQL 可视化工具,分别查看两个数据库的插入情况

开源项目地址:GitHub - liuweiqiang2016/SpringBootDemo: SpringBoot 框架入门学习

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/175102.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

训练 CNN 对 CIFAR-10 数据中的图像进行分类

1. 加载 CIFAR-10 数据库 import keras from keras.datasets import cifar10# 加载预先处理的训练数据和测试数据 (x_train, y_train), (x_test, y_test) cifar10.load_data() 2. 可视化前 24 个训练图像 import numpy as np import matplotlib.pyplot as plt %matplotlib …

leetcode:506. 相对名次

一、题目 函数原型&#xff1a;char** findRelativeRanks(int* score, int scoreSize, int* returnSize) 二、思路 创建一个新的数组newscore&#xff0c;将原数组数据拷贝到新数组&#xff0c;降序排序新数组。 遍历原数组&#xff0c;在新数组中找到原数组中数据在新数组中的…

优雅使用docker-compose部署Skywalking

Skywalking使用docker-compose部署 version: 3.1 services: // 部署elasetic search 用于存储获取的应用信息与日志elasticsearch:image: elasticsearch:7.13.3container_name: elasticsearchprivileged: trueenvironment:- "cluster.nameelasticsearch" #设置集群名…

算法通关村第十二关-黄金挑战字符串冲刺题

最长公共前缀 描述 : 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 题目 : LeetCode 14.最长公共前缀 : 分析 : 第一种方式&#xff0c;我们可以竖着比较&#xff0c;如图所示&#xff0c;每前进一个位置就…

【论文解读】基于生成式面部先验的真实世界盲脸修复

论文地址&#xff1a;https://arxiv.org/pdf/2101.04061.pdf 代码地址&#xff1a;https://github.com/TencentARC/GFPGAN 图片解释&#xff1a; 与最先进的面部修复方法的比较&#xff1a;HiFaceGAN [67]、DFDNet [44]、Wan 等人。[61] 和 PULSE [52] 在真实世界的低质量图像…

CocosCreator 之 Tween缓动系统的使用

版本&#xff1a; 3.4.0 语言&#xff1a; TypeScript 环境&#xff1a; Mac 简介 在CocosCreator 3.x版本后&#xff0c; Tween缓动系统代替了原有的Action动作。官方使用缓动系统的主要目的之一是用于解决离线动画无法满足需求时的动态动画问题。 简单的示例&#xff1a; …

Java—学生信息管理系统(简单、详细)

文章目录 一、主界面展示二、学生类三、系统功能方法3.1 main()方法3.2 添加学生信息3.3 删除学生信息3.4 修改学生信息3.5 查看所有学生信息 四、完整代码4.1 Student .Java4.2 StudentManger.Java 前言&#xff1a;本案例在实现时使用了Java语言中的ArrayList集合来储存数据。…

【【Linux下的Petallinux 以及其他的配置】】

Linux下的Petallinux 以及其他的配置 sudo apt-get install iproute2 gawk python3 python build-essential gcc git make net-tools libncurses5-dev tftpd zlib1g-dev libssl-dev flex bison libselinux1 gnupg wget git-core diffstat chrpath socat xterm autoconf libtoo…

HarmonyOS 位置服务开发指南

位置服务开发概述 移动终端设备已经深入人们日常生活的方方面面&#xff0c;如查看所在城市的天气、新闻轶事、出行打车、旅行导航、运动记录。这些习以为常的活动&#xff0c;都离不开定位用户终端设备的位置。 当用户处于这些丰富的使用场景中时&#xff0c;系统的位置能力…

三丶openlayer之source和layer

1.source和layer的概念 在前面的例子中&#xff0c;已经对Source和Layer有所了解了&#xff0c;我们用天地图为底图加载出来东西&#xff0c;但是这个世界上的地图不仅仅是有天地图一种类型&#xff0c;比如Google地图&#xff0c;高德地图&#xff0c;百度地图等&#xff0c;…

针对MAC上,面对8080端口被占用怎么解决

首先输入这个命令&#xff0c;在终端&#xff0c;这个是搜查命令&#xff0c;搜查当前8080端口被谁占着 sudo lsof -i :8080 杀死当前的进程 kill -9 1821 kill -9 (上面写着的PID)

SQL注入-数据库基础/SQL语法

目录 一&#xff0c;数据库概述 1.1 数据库 1.2 了解 ACID 理论 1.3 识别数据库 二&#xff0c;SQL 语法基础 三&#xff0c;SQL语句实例 3.1 SQL基础语句 3.2 SQL高级语句 四&#xff0c;基于SQL注入理解语法/函数 4.1 语法 4.2 函数 五&#xff0c;目录数据库info…

C++之算术生成算法

C之算术生成算法 accumulate #include<iostream> using namespace std; #include<vector> #include<numeric>void test() {vector<int> v;for (int i 0; i < 10; i){v.push_back(i);}int total accumulate(v.begin(), v.end(),0);cout << t…

车规激光雷达再商用车前装市场的应用

1、商用车需要什么样的激光雷达 2、如何实现车规级&#xff08;商用车&#xff09;的激光雷达 3、激光雷达安装部署方案

【源码】医院安全(不良)事件管理系统,11种不良事件类型,覆盖全院全部科室及所有可能发生的不良事件

医疗不良事件报告系统旨在建立全面的、统一的医疗不良事件标准分类系统和患者安全术语&#xff0c;使不良事件上报管理更加标准化和科学化。 通过借鉴国内外医疗不良事件报告系统的先进经验&#xff0c;根据医疗不良事件的事件类型、处理事件的不同部门&#xff0c;灵活设置上报…

【我的创作纪念日】

机缘 大家好&#xff0c;我是圥忈ゼ&#xff0c; 2023 年 07 月 20 日&#xff0c;我撰写了第 1 篇技术博客&#xff1a;《我的编程未来规划》&#xff0c;也是由于我高考后的专业选择&#xff0c;和就业方向的选择&#xff0c;加上想立志成为一名专业 IT 作者&#xff0c;我结…

蓝桥杯每日一题2023.11.26

题目描述 奖券数目 - 蓝桥云课 (lanqiao.cn) 将每一个数字进行一一枚举&#xff0c;如果检查时不带有数字4则答案可以加1 #include<bits/stdc.h> using namespace std; int ans; bool check(int n) {while(n){if(n % 10 4)return false;n / 10; }return true; } int m…

京东秒杀之秒杀详情

1 编写前端页面&#xff08;商品详情&#xff09; <!DOCTYPE html> <head><title>商品详情</title><meta http-equiv"Content-Type" content"text/html; charsetUTF-8" /><script type"text/javascript" src&…

drool 7 multiThread 测试

基本信息 通过option &#xff0c;使用如下代码进行设置 //线程数量10MaxThreadsOption optionMaxThreadsOption.get(10);kieBaseConf.setOption(option);kieBaseConf.setOption(MultithreadEvaluationOption.YES);并发是以CompositeDefaultAgenda/Rule为颗粒度来的&#xff0…

世微AP5125 DC-DC降压恒流 LED车灯电源驱动IC SOT23-6

产品描述 AP5125 是一款外围电路简单的 Buck 型平均电流检测模式的 LED 恒流驱动器&#xff0c;适用于 8-100V 电压范围的非隔离式大功率恒流 LED 驱动领域。芯片采用固定频率 140kHz 的 PWM 工作模式&#xff0c; 利用平均电流检测模式&#xff0c;因此具有优异的负载调整 率…