Mybatisplus学习

MybatisPlus官方文档
飞书笔记文档

目标:

  • 能利用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;
}

业务中一般会将一些分页条件、排序条件封装到传输类里面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值