表名映射(分表)

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