动态表后缀

简介: 动态表后缀

一.介绍

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());

           }

       };

   }

}


相关文章
php案例:加限定条件(只找某个路径下自己所需要的文件类型的信息)
php案例:加限定条件(只找某个路径下自己所需要的文件类型的信息)
php案例:加限定条件(只找某个路径下自己所需要的文件类型的信息)
|
弹性计算 索引
使用模板约束限制参数选项
服务目录支持通过模板约束限制参数选项,在不同的产品组合中可以为产品添加不同的模板约束,实现产品在不同场景下的复用。
129 0
使用模板约束限制参数选项
项目实战:Qt文件改名工具 v1.2.0(支持递归检索,搜索:模糊匹配,前缀匹配,后缀匹配;重命名:模糊替换,前缀追加,后缀追加
项目实战:Qt文件改名工具 v1.2.0(支持递归检索,搜索:模糊匹配,前缀匹配,后缀匹配;重命名:模糊替换,前缀追加,后缀追加
项目实战:Qt文件改名工具 v1.2.0(支持递归检索,搜索:模糊匹配,前缀匹配,后缀匹配;重命名:模糊替换,前缀追加,后缀追加
|
存储 SQL JSON
如何不改表结构动态扩展字段?
痛点 软件行业唯一不变的就是变化,比如功能上线之后,客户或 PM 需要对已有的功能增加一些合理的需求,完成这些工作必须通过添加字段解决,或者某些功能的实现需要通过增加字段来降低实现的复杂性等等。
653 0
如何不改表结构动态扩展字段?
|
JavaScript 前端开发
i++ 和 ++i 之间的区别详细解释(后缀与前缀)
i++ 和 ++i 之间的区别详细解释(后缀与前缀)
181 0
|
数据库 数据库管理