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解析完成。
参考: