动态表名插件
-
pom.xml,注意mybatis plus版本需高于3.4.3.2
<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);
// 3.4.3.2 作废该方式
// dynamicTableNameInnerInterceptor.setTableNameHandlerMap(map);
return interceptor;
}
}
- 请求参数传递辅助类
public class RequestDataHelper {
/**
* 请求参数存取
*/
private static final ThreadLocal<Map<String, Object>> REQUEST_DATA = new ThreadLocal<>();
/**
* 设置请求参数
*
* @param requestData 请求参数 MAP 对象
*/
public static void setRequestData(Map<String, Object> requestData) {
REQUEST_DATA.set(requestData);
}
/**
* 获取请求参数
*
* @param param 请求参数
* @return 请求参数 MAP 对象
*/
public static <T> T getRequestData(String param) {
Map<String, Object> dataMap = getRequestData();
if (CollectionUtils.isNotEmpty(dataMap)) {
return (T) dataMap.get(param);
}
return null;
}
/**
* 获取请求参数
*
* @return 请求参数 MAP 对象
*/
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----123
hello----tomcat
SELECT id,name,age,email FROM user_2018 WHERE id=?
1(Integer)
Jone
name----汤姆凯特
id----123
hello----tomcat
SELECT id,name,age,email FROM user_2018 WHERE id=?
Parameters: 1(Integer)
Jone
name----汤姆凯特
id----123
hello----tomcat
Preparing: SELECT id,name,age,email FROM user_2019 WHERE id=?
1(Integer)
Jack
name----汤姆凯特
id----123
hello----tomcat
SELECT id,name,age,email FROM user_2019 WHERE id=?
1(Integer)
Jack
name----汤姆凯特
id----123
hello----tomcat
SELECT id,name,age,email FROM user_2019 WHERE id=?
1(Integer)
Jack
name----汤姆凯特
id----123
hello----tomcat
SELECT id,name,age,email FROM user_2019 WHERE id=?
1(Integer)
Jack