MyBatis-Plus 常用插件

文章目录

    • MyBatis-Plus 常用插件
      • 一、MyBatis 插件
      • 二、MyBatis-Plus 插件
        • 1. 分页插件
        • 2. 防止全表更新与删除插件
        • 3. 乐观锁插件

MyBatis-Plus 常用插件

一、MyBatis 插件

​ MyBatis插件就是对 Executor、StatementHandler、 ParameterHandler、ResultSetHandler 这四个接口上的方法进行拦截,利用JDK 动态代理机制,为这些接口的实现类创建代理对象, 在执行方法时,先去执行代理对象的方法,从而执行自己编写的拦截逻辑。

  • Executor

    MyBatis 的内部执行器,它负责调用 StatementHandler 操作数据库,并把结果集通过 ResultSetHandler 进行自动映射

  • StatementHandler

    MyBatis 直接让数据库执行 SQL 脚本的对象。

  • ParameterHandler

    MyBatis 实现 SQL 入参设置的对象。

  • ResultSetHandler

    MyBatis 把 ResultSet 集合映射成 POJO 的接口对象。

二、MyBatis-Plus 插件

​ MyBatis-Plus 依据 MyBatis 插件机制,为我们提供了一些开发中常用的插件,我们在开发中使用即可。常用插件如下:

  • 自动分页插件:PaginationInnerInterceptor
  • 防止全表更新与删除插件:BlockAttackInnerInterceptor
  • 乐观锁插件:OptimisticLockerInnerInterceptor

​ 这些插件都实现了 InnerInterceptor 接口

1. 分页插件

​ MyBatis-Plus 自带的分页插件,即为 BaseMapper 接口中的 selectPage() 方法,简单的配置就可以实现分页功能。

(1)首先需要在配置类或启动类中配置分页插件:

/**
 * MybatisPlus 配置类
 * 功能:加载分页插件
 */
@Configuration
public class MybatisPlusConfig {
    
    /**
     * 分页插件
     * @return 分页插件bean
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //分页插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

(2)测试分页查询

@Test
public void testPageSelect(){
    //创建分页条件,参数为当前页的页码(current)、每页显示的条数(size),
    Page<Student> page = new Page<>(1,3);
    //分页查询,参数有两个,第一个是Page类型的(分页对象),第二个是queryWapper类型的。
    IPage<Student> iPage = studentMapper.selectPage(page, null);
    // 打印分页数据
    System.out.println("结果集:"+iPage.getRecords());
    System.out.println("总页数:"+iPage.getPages());
    System.out.println("总条数:"+iPage.getTotal());
    System.out.println("当前页:"+iPage.getCurrent());
    System.out.println("每页条数:"+iPage.getSize());
}
2. 防止全表更新与删除插件

作用:分析删除/更新语句,防止小白或者恶意进行删除/更新全表操作。

注意:

  • 该插件只支持 MySQL5.6.3 以上版本
  • 该插件只建议在开发环境中使用,不建议在生产环境使用

在 MybatisPlus 配置类里面配置防止全表更新与删除插件

//防止全表更新与删除插件
interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());

在检测出来有全表更新或者删除的操作,MybatisPlus 会在服务启动时报异常。

3. 乐观锁插件

修改数据库中的数据时,为了避免同时被其他人修改,最好的办法就是对该数据进行加锁以防止并发。

锁的设计分为悲观锁和乐观锁:

  • 悲观锁:悲观锁对数据被外界修改持保守态度。即在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现往往依靠数据库提供的锁机制。

MyBatis-Plus 常用插件_第1张图片

  • 乐观锁:乐观锁在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果冲突,则返回给用户异常信息,让用户决定如何去做。

MyBatis-Plus 常用插件_第2张图片

MyBatisPlus 乐观锁插件实现方式:

  • 取出记录时,获取当前version
  • 更新时,带上这个version
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果version不对,就更新失败

使用 MyBatisPlus 乐观锁插件的步骤:

(1)首先还是在 MybatisPlus 配置类里面配置乐观锁插件

// 乐观锁插件
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());

(2)修改实体类,添加 version 列并在该属性上面增加 @Version 注解

@Version
private Integer version;

(3)修改数据库表,添加一列整型 version 字段并设置默认值为 0

(4)测试乐观锁插件

@Test
public void testUpdate(){
    Student student = Student.builder().id(1).name("李华").version(0).build();
    //如果版本号和数据库一致更新成功,版本号+1,如果不一致更新失败
    studentMapper.updateById(student);
}

你可能感兴趣的:(mybatis,java,数据库)