一、简介
MyBatis-Plus官网:MyBatis-Plus 🚀 为简化开发而生
MyBatis-Plus是一种基于MyBatis框架的强大持久层增强工具,它在MyBatis的基础上提供了许多便捷的功能和增强的特性,用于简化开发。它是一个开源项目,可以与MyBatis无缝集成。
MyBatis-Plus提供了以下主要功能和特性:
- 简化CRUD操作:提供了通用的Mapper接口和通用的Service接口,通过继承这些接口可以省去大量的编码工作。
- 代码生成器:可以根据数据库表结构自动生成实体类、Mapper接口和XML映射文件,减少手动编写重复代码的工作量。
- 条件构造器:提供了方便灵活的条件查询封装,可以通过链式调用的方式构建查询条件。
- 分页插件:提供了简单易用的分页查询功能,支持多种数据库。
- 乐观锁插件:为数据库的乐观锁机制提供了便捷的支持。
- 自动填充插件:为实体类的字段自动填充值。
- SQL注入器:可以自定义SQL注入方法,增强SQL的灵活性。
总之,MyBatis-Plus是一个功能强大的持久层增强工具,可以大大简化开发,提高开发效率。
二、SpringBoot集成MyBatis-Plus
1.导入依赖包
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.7</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency>
2.编写配置文件
spring:#配置数据源datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/maven?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useUnicode=true&useSSL=falseusername: rootpassword: 123456
mybatis-plus:configuration:#开启驼峰映射map-underscore-to-camel-case: true#开启日志,方便观察SQL执行语句log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
3.使用注解标识实体类
@TableName(value = "student")//对应数据库表名
@TableId(type = IdType.AUTO)//对应数据库主键,并设置类型为自增
@TableField(value = "id") //对应数据库字段名
@TableField(exist = false)//设置表中不存在的字段
@TableLogic(value = "默认值",delval = "删除后默认值")//逻辑删除时用的字段
@Version//作用:在使用 MyBatis-Plus 乐观锁插件时使用
4.
MyBatis-Plus 中用于构建查询条件的方法:
1.eq
用于设置单个字段的相等条件。2.
allEq
通过一个Map
来设置多个字段的相等条件3.
ne
设置单个字段的不相等条件。4.
gt
设置单个字段的大于条件。5.
ge
设置单个字段的大于等于条件。6.
lt
设置单个字段的小于条件。7.
le
设置单个字段的小于等于条件。8.
between
设置单个字段的 BETWEEN 条件。9.
notBetween
设置单个字段的 NOT BETWEEN 条件。
10.like
设置单个字段的 LIKE 条件。
三、分页实现
1.首先设置分页拦截器作为Spring管理的Bean
package com.apesource.spring_mybatis_plus_01.config;import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author 崔世博* @version 1.0* @since 2024/9/20*/
@Configuration
public class PageConfig {//注入mp拦截器@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {//1.实例化拦截器MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();//2.添加分页拦截器mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());return mybatisPlusInterceptor;}
}
2.Junit测试
(1)查找第一页前三条数据
对应SQL语句:
SELECT stu_id,stu_name,nick_name,stu_age,is_delete FROM student WHERE is_delete=0 LIMIT 3
@Testpublic void show6() {//分页Page<Student> page = new Page<Student>();//1.定义分页规则page.setSize(3); //页面容量page.setCurrent(1); //当前页码Page<Student> studentPage = studentMapper.selectPage(page, null);//分页结果List<Student> list = studentPage.getRecords();System.out.println("总页数:" + studentPage.getPages());System.out.println("总记录数:" + studentPage.getTotal());list.forEach(System.out::println);}
(2)使用QueryWrapper
专门用于构造查询条件,支持基本的等于、不等于、大于、小于等各种常见操作。它允许你以链式调用的方式添加多个查询条件,并且可以组合使用 and
和 or
逻辑。
例子:
找出student表中年龄等于20,分页显示第一页的三条数据
对应SQL语句:
SELECT stu_id,stu_name,nick_name,stu_age,is_delete FROM student WHERE is_delete=0 AND (stu_age = 20) LIMIT 3
@Testpublic void show6() {//分页Page<Student> page = new Page<Student>();//1.定义分页规则page.setSize(3); //页面容量page.setCurrent(1); //当前页码//查询条件(选填)QueryWrapper<Student> qr = new QueryWrapper<Student>();qr.eq("stu_age", 20);Page<Student> studentPage = studentMapper.selectPage(page, qr);//分页结果List<Student> list = studentPage.getRecords();System.out.println("总页数:" + studentPage.getPages());System.out.println("总记录数:" + studentPage.getTotal());list.forEach(System.out::println);}
(3)LambdaQueryWrapper:
这是一个基于 Lambda 表达式的查询条件构造器,它通过 Lambda 表达式来引用实体类的属性,从而避免了硬编码字段名。这种方式提高了代码的可读性和可维护性,尤其是在字段名可能发生变化的情况下。
例子:
找出student表中年龄等于20,分页显示第一页的三条数据
对应SQL语句:
SELECT stu_id,stu_name,nick_name,stu_age,is_delete FROM student WHERE is_delete=0 AND (stu_age > 18) LIMIT 3
@Testpublic void show6() {//分页Page<Student> page = new Page<Student>();//1.定义分页规则page.setSize(3); //页面容量page.setCurrent(1); //当前页码LambdaQueryWrapper<Student> lambdaQueryWrapper = new LambdaQueryWrapper<>();lambdaQueryWrapper.gt(Student::getStuAge, 18);Page<Student> studentPage = studentMapper.selectPage(page, lambdaQueryWrapper);//分页结果List<Student> list = studentPage.getRecords();System.out.println("总页数:" + studentPage.getPages());System.out.println("总记录数:" + studentPage.getTotal());list.forEach(System.out::println);}