Mybatis Plus动态表名配置
遇到过一个需求,大概是这样的,数据库字段是一致的,但是表名不一致,要实现根据某种规则去动态查询某个表,处理逻辑也是也一致。有人说,这不简单,自定义Sql语句,比如select * from ${tableName}
,把参数用占位符传进来不就好了,也可以哈,不过这里介绍Mybatis Plus另外一个强大的功能,动态表名功能,可以直接解决常用的sql动态表名。也就是Mp能够查询的语句都会被替换成动态的表名
举例子
我们要实现动态替换的表名为user表,那么我们需要在Mybatis Plus分页插件那里加入配置,如下所示
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
//分页查询操作默认500,-1为不限制
paginationInterceptor.setLimit(-1);
//动态表名设置
DynamicTableNameParser dynamicTableNameParser = new DynamicTableNameParser();
dynamicTableNameParser.setTableNameHandlerMap(new HashMap<String, ITableNameHandler>(2) {{
put(“user”, (metaObject, sql, tableName) -> {
//在这里你需要实现你自己要动态配置的一个表名,比如时间点之类的
//这里我随便写个规则,你可以实现当前日期之类的
String myTableName = "user"+new Date();
return myTableName;
});
}});
paginationInterceptor.setSqlParserList(Collections.singletonList(dynamicTableNameParser));
return paginationInterceptor;
}
这么加上这些配置你就可以实现动态配置了,教程到此如此。不过也有人会有个小问题,就是他的表名如果需要通过接口传参进来,那么我怎么该把这个参数动态传参进这个分页插件的配置中呢。这里介绍一下ThreadLocal配置方法。
Part 2
在分页插件类加入ThreadLocal,如下所示
@EnableTransactionManagement
@Configuration
public class MybatisPlusPageConfig {
/***
* 使用ThreadLocal将表名传进来
*/
public static ThreadLocal<String> myTableNameLocal = new ThreadLocal<>();
然后在接口逻辑上加上
public void executeTimeTask(String tableName) {
//将表名存进ThreadLocal,用以动态表名设置
MybatisPlusPageConfig.myTableNameLocal.set(tableName);
}
在动态配置那里将表名从ThreadLocal取出来,你就可以实现了接口传参
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
//分页查询操作默认500,-1为不限制
paginationInterceptor.setLimit(-1);
//动态表名设置
DynamicTableNameParser dynamicTableNameParser = new DynamicTableNameParser();
dynamicTableNameParser.setTableNameHandlerMap(new HashMap<String, ITableNameHandler>(2) {{
put("user", (metaObject, sql, tableName) -> {
String myTableName = myTableNameLocal.get();
return myTableName;
});
}});