Mybatis-Plus實現動態表名sql解析器
阿新 • • 發佈:2021-01-30
技術標籤:mybatismysqlspringlighttpdehcache
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解析完成。
參考: