• MyBatis-Plus插件


    插件机制

    • MyBatis允许你在已映射语句执行过程中的某一点进行拦截调用。 默认情况下, MyBatis允许使用插件来拦截的方法调用包括
      1. Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
      2. ParameterHandler (getParameterObject, setParameters)
      3. ResultSetHandler (handleResultSets, handleOutputParameters)
      4. StatementHandler (prepare, parameterize, batch, update, query)
    • 总体概括为
      拦截执行器的方法
      拦截参数的处理
      拦截结果的处理
      拦截Sql语法构建的处理

    • MyInterceptor.class
    package com.ssc.mp.plugins;
    
    import org.apache.ibatis.executor.Executor;
    import org.apache.ibatis.mapping.MappedStatement;
    import org.apache.ibatis.plugin.*;
    
    import java.util.Properties;
    
    
    /**
     * @ClassName MyInterceptor
     * @Description TODO
     * @Authoc 孙少聪
     * @Date 2022/6/30 19:42:59
     */
    
    @Intercepts({@Signature(
            type= Executor.class,
            method = "update",
            args = {MappedStatement.class,Object.class})})
    public class MyInterceptor implements Interceptor {
        @Override
        public Object intercept(Invocation invocation) throws Throwable {
            //拦截方法,具体业务逻辑编写的位置
            return invocation.proceed();
        }
    
        @Override
        public Object plugin(Object target) {
            //创建target对象的代理对象,目的是将当前拦截器加入到该对象中
            return Plugin.wrap(target, this);
        }
    
        @Override
        public void setProperties(Properties properties) {
            //属性设置
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 有拦截的方法是update
    @Intercepts({@Signature(
            type= Executor.class,
            method = "update",
            args = {MappedStatement.class,Object.class})})
    
    • 1
    • 2
    • 3
    • 4
    • 会执行四次plugin是因为可以拦截的点有四个阶段。

    执行分析插件

    • 在Mybatis-Plus中提供了SQL执行的分析的插件,可作用于全表的更新,删除的操作。注意:该插件仅适用于开发环境不适用于生产环境
    • 防止一些误操作

    • Spring Boot 配置
    @Configuration
    @MapperScan("com.ssc.mp.mapper") //设置mapper接口的扫描包
    public class MybatisPlusConfig {
        /**
         * SQL分析插件
         */
        @Bean
        public SqlExplainInterceptor sqlExplainInterceptor(){
            SqlExplainInterceptor sqlExplainInterceptor = new SqlExplainInterceptor();
    
            List<ISqlParser> list = new ArrayList<>();
            list.add(new BlockAttackSqlParser()); // 全表更新或者删除的组短期
            sqlExplainInterceptor.setSqlParserList(list);
    
            return sqlExplainInterceptor;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 测试类,全表更新是会被禁止,直接抛出异常
        @Test
        public void testUpadateAll(){
            User user = new User();
            user.setName("刘备"); // 更新数据
    
            boolean result = user.update(null); //全表更新
            System.out.println(result);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    性能分析插件

    • 分析SQL执行时间
    • 格式化SQL语句

    • mybatis自定义配置
    <plugins>
        <!--性能分析插件-->
        <plugin interceptor="com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor">
            <!--最大执行时间,单位为毫秒-->
            <property name="maxTime" value="1000"/>
            <!--输出的sql坐格式化,默认为false-->
            <property name="format" value="true"/>
        </plugin>
    </plugins>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    乐观锁插件

    适用

    • 当更新一条记录时,希望这条记录没有被别人更新
    • 乐观锁实现方式
      去除记录时,获取当前version
      更新时,带上这个version
      执行更新时,set version = newVersion where version = oldVersion
      如果version不对,就更新失败

    插件配置

    • xml方式
    <plugin interceptor="com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor"></plugin>
    
    • 1
    • 配置文件方式
        @Bean
        public OptimisticLockerInterceptor optimisticLockerInterceptor() {
            return new OptimisticLockerInterceptor();
        }
    
    • 1
    • 2
    • 3
    • 4

    插件测试

    • 在实体类和表中加入version字段并加入注解
    // 乐观锁的版本字段
        @Version
        private Integer version;
    
    • 1
    • 2
    • 3
    • 测试类
        @Test
        public void testUpdateVersion(){
            User user = new User();
            user.setId(2L); // 更新数据
            user.setAge(31);
            user.setVersion(1); // 当前版本信息
            boolean result = user.updateById();
            System.out.println(result);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • SQL语句
    Execute SQL:
        UPDATE
            tb_user 
        SET
            age=31,
            version=2 
        WHERE
            id=2 
            AND version=1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    注意事项

    • 支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
    • 整数类型下 newVersion = oldVersion + 1
    • newVersion 会回写到 entity 中
    • 仅支持 updateById(id) 与 update(entity, wrapper) 方法
    • 在 update(entity, wrapper) 方法下, wrapper不能和其他逻辑复用
  • 相关阅读:
    Linux C语言开发-D5常量
    数组:移除元素
    高精度数字源表覆盖12+专业领域,20+研究方向
    Linux防火的常用命令
    LIO-SAM
    【附源码】计算机毕业设计SSM网上挂号系统
    行业洞察 | 爱聊天的虚拟人
    Windows|MySql下载与安装教程
    JDK发布信息、历史及未来规划
    一个月速刷leetcodeHOT100 day13 二叉树结构 以及相关简单题
  • 原文地址:https://blog.csdn.net/qq_44808710/article/details/125543813