• MyBatis-Plus实现SQL执行前统一处理添加只读标识等注释


    背景

    由于项目中采用的DRDS数据库,为了实现查询语句在读库上执行,我们需要在sql前拼接/!TDDL:SALVE*/,对于以前的老项目,可以选择在代码里手动拼接的方式,但是对于我们采用了MyBatis-Plus插件的项目再采用xml中每个sql前拼接的方式,显得有那么一些些不和谐。因此我们可以利用MyBatis-Plus官方提供的能力,在sql执行前拦截,然后拼接我们想添加的任何注释内容

    实现

    首先我们需要引入MyBatis-Plus的pom文件,有版本限制,需要大于等于以下版本。
    1、引入pon

            <dependency>
                <groupId>com.baomidougroupId>
                <artifactId>mybatis-plus-boot-starterartifactId>
                <version>3.5.2version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2、自定义MyBatis的拦截器接口org.apache.ibatis.plugin.Interceptor

    @Slf4j
    public class MyBatisPlusSqlAnnotationInterceptor implements InnerInterceptor {
    	// 我们需要添加的注释
        private static final String READ_FLAG = "/!TDDL:SLAVE*/";
    
        // 添加环境变量控制注释是否启用
        private boolean readOnlyFlag;
    
    
        public MyBatisPlusSqlAnnotationInterceptor(boolean readOnlyFlag) {
            this.readOnlyFlag = readOnlyFlag;
        }
    
        @Override
        public void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout) {
                PluginUtils.MPStatementHandler handler = PluginUtils.mpStatementHandler(sh);
                MappedStatement ms = handler.mappedStatement();
                SqlCommandType sct = ms.getSqlCommandType();
                if (sct == SqlCommandType.SELECT && readOnlyFlag) {
                        BoundSql boundSql = handler.boundSql();
                        String sql = boundSql.getSql();
                        sql = READ_FLAG + sql;
                        try {
                            Field field = boundSql.getClass().getDeclaredField("sql");
                            field.setAccessible(true);
                            field.set(boundSql, sql);
                        } catch (NoSuchFieldException e) {
                            log.error("NoSuchFieldException:", e);
                        } catch (IllegalAccessException e) {
                            log.error("IllegalAccessException:", e);
                        }
                    }
        }
    }
    
    • 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

    3、配置MyBatis-Plus配置

    @Configuration
    public class MybatisPlusConfig {
    	// 配置文件控制执行与否
        @Value(value = "${flag.readOnly:true}")
        private boolean flagReadOnly;
    
        /**
         * 内置插件
         */
        @Bean
        public MybatisPlusInterceptor mybatisPlusInterceptor() {
            MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
            interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
            interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
            // 增加我们的自定义插件
            interceptor.addInnerInterceptor(new MyBatisPlusSqlAnnotationInterceptor(flagReadOnly));
            return interceptor;
        }
    
        /**
         * Map下划线自动转驼峰
         */
        @Bean
        public ConfigurationCustomizer configurationCustomizer() {
            return i -> i.setObjectWrapperFactory(new MybatisMapWrapperFactory());
        }
    
    }
    
    • 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

    参考

    https://blog.csdn.net/weixin_42182797/article/details/130530899

  • 相关阅读:
    企业数据安全重要?私有化部署IM,保障信息安全无忧虑!
    PMP_第4章章节试题
    【C++】菱形继承和虚继承
    Layui之动态树
    mobx实战,几分钟入门
    MongoDB索引操作
    springBoot 配置拦截器
    go操作Mysql
    使用mshta和csv注入配合获得主机权限
    Springboot美国职业篮球联赛信息平台58sh4计算机毕业设计-课程设计-期末作业-毕设程序代做
  • 原文地址:https://blog.csdn.net/mojiewangday/article/details/137217933