MyBatis-Plus篇-(五)插件扩展

五、插件扩展

Mybatis 插件机制简介

Mybatis 插件机制简介

分页插件

com.baomidou.mybatisplus.plugins.PaginationInterceptor

说明:此分页不同于之前的分页查询,之气的分页查询是基于内存的分页,这个是基于数据库的,sql中带有limit字段

  • 在配置文件中注册分页插件
<bean id="sqlSessionFactoryBean" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
      ...
        
        <property name="plugins">
            <list>
                
                <bean class="com.baomidou.mybatisplus.plugins.PaginationInterceptor">bean>
            list>

        property>
    bean>
  • 使用
@Test
    public void testPage() {
     

        Page<Employee> page = new Page<>(1,1);

        List<Employee > emps =
                employeeMapper.selectPage(page, null);
        System.out.println(emps);


        System.out.println("===============获取分页相关的一些信息======================");

        System.out.println("总条数:" +page.getTotal());
        System.out.println("当前页码: "+  page.getCurrent());
        System.out.println("总页码:" + page.getPages());
        System.out.println("每页显示的条数:" + page.getSize());
        System.out.println("是否有上一页: " + page.hasPrevious());
        System.out.println("是否有下一页: " + page.hasNext());

        //将查询的结果封装到page对象中
        page.setRecords(emps);


    }

MyBatis-Plus篇-(五)插件扩展_第1张图片

执行分析插件

  • com.baomidou.mybatisplus.plugins.SqlExplainInterceptor
  • SQL 执行分析拦截器,只支持 MySQL5.6.3 以上版本
  • 该插件的作用是分析 DELETE UPDATE 语句,防止小白 或者恶意进行 DELETE UPDATE 全表操作
  • 只建议在开发环境中使用,不建议在生产环境使用
  • 在插件的底层 通过 SQL 语句分析命令:Explain 分析当前的 SQL 语句, 根据结果集中的 Extra 列来断定当前是否全表操作
  • 在配置文件中注册插件
<bean id="sqlSessionFactoryBean" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
      ...
        
       
                <bean class="com.baomidou.mybatisplus.plugins.SqlExplainInterceptor">
			
                    <property name="stopProceed" value="true">property>
                bean>
            list>
        property>
    bean>
  • 测试
@Test
    public void testSQLExplain() {
     

        employeeMapper.delete(null);  // 全表删除
    }

MyBatis-Plus篇-(五)插件扩展_第2张图片

说明:注册了插件不一定有用,一定要把stopProceed加上值为true

性能分析插件

  • com.baomidou.mybatisplus.plugins.PerformanceInterceptor
  • 性能分析拦截器,用于输出每条 SQL 语句及其执行时间
  • SQL 性能执行分析,开发环境使用,超过指定时间,停止运行。有助于发现问题
  • 配置文件中注册插件

<bean class="com.baomidou.mybatisplus.plugins.PerformanceInterceptor">
    
    <property name="format" value="true">property>
    
    <property name="maxTime" value="5">property>
bean>
  • 测试(未设置超时时间)
@Test
    public void testPerformance() {
     
        Employee employee = new Employee();
        employee.setLastName("玛利亚老师");
        employee.setEmail("[email protected]");
        employee.setGender("0");
        employee.setAge(22);
        employeeMapper.insert(employee);

    }

MyBatis-Plus篇-(五)插件扩展_第3张图片

  • 测试(设置超时时间为5ms)
    MyBatis-Plus篇-(五)插件扩展_第4张图片

乐观锁插件

  • com.baomidou.mybatisplus.plugins.OptimisticLockerInterceptor
  • 如果想实现如下需求: 当要更新一条记录的时候,希望这条记录没有被别人更新
  • 乐观锁的实现原理:
  • 取出记录时,获取当前 version 2
  • 更新时,带上这个 version 2
  • 执行更新时, set version = yourVersion+1 where version = yourVersion
  • 如果 version 不对,就更新失败
  • @Version 用于注解实体字段,必须要有
  • 配置文件中注册插件

<bean class="com.baomidou.mybatisplus.plugins.OptimisticLockerInterceptor">
bean>
  • 添加version字段加上@Version注解
@Version
private Integer version ;

public Integer getVersion() {
	return version;
}

public void setVersion(Integer version) {
	this.version = version;
}
  • 数据库添加相应的列
    MyBatis-Plus篇-(五)插件扩展_第5张图片

  • 测试(version与数据库中相同)

@Test
    public void testOptimisticLocker() {
     
        //更新操作
        Employee employee = new Employee();
        employee.setId(15);
        employee.setLastName("TomAA");
        employee.setEmail("[email protected]");
        employee.setGender("1");
        employee.setAge(22);
        //与数据库中相同
        employee.setVersion(1);

        employeeMapper.updateById(employee);

    }

MyBatis-Plus篇-(五)插件扩展_第6张图片

  • 测试(version与数据不同)
@Test
    public void testOptimisticLocker() {
        //更新操作
        Employee employee = new Employee();
        employee.setId(15);
        employee.setLastName("cvzhanshi");
        employee.setEmail("[email protected]");
        employee.setGender("1");
        employee.setAge(22);
        //与数据库中不同
        employee.setVersion(1);

        employeeMapper.updateById(employee);

    }

MyBatis-Plus篇-(五)插件扩展_第7张图片

你可能感兴趣的:(SSM,#,MyBatis-Plus)