开发环境配置
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 {
@TableId
private 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.Driver
url: jdbc:mysql://192.168.22.82:3306/my_db?useUnicode=true&useSSL=false
username: root
password: 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 {
@Autowired
GradeMapper 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 中的自定义方法中操作数据库,代码如下:
@Autowired
private 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 #设置默认的数据源或者数据源组,默认值即为master
strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
datasource:
db1:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.22.82:3306/order_db_1?useUnicode=true&useSSL=false
username: root
password: 123456
db2:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.22.82:3306/order_db_2?useUnicode=true&useSSL=false
username: root
password: 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 {
@TableId
private 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 {
@Autowired
private 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 操作数据库:
@Autowired
private 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 框架入门学习