动态表后缀

简介: 动态表后缀

一.介绍

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

           }

       };

   }

}


相关文章
|
8月前
|
Windows
(文件[夹]批量分类整理_多级匹配_交叉匹配_路径结构交叉调整)文件[夹]批量复制
该文介绍了如何使用特定工具进行批量文件整理。首先,需要从提供的百度网盘和蓝奏云链接下载工具,并用提取码解锁。接着,打开工具的批量复制功能,将待整理的图片文件拖入“来源路径”,目标文件夹拖入“终点路径”。通过层级过滤排除不需要的路径。然后,利用多级匹配设置,提取文件名和路径中的关键词,如“动物”、“小型”、“食草”等,设置复制后的文件重命名规则。最后,执行批量复制,完成文件的智能分类与命名。整个过程旨在根据文件的原始分类信息,自动将其移动到相应的新目录结构下。
|
8月前
如何批量重命名,把文件(夹)名的内容位置调整(前后移动)
该文介绍了如何使用一个工具批量修改文件名,将&quot;中文[数字]&quot;格式改为&quot;中文 - 数字&quot;。首先,从提供的百度网盘或蓝奏云链接下载工具,使用提取码获取。接着,在工具中选择文件批量复制模块,通过拖放或导入按钮添加文件或文件夹。然后,设置两个规则:一个提取中文(2个字符),另一个提取数字(20个字符)。预览无误后,选择方案3,以自定义内容(&quot;规则1 空格-空格 规则2&quot;)重命名,并确保关联到之前创建的规则。最后,执行重命名操作,查看结果,文件名应已按预期更改。
|
8月前
|
SQL
将查询出来数据中相对应的字段根据枚举类更改为其中文内容
将查询出来数据中相对应的字段根据枚举类更改为其中文内容
|
8月前
无规律快速批量重命名文件(夹)-固定命名
本文介绍了一个工具的使用方法,用于批量修改文件名。首先在文中提供了两个下载链接:百度网盘(提取码:qwu2)和蓝奏云(提取码:2r1z)。接着,展示了如何通过该工具的“文件批量复制”功能提取文件路径,并在“文章”版块中处理这些路径,提取出目标文件名。然后,在“文字批量替换”版块中,创建规则并保存,用于文件名的重命名。最后,回到“批量复制”版块,选择重命名功能,将目标路径与规则对应,执行重命名操作。整个过程旨在将大量无规律的文件名改为预设的目标文件名。
|
Windows
怎么批量给文件添加拓展名?
怎么批量给文件添加拓展名?
183 0
怎么批量给文件添加拓展名?
项目实战:Qt文件改名工具 v1.2.0(支持递归检索,搜索:模糊匹配,前缀匹配,后缀匹配;重命名:模糊替换,前缀追加,后缀追加
项目实战:Qt文件改名工具 v1.2.0(支持递归检索,搜索:模糊匹配,前缀匹配,后缀匹配;重命名:模糊替换,前缀追加,后缀追加
|
存储 SQL JSON
如何不改表结构动态扩展字段?
痛点 软件行业唯一不变的就是变化,比如功能上线之后,客户或 PM 需要对已有的功能增加一些合理的需求,完成这些工作必须通过添加字段解决,或者某些功能的实现需要通过增加字段来降低实现的复杂性等等。
752 0
如何不改表结构动态扩展字段?
|
JavaScript 前端开发
i++ 和 ++i 之间的区别详细解释(后缀与前缀)
i++ 和 ++i 之间的区别详细解释(后缀与前缀)
216 0
|
Java Scala
slick对超过22个属性的表进行映射的两种办法
版权声明:本文为博主原创文章,未经博主允许不得转载 slick是scala的一个FRM(Functional Relational Mapper)框架,即函数式的关系数据库编程工具库。使用slick不同于使用java的hibernate或者是mybatis,对其进行迭代开发非常方便,因为其对表的映射基于函数式的编程方式。
1124 0