前言
偶摩西罗伊
这个是自己学习时候记得笔记要是想详细了解可以去MP官网,上边有更详细的配置流程以及视频教学:MyBatis-Plus
概念及使用场景
有些数据表的数据量比较大,可以进行份表存储,分出来的表有不同的数据以及相同的字段,而这些表表名基本类似,只是后缀不同。
数据分表后,对数据进行查询或者操作时,不可以只针对固定的表名,需要动态的拼接要操作的表名,此时使用动态表名SQL解析器
实现
也要写在分页插件中,与多租户SQL解析类似
- 创建保存动态表名的数据结构(这里用的public static ThreadLocal< String >)
// 保存新表名
public static ThreadLocal<String> myTableName = new ThreadLocal<>();
- 在分页插件中配置动态表明SQL解析器
@Bean
public PaginationInterceptor paginationInterceptor() {
// 1. 分页插件
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 2. 设置解析器保存集合
ArrayList<ISqlParser> sqlParserList = new ArrayList<ISqlParser>();
// 设置动态表明 SQL 解析器
// 2.1 创建动态表名SQL解析器对象
DynamicTableNameParser dynamicTableNameParser = new DynamicTableNameParser();
// 2.2 创建替换map
// key String:要替换的表明
// value ITableNameHandler: 动态表名处理器,处理逻辑要写在这里
Map<String, ITableNameHandler> tableNameHandlerMap = new HashMap<>();
// 2.3 设置替换map中的值
tableNameHandlerMap.put("tbl_type", new ITableNameHandler() {
@Override
public String dynamicTableName(MetaObject metaObject, String sql, String tableName) {
System.out.println(sql+" \n"+tableName);
return myTableName.get(); // 返回值为 替换后的表名
}
});
// 2.4设置到dynamicTableNameParser中
dynamicTableNameParser.setTableNameHandlerMap(tableNameHandlerMap);
// 2.5 设置到sqlPareserList中
sqlParserList.add(dynamicTableNameParser);
// 6. 将list放到分页器中
paginationInterceptor.setSqlParserList(sqlParserList);
return paginationInterceptor;
}
- 在执行SQL操作时,向存储表明的数据结构中放数据
以单查id方法为例子
public Type selectById(int id) {
if (id<7) {
MyBatisPlusConfig.myTableName.set("tbl_type1");
}else{
MyBatisPlusConfig.myTableName.set("tbl_type2");
}
return this.typeMapper.selectById(id);
}
- 执行命令
第一条:原SQL语句
第二条:原查询表明
第三条之后:实际执行查询
注意事项
- 配置ITableNameHandler时,如果返回值为空,那么则查询原表
tableNameHandlerMap.put("tbl_type", new ITableNameHandler() {
@Override
public String dynamicTableName(MetaObject metaObject, String sql, String tableName) {
System.out.println(sql+" \n"+tableName);
return myTableName.get(); // 返回值为 替换后的表名
}
});
- 之前配置的SQL过滤器也会对表名SQL解析器进行过滤
- @SqlParser(filter = true)配置的自定义Mapper方法对动态表名SQL解析器同样过滤