动态表后缀

简介: 动态表后缀

一.介绍

1.介绍说明

DynamicTableNameInnerInterceptor是 MyBatis 持久化框架中的一个拦截器,允许在运行时动态替换 SQL 语句中的表名。

使用该拦截器可以方便地实现在不同的数据库实例或不同的表结构之间进行切换,同时也可以通过该拦截器实现数据分表或数据分区等功能。

DynamicTableNameInnerInterceptor的主要作用是在 MyBatis 执行 SQL 语句时,动态地替换 SQL 语句中的表名。 具体来说,当使用该拦截器时,在 SQL 语句中可以使用${}占位符表示要替换的表名,同时需要配置一个动态表名解析器,根据当前的上下文环境(如请求参数、会话信息等)动态地生成要替换的表名。 当 MyBatis 执行 SQL 语句时,DynamicTableNameInnerInterceptor会拦截 SQL 语句并将占位符${}替换为实际的表名,然后将替换后的 SQL 语句交给下一个拦截器或执行器执行。 使用DynamicTableNameInnerInterceptor的主要优点是可以方便地实现在不同的数据库实例或不同的表结构之间进行切换,同时也可以通过该拦截器实现数据分表或数据分区等功能。

除了在 MyBatis 中动态替换表名外,DynamicTableNameInnerInterceptor还有一些其他的作用:

  1. 实现数据分表或数据分区 通过动态表名解析器,可以根据特定的规则生成动态表名,从而实现数据分表或数据分区。例如,可以根据用户 ID 对用户数据进行分表,或者根据时间对数据进行分区。
  2. 隐藏数据表名 在某些情况下,为了安全或其他目的,可能需要隐藏数据库的表名。使用DynamicTableNameInnerInterceptor可以将表名进行动态替换,从而达到隐藏表名的效果。
  3. 提高系统的可扩展性 使用DynamicTableNameInnerInterceptor可以将不同的数据表或数据库实例进行解耦,从而提高系统的可扩展性。例如,可以将一个大型的数据库系统分成多个小型的数据库实例,然后通过动态表名解析器将 SQL 语句分发到不同的实例中。
  4. 简化代码开发 通过使用DynamicTableNameInnerInterceptor,可以避免在代码中硬编码 SQL 语句中的表名,从而简化代码的开发和维护。在应对表结构频繁变化的场景下,使用该拦截器能够更快速地实现表名变更,从而降低维护成本。

总之,DynamicTableNameInnerInterceptor是一个非常有用的拦截器,在 MyBatis 的实际开发中具有广泛的应用场景。

二.使用

1.pom

<dependency>

   <groupId>com.baomidou</groupId>

   <artifactId>mybatis-plus-boot-starter</artifactId>

   <version>3.5.2</version>

</dependency>

2.yaml

#动态获取表名

dynamic-table:

 ads_day_city_rep: _uat_0403

 ads_day_region_rep: _uat_0403

 ads_day_country_rep: _uat_0403

3.config

使用 HashMap 在多线程情况下是不安全的

@Configuration

@ConfigurationProperties(value = "dynamic-table")

public class DynamicTableProperties extends HashMap<String, String> {

}

4.MybatisPlusConfig

@Configuration

publicclassMybatisPlusConfig {

 

   @Autowired

   privateDynamicTablePropertiesdynamicTableProperties;

 

   /**

    * 新版的插件配置

    * @return

    */

   @Bean

   publicMybatisPlusInterceptormybatisPlusInterceptor() {

       MybatisPlusInterceptorinterceptor=newMybatisPlusInterceptor();

       DynamicTableNameInnerInterceptordynamicTableNameInnerInterceptor=newDynamicTableNameInnerInterceptor();

       dynamicTableNameInnerInterceptor.setTableNameHandler((sql, tableName) ->tableName+this.dynamicTableProperties.getOrDefault(tableName, ""));

       interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);

 

       // 分页插件

       interceptor.addInnerInterceptor(newPaginationInnerInterceptor());

       // 乐观锁插件

       interceptor.addInnerInterceptor(newOptimisticLockerInnerInterceptor());

       // 防止全表更新与删除插件

       interceptor.addInnerInterceptor(newBlockAttackInnerInterceptor());

 

       returninterceptor;

   }

 

   /**

    * 自动填充配置

    *

    * @return

    */

   @Bean

   publicMetaObjectHandlermetaObjectHandler() {

       returnnewMetaObjectHandler() {

           @Override

           publicvoidinsertFill(MetaObjectmetaObject) {

               DatecurDate=newDate();

               this.strictInsertFill(metaObject, "createdTime", Date.class, curDate);

               this.strictInsertFill(metaObject, "updatedTime", Date.class, curDate);

               this.strictInsertFill(metaObject, "createdBy", String.class, OAuthUser.getOrAnonymous().getSn());

               this.strictInsertFill(metaObject, "updatedBy", String.class, OAuthUser.getOrAnonymous().getSn());

           }

 

           @Override

           publicvoidupdateFill(MetaObjectmetaObject) {

               DatecurDate=newDate();

               this.strictUpdateFill(metaObject, "updatedTime", Date.class, curDate);

               this.strictUpdateFill(metaObject, "updatedBy", String.class, OAuthUser.getOrAnonymous().getSn());

           }

       };

   }

}


目录
打赏
0
0
0
0
4
分享
相关文章
mybatis-plus动态表名
mybatis-plus动态表名
200 0
mybatis-plus小技能: 分表策略(按年分表和按月分表)
业务场景: 日志、交易流水表或者其他数据量大的表,通过日期进行了水平分表,需要通过日期参数,动态的查询数据。 实现思路:利用MybatisPlus的动态表名插件DynamicTableNameInnerInterceptor ,实现Sql执行时,动态的修改表名。
8028 3
mybatis-plus小技能: 分表策略(按年分表和按月分表)
CentOS7下快速升级OpenSSH至8.9p1安全版本
CentOS7下快速升级OpenSSH至8.9p1安全版本
3829 0
CentOS7下快速升级OpenSSH至8.9p1安全版本
深入了解Java中的MyBatis Plus注解 @IdType:优雅处理主键生成策略
在数据库表设计中,主键是一项非常关键的概念,而主键生成策略则是决定如何生成主键值的重要环节之一。MyBatis Plus作为一款强大的ORM框架,提供了注解 `@IdType`,使得开发者能够更加灵活地处理主键生成策略,同时降低了代码的冗余度。本文将详细介绍 `@IdType` 注解的用法及其在持久层开发中的应用。
2320 0
玩转Spring Boot之RestTemplate的使用
在java代码里想要进行restful web client服务,一般使用Apache的HttpClient。不过此种方法使用起来太过繁琐。Spring Boot提供了一种简单便捷的内置模板类来进行操作,这就是RestTemplate。
5630 0
查看mysql 默认端口号和修改端口号
1. 登录mysql mysql -u root -p //输入密码    2. 使用命令show global variables like 'port';查看端口号 mysql> show global variables like 'port';    3. 修改端口,编辑/etc/my.cnf文件,早期版本有可能是my.conf文件名,增加端口参数,并且设定端口,注意该端口未被使用,保存退出。
22579 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等