SpringBoot整合MyBatis-Plus
一、简介
MyBatis-Plus(MP)是一个MyBatis的增强工具,在MyBatis的基础上进行增强。简化开发,提高效率。
优点:拥有无侵入、损耗小、强大的 CRUD 操作、支持 Lambda 形式调用、支持主键自动生成等一些特性。
二、如何使用
展示一下项目结构:
1、首先创建一个简单的数据库表和插入几条数据
CREATE TABLE Student
(
id INT(20) NOT NULL COMMENT '主键ID',
NAME VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
address VARCHAR(30) NULL DEFAULT NULL COMMENT '地址',
PRIMARY KEY (id)
);
INSERT INTO student (id, NAME, age, address) VALUES
(1, '张三', 18, '武汉'),
(2, '李四', 20, '北京'),
(3, '王五', 28, '上海');
2、创建一个SpringBoot项目并在pom.xml里面添加以下依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- mybatisPlus 核心库 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<!--devtools热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
<scope>true</scope>
</dependency>
</dependencies>
3、application.yml配置文件如下
# 端口
server:
port: 8081
# 配置数据源
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatisplus?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=true&allowMultiQueries=true&serverTimezone=Asia/Hong_Kong
username: root
password: 123456
# mybatis-plus相关配置
mybatis-plus:
mapper-locations:
- classpath:mapper/*.xml
4、开始写代码
domain层:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student{
private Integer id;
private String name;
private Integer age;
private String address;
}
dao层:
(查询数据库所有的数据)
@Mapper
public interface StudentDao{
List<Student> selectFind();
}
xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "http://mybatis.org/dtd/mybatis-3-mapper.dtd" "mybatis-3-mapper.dtd" >
<mapper namespace="com.wuheng.dao.StudentDao">
<select id="selectFind" resultType="com.wuheng.domain.Student">
select * from student;
</select>
</mapper>
service层
public interface StudentService {
List<Student> selectFind();
}
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
StudentDao StudentDao;
@Override
public List<Student> selectFind() {
return StudentDao.selectFind();
}
}
controller层
@RestController
@RequestMapping("/student")
public class StudentController {
@Autowired
StudentService studentService;
@RequestMapping("/find")
public List<Student> findAll(){
return studentService.selectFind();
}
}
完成上面之后启动项目然后访问localhost:8081/student/find如图所示则表示成功。
以上属于牛刀小试,基础的整合和mybatis的一样。以下就是真正开始应用MyBatis-Plus了。MyBatis-Plus拥有很多核心功能和许多插件扩展。接下来我一一介绍。
核心功能:
1、代码生成器(可以快速生成Entity、Mapper、XML、Service、Controller的代码,提升了开发效率)
首先需要添加依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.2</version>
</dependency>
具体的代码我就不展示出来了,官网上有,需要注意的就是要修改数据库配置和一些生成包的配置,然后直接运行就可以生成这些代码了。
2、CRUD接口(MyBatis-Plus提供了一些增删改查的方法,只需要继承一个接口就可以使用里面的方法)
Mapper CRUD就需要继承BaseMapper<T>接口,T代表实体类对象;
Service CRUD就需要继承ServiceImpl<M, T>,M代表自己创建的Mapper,T代表实体类对象;
3、条件构造器(QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper) 的父类
用于生成 sql 的 where 条件, entity 属性也用于生成 sql 的 where 条件)
4、分页插件(通过MyBatis-Plus可以快速的进行分页)
首先编写配置类:
@Configuration
@EnableTransactionManagement
@MapperScan("com.wuheng.dao")
public class MyBatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
然后就是日常的操作了:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "http://mybatis.org/dtd/mybatis-3-mapper.dtd" "mybatis-3-mapper.dtd" >
<mapper namespace="com.wuheng.dao.StudentDao">
<select id="findPage" resultType="com.wuheng.domain.Student">
select * from student;
</select>
</mapper>
@Mapper
public interface StudentDao extends BaseMapper<Student>{
IPage<Student> findPage(Page page);
}
public interface StudentService {
IPage<Student> findPage(Page<Student> page);
}
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
StudentDao studentDao;
@Override
@DS("master")
public IPage<Student> findPage(Page<Student> page) {
return studentDao.findPage(page);
}
}
@RestController
@RequestMapping("/student")
public class StudentController {
@Autowired
StudentService studentService;
/*
* Page中参数有current代表当前页;size代表每页显示的条数
*/
@RequestMapping("/listPage")
public IPage<Student> listPage(Integer current,Integer size){
Page<Student> page=new Page<Student>(current,size);
IPage<Student> findPage = studentService.findPage(page);
return findPage;
}
}
最后启动项目。传入current=1,size=2。结果如图所示:
MyBatis-Plus分页的sql语句不需要写limit参数,只需要查询所有的数据,然后分页的事情完全交给MyBatis-Plus,达到快速的分页。
5、多数据源(主要适用于多种场景:纯粹多库、读写分离、一主多从、混合模式)
添加依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>2.5.4</version>
</dependency>
在application.yml里面配置多数据源:
#配置多数据源
spring:
datasource:
dynamic:
primary: master
strict: false //默认是false,配置为true当不表明数据源的时候会抛出异常,不启动则为默认是master数据源
datasource:
master: //主数据库
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=true&allowMultiQueries=true&serverTimezone=Asia/Hong_Kong
username: root
password: 000000
driver-class-name: com.mysql.jdbc.Driver
slavel_1: //从数据库
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=true&allowMultiQueries=true&serverTimezone=Asia/Hong_Kong
username: root
password: 000000
driver-class-name: com.mysql.jdbc.Driver
注解使用:
@Ds:这个注解用来切换数据源。作用在方法和类上,同时存在方法注解优先于类上注解。(建议在service上使用此注解)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "http://mybatis.org/dtd/mybatis-3-mapper.dtd" "mybatis-3-mapper.dtd" >
<mapper namespace="com.wuheng.dao.StudentDao">
<select id="findAll" resultType="com.wuheng.domain.Student">
select * from student;
</select>
</mapper>
@Mapper
public interface StudentDao{
List<Student> findAll();
}
public interface StudentService {
List<Student> findAll01();
List<Student> findAll02();
}
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
StudentDao studentDao;
@Override
@DS("master")
public List<Student> findAll01() {
return studentDao.findAll();
}
@Override
@DS("slavel_1")
public List<Student> findAll02() {
return studentDao.findAll();
}
}
@RestController
@RequestMapping("/student")
public class StudentController {
@Autowired
StudentService studentService;
@RequestMapping("/find01")
public List<Student> find01(){
return studentService.findAll01();
}
@RequestMapping("/find02")
public List<Student> find02(){
return studentService.findAll02();
}
}
启动项目分别访问 /student/find01 和 /student/find02显示的结果分别是不同数据库的数据。
6、逻辑删除(逻辑删除与物理删除概念上有很大区别。逻辑删除是指不是真正的删除数据库里面的数据,目的是为了方便数据恢复和保护数据;物理删除就是真正的使用 delete from 表名 where … 对数据库数据进行删除,是根本性的,不可恢复的)
配置参数:
mybatis-plus:
global-config:
db-config:
logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
在实体类字段上加上@TableLogic
@TableLogic
private Integer flag;
在删除的时候不是写删除语句而是更新
删除: update student set flag=1 where id = 1 and flag=0
查找: select id,name,age,address,flag from user where flag=0
注意在逻辑删除的时候要把初始的flag值也要拼接在sql语句后面,这样子做是为了保证两个人或多个人同时逻辑删除的时候只有一个人会成功。
7、乐观锁插件(当需要去更新一条记录的时候,希望这条记录没有被别人更新)
实现方式:
获取当前数据的version;
更新当前数据的时候带上version;
执行更新时,set version=newversion where version=oldversion
如果version不对,就更新失败
配置方式:
插件配置,编写配置类
@Configuration
public class OptimisticLockerConfig {
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
在实体类字段上面加上@Version
@Version
private Integer version;
以上就是MyBatis-Plus一些常用的功能。还有一些扩展还没介绍,后续慢慢补充!谢谢。