Mybatis Plus动态表名配置以及接口动态传参

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;
            });
        }});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值