动态表后缀

简介: 动态表后缀

一.介绍

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

           }

       };

   }

}


相关文章
|
6月前
如何批量复制多个文件到多个目录中(提取匹配法)
该文介绍了一个工具的使用方法,用于将带有特定数字的文件或文件夹自动归类到相应数字命名的文件夹中。操作步骤包括:下载工具(链接在文中提供)、打开工具选择“文件批量复制”功能、设置匹配规则(如从文件名中提取数字)并预览效果,最后执行复制操作。通过示例展示了如何处理“-数字.png”格式的文件,以及如何过滤掉特定格式的图片。该工具适用于处理大量按规则命名的文件,提高整理效率。
|
6月前
无规律快速批量重命名文件(夹)-固定命名
本文介绍了一个工具的使用方法,用于批量修改文件名。首先在文中提供了两个下载链接:百度网盘(提取码:qwu2)和蓝奏云(提取码:2r1z)。接着,展示了如何通过该工具的“文件批量复制”功能提取文件路径,并在“文章”版块中处理这些路径,提取出目标文件名。然后,在“文字批量替换”版块中,创建规则并保存,用于文件名的重命名。最后,回到“批量复制”版块,选择重命名功能,将目标路径与规则对应,执行重命名操作。整个过程旨在将大量无规律的文件名改为预设的目标文件名。
|
6月前
|
SQL C# 数据库
C# 读取多条数据记录导出到 Word 标签模板
C# 读取多条数据记录导出到 Word 标签模板
php案例:加限定条件(只找某个路径下自己所需要的文件类型的信息)
php案例:加限定条件(只找某个路径下自己所需要的文件类型的信息)
php案例:加限定条件(只找某个路径下自己所需要的文件类型的信息)
|
easyexcel
你要的不固定列excel导入导出,它来啦!(四)
在上篇文章中,我们简单的介绍了 excel 导入导出技术实践方案,就目前而已,使用最多的开源框架主要有以下三类,分别是:
|
easyexcel
你要的不固定列excel导入导出,它来啦!(三)
在上篇文章中,我们简单的介绍了 excel 导入导出技术实践方案,就目前而已,使用最多的开源框架主要有以下三类,分别是:
你要的不固定列excel导入导出,它来啦!(三)
项目实战:Qt文件改名工具 v1.2.0(支持递归检索,搜索:模糊匹配,前缀匹配,后缀匹配;重命名:模糊替换,前缀追加,后缀追加
项目实战:Qt文件改名工具 v1.2.0(支持递归检索,搜索:模糊匹配,前缀匹配,后缀匹配;重命名:模糊替换,前缀追加,后缀追加
项目实战:Qt文件改名工具 v1.2.0(支持递归检索,搜索:模糊匹配,前缀匹配,后缀匹配;重命名:模糊替换,前缀追加,后缀追加
|
easyexcel API Apache
你要的不固定列excel导入导出,它来啦!(一)
在上篇文章中,我们简单的介绍了 excel 导入导出技术实践方案,就目前而已,使用最多的开源框架主要有以下三类,分别是:
1128 0
你要的不固定列excel导入导出,它来啦!(一)
|
easyexcel
你要的不固定列excel导入导出,它来啦!(二)
在上篇文章中,我们简单的介绍了 excel 导入导出技术实践方案,就目前而已,使用最多的开源框架主要有以下三类,分别是:
1167 0
你要的不固定列excel导入导出,它来啦!(二)
|
存储 SQL JSON
如何不改表结构动态扩展字段?
痛点 软件行业唯一不变的就是变化,比如功能上线之后,客户或 PM 需要对已有的功能增加一些合理的需求,完成这些工作必须通过添加字段解决,或者某些功能的实现需要通过增加字段来降低实现的复杂性等等。
733 0
如何不改表结构动态扩展字段?