表名映射(分表)
wenking 12/13/2023
当数据库单表存储数据太多时(比如单表超过 1000 万条数据), 会严重影响查询效率,这就需要进行水平切分操作,将数据分别存储到不同表中。
@Configuration
@MapperScan("com.example.mybatisplusdemo.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();
if (CollectionUtils.isNotEmpty(paramMap)) {
paramMap.forEach((k, v) -> System.err.println(k + "----" + v));
// 获取传递的参数
Long userId = (Long) paramMap.get("user_id");
// 水平分表 3 张
String tableNameSuffix = "_" + userId % 3;
// 组装动态表名
return tableName + tableNameSuffix;
}
return tableName;
});
interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
return interceptor;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30