目标:
- 能利用MybatisPlus实现基本的CRUD
- 会使用条件构建造器构建查询和更新语句
- 会使用MybatisPlus中的常用注解
- 知道MP的代码生成插件使用
- 会开启逻辑删除配置
- 会使用MybatisPlus处理枚举、JSON类型字段
- 了解配置加密
- 会使用MybatisPlus实现分页
1. crud
lambda用法
MybatisPlus中的Service中调用的是lambdaQuery()
和lambdaUpdate()
方法。Mapper中调用的是lambdaQueryWrapper
以及lambdaUpdateWrapper
2. 插件
核心插件MybatisPlusIntercepter
MybatisPlus提供了一系列的插件来增强Mybatis的功能,这些插件主要通过MybatisPlusIntercepter
来实现对Mybatis执行过程的拦截和增强。
属性
MybatisPlusInterceptor
有一个关键属性 interceptors
,它是一个 List<InnerInterceptor>
类型的集合,用于存储所有要应用的内部拦截器。
所有 MyBatis-Plus 提供的插件都实现了InnerInterceptor
接口,这个接口定义了插件的基本行为。目前,MyBatis-Plus 提供了以下插件:
- 自动分页: PaginationInnerInterceptor
- 多租户: TenantLineInnerInterceptor
- 动态表名: DynamicTableNameInnerInterceptor
- 乐观锁: OptimisticLockerInnerInterceptor
- SQL 性能规范: IllegalSQLInnerInterceptor
- 防止全表更新与删除: BlockAttackInnerInterceptor
Spring Boot 配置
在 Spring Boot 项目中,你可以通过 Java 配置来添加插件:
@Configuration
@MapperScan("scan.your.mapper.package")
public class MybatisPlusConfig {
/**
* 添加分页插件
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
// 初始化核心插件
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 添加分页插件PaginationInnerInterceptor
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.Mysql));
return interceptor;
}
}
分页插件
MyBatis-Plus 的分页插件 PaginationInnerInterceptor
提供了强大的分页功能,支持多种数据库,使得分页查询变得简单高效。
分页流程:1、配置分页插件 2、编写分页业务代码
配置方法
在 Spring Boot 项目中,你可以通过 Java 配置来添加分页插件:
@Configuration
@MapperScan("scan.your.mapper.package")
public class MybatisPlusConfig {
/**
* 添加分页插件
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多个插件, 切记分页最后添加
// 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbType
return interceptor;
}
}
实现分页业务代码
// 添加分页参数
Page<User> page = page.of(pageNo,pageSize);
// 添加排序参数,升序排序
page.addorder(new OrderItem("balance",true));
// 分页查询
Page<User> p = userService.page(page);
// 解析
System.out.println("total="+p.getTotal());
System.out.println("total="+p.getPages());
List<User> users = p.getRecords();
users.foreach(System.out::println);
实际开发
实际开发中一般会将分页参数单独封装起来,其他类想使用时直接继承这个分页参数类。
以下是实际开发中的条件分页代码
// 在service层写分页查询
public PageDTO<UserVO> queryUserPage(UserQuery query) {
// 1.构建分页条件
Page<User> page= page.of(query.getPageNO(),query.getPageSize());
// 2.排序条件为空则默认更新时间排序,不为空则按照给定字段排序
if (StrUtil.isNotBlank(query.getSortBy())){
page.addOrder(new OrderItem(query.getSortBy(),query.getIsAsc()));
}else{
page.addOrder(new OrderItem("update_time",false));
}
// 3. 条件分页查询
Page<User> p = lamdaQuery()
.like(query.getName() != null, User:getUserName(), query.getName())
.eq(query.getStatus != null, User:getUserStatus, query.getStatus)
.page(page);
// 4. 封装VO结果
PageDTO<UserVO> dto = new PageDTO<>();
dto.setTotal(p.getTotal());
dto.setPages(p.getPages());
List<User> records = p.getRecords();
if (CollUtil.isEmpty(records)) {
dto.set(Collections.emptyList());
return dto;
}
// 拷贝User的VO
dto.setList(BeanUtil.copyToList(records,UserVO.class));
retrun dto;
}
业务中一般会将一些分页条件、排序条件封装到传输类里面