Mybatis-Plus实现动态表名sql解析器

Mybatis-Plus实现动态表名sql解析器

在实现动态表名sql解析之前我们先配置动态表名的创建

动态表名的创建

配置mapper

1 public interface SysTestMapper extends BaseMapper<SysTest> {
2 
3     void createTable(@Param("tableName") String tableName);
4 
5 }

配置mapper.xml

 1 <mapper namespace="com.demo.studynew.mapper.SysTestMapper">
 2 
 3     <update id="createTable" parameterType="String">
 4         CREATE TABLE ${tableName} (
 5           `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 6           `name` varchar(20) DEFAULT NULL,
 7           `gmt_create` datetime DEFAULT NULL,
 8           PRIMARY KEY (`id`)
 9         ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
10   </update>
11 
12 </mapper>

测试

1 @Test
2 void testCreateTable(){
3      sysTestMapper.createTable("sys_test_2019");
4 }

至此动态表名的创建配置完成。

动态表名sql解析

添加依赖

 1 <dependency>
 2    <groupId>com.baomidou</groupId>
 3     <artifactId>mybatis-plus-boot-starter</artifactId>
 4     <version>3.4.0</version>
 5 </dependency>
 6 
 7 <dependency>
 8     <groupId>mysql</groupId>
 9     <artifactId>mysql-connector-java</artifactId>
10 </dependency>

配置yml

 1 spring:
 2   servlet:
 3     multipart:
 4       max-file-size: 50MB
 5       max-request-size: 100MB
 6   datasource:
 7     username: root
 8     password: 123456
 9     url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF8&useSSL=false
10     driver-class-name: com.mysql.jdbc.Driver
11 file:
12   path: /Users/jisen/Desktop
13   folder: /files/
14 
15 ## mybatis-plus
16 mybatis-plus:
17   mapper-locations: classpath*:mapper/**/*.xml
18   configuration:
19     map-underscore-to-camel-case: true
20   global-config:
21     db-config:
22       update-strategy: ignored

编写sql解析器

 1 package com.demo.studynew;
 2 
 3 import com.baomidou.mybatisplus.annotation.DbType;
 4 import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
 5 import com.baomidou.mybatisplus.extension.plugins.handler.TableNameHandler;
 6 import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor;
 7 import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
 8 import org.mybatis.spring.annotation.MapperScan;
 9 import org.springframework.context.annotation.Bean;
10 import org.springframework.context.annotation.Configuration;
11 
12 import java.util.HashMap;
13 import java.util.Map;
14 
15 
16 @Configuration
17 @MapperScan("com.demo.studynew.**")
18 public class MybatisPlusConfig {
19 
20     public static ThreadLocal<String> TABLE_NAME = new ThreadLocal<String>();
21 
22     /**
23      * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
24      */
25     @Bean
26     public MybatisPlusInterceptor mybatisPlusInterceptor() {
27         MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
28         PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
29         interceptor.addInnerInterceptor(paginationInnerInterceptor);
30         DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
31         Map<String, TableNameHandler> tableNameHandlerMap = new HashMap<String, TableNameHandler>();
32         tableNameHandlerMap.put("sys_test", new TableNameHandler() {
33             @Override
34             public String dynamicTableName(String sql, String tableName) {
35                 return TABLE_NAME.get();
36             }
37         });
38         dynamicTableNameInnerInterceptor.setTableNameHandlerMap(tableNameHandlerMap);
39         interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
40         return interceptor;
41     }
42 }

测试

 1 package com.demo.studynew;
 2 
 3 import com.demo.studynew.entity.SysTest;
 4 import io.swagger.annotations.Api;
 5 import io.swagger.annotations.ApiOperation;
 6 import org.springframework.beans.factory.annotation.Autowired;
 7 import org.springframework.web.bind.annotation.GetMapping;
 8 import org.springframework.web.bind.annotation.RestController;
 9 
10 import java.time.LocalDateTime;
11 import java.util.List;
12 
13 
14 @RestController
15 @Api(tags = "动态表名测试")
16 public class SysTestController {
17 
18     @Autowired
19     private SysTestMapper sysTestMapper;
20 
21     @GetMapping("list")
22     @ApiOperation("列表")
23     public List<SysTest> list() {
24         MybatisPlusConfig.TABLE_NAME.set("sys_test_2020");
25         return sysTestMapper.selectList(null);
26     }
27 
28     @GetMapping("add")
29     @ApiOperation("新增")
30     public String add(){
31         MybatisPlusConfig.TABLE_NAME.set("sys_test_2020");
32         SysTest sysTest = new SysTest();
33         sysTest.setName("test1");
34         sysTest.setGmtCreate(LocalDateTime.now());
35         sysTestMapper.insert(sysTest);
36         return "ok";
37     }
38 }

至此动态表名sql解析完成。

参考:

https://blog.csdn.net/qq_21896123/article/details/108437839

https://blog.csdn.net/dothetrick/article/details/113152874

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MyBatis-Plus是一个基于MyBatis的增强工具,它提供了许多方便的功能,其包括动态表名的支持。通过使用MyBatis-Plus提供的DynamicTableNameInnerInterceptor拦截器,可以在运行时动态替换SQL语句表名。 使用MyBatis-Plus实现动态表名有以下几个作用: 1. 实现数据分表或数据分区:可以根据特定的规则生成动态表名,例如按照时间分表或按照业务冷热数据分离后将数据存储在不同的表。 2. 隐藏数据表名:在某些情况下,为了安全或其他目的,可能需要隐藏数据库的表名。使用DynamicTableNameInnerInterceptor可以将表名进行动态替换,从而达到隐藏表名的效果。 3. 提高系统的可扩展性:通过动态表名解析器,可以将不同的数据表或数据库实例进行解耦,从而提高系统的可扩展性。例如,可以将一个大型的数据库系统分成多个小型的数据库实例,然后通过动态表名解析器SQL语句分发到不同的实例。 4. 简化代码开发:使用DynamicTableNameInnerInterceptor,可以避免在代码硬编码SQL语句表名,从而简化代码的开发和维护。特别是在应对表结构频繁变化的场景下,使用该拦截器能够更快速地实现表名变更,从而降低维护成本。 因此,通过使用MyBatis-Plus的DynamicTableNameInnerInterceptor拦截器,可以实现mybatis-plus动态表名的功能,并带来诸多好处。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【mybatis-plus系列】动态表名](https://blog.csdn.net/qyj19920704/article/details/130010294)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [mybatis-plus动态表名实现](https://blog.csdn.net/zhangsuhua0702/article/details/122807303)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值