| <dependencies> |
| <dependency> |
| <groupId>org.springframework.boot</groupId> |
| <artifactId>spring-boot-starter-test</artifactId> |
| <version>2.6.1</version> |
| <scope>test</scope> |
| </dependency> |
| <dependency> |
| <groupId>org.springframework.boot</groupId> |
| <artifactId>spring-boot-starter-webflux</artifactId> |
| <version>2.6.1</version> |
| </dependency> |
| <dependency> |
| <groupId>com.baomidou</groupId> |
| <artifactId>mybatis-plus-boot-starter</artifactId> |
| <version>3.5.2</version> |
| </dependency> |
| <dependency> |
| <groupId>mysql</groupId> |
| <artifactId>mysql-connector-java</artifactId> |
| <version>8.0.27</version> |
| </dependency> |
| <dependency> |
| <groupId>org.projectlombok</groupId> |
| <artifactId>lombok</artifactId> |
| <version>1.18.18</version> |
| <scope>provided</scope> |
| </dependency> |
| <dependency> |
| <groupId>org.assertj</groupId> |
| <artifactId>assertj-core</artifactId> |
| <version>3.21.0</version> |
| <scope>compile</scope> |
| </dependency> |
| </dependencies> |
| @Configuration |
| @MapperScan("org.example.demo17.mapper") |
| public class MybatisPlusConfig { |
| |
| @Bean |
| public MybatisPlusInterceptor mybatisPlusInterceptor() { |
| MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); |
| DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor(); |
| dynamicTableNameInnerInterceptor.setTableNameHandler((sql, tableName) -> { |
| |
| Map<String, Object> paramMap = RequestDataHelper.getRequestData(); |
| paramMap.forEach((k, v) -> System.err.println(k + "----" + v)); |
| |
| String year = "_2018"; |
| int random = new Random().nextInt(10); |
| if (random % 2 == 1) { |
| year = "_2019"; |
| } |
| return tableName + year; |
| }); |
| interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor); |
| |
| |
| return interceptor; |
| } |
| } |
| public class RequestDataHelper { |
| |
| |
| |
| private static final ThreadLocal<Map<String, Object>> REQUEST_DATA = new ThreadLocal<>(); |
| |
| |
| |
| |
| |
| |
| public static void setRequestData(Map<String, Object> requestData) { |
| REQUEST_DATA.set(requestData); |
| } |
| |
| |
| |
| |
| |
| |
| |
| public static <T> T getRequestData(String param) { |
| Map<String, Object> dataMap = getRequestData(); |
| if (CollectionUtils.isNotEmpty(dataMap)) { |
| return (T) dataMap.get(param); |
| } |
| return null; |
| } |
| |
| |
| |
| |
| |
| |
| public static Map<String, Object> getRequestData() { |
| return REQUEST_DATA.get(); |
| } |
| } |
| @Data |
| @Accessors(chain = true) |
| public class User { |
| private Long id; |
| private String name; |
| private Integer age; |
| private String email; |
| |
| } |
| @SpringBootTest |
| class DynamicTableNameTest { |
| |
| @Resource |
| private UserMapper userMapper; |
| |
| @Test |
| void test() { |
| RequestDataHelper.setRequestData(new HashMap<String, Object>() {{ |
| put("id", 123); |
| put("hello", "tomcat"); |
| put("name", "汤姆凯特"); |
| }}); |
| for (int i = 0; i < 6; i++) { |
| User user = userMapper.selectById(1); |
| System.err.println(user.getName()); |
| } |
| } |
| } |
| name |
| id |
| hello |
| SELECT id,name,age,email FROM user_2018 WHERE id=? |
| 1(Integer) |
| Jone |
| |
| name |
| id |
| hello |
| SELECT id,name,age,email FROM user_2018 WHERE id=? |
| Parameters: 1(Integer) |
| Jone |
| |
| name |
| id |
| hello |
| Preparing: SELECT id,name,age,email FROM user_2019 WHERE id=? |
| 1(Integer) |
| Jack |
| |
| name |
| id |
| hello |
| SELECT id,name,age,email FROM user_2019 WHERE id=? |
| 1(Integer) |
| Jack |
| |
| name |
| id |
| hello |
| SELECT id,name,age,email FROM user_2019 WHERE id=? |
| 1(Integer) |
| Jack |
| |
| name |
| id |
| hello |
| SELECT id,name,age,email FROM user_2019 WHERE id=? |
| 1(Integer) |
| Jack |
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术