文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

mybatis-plus动态表名实现方法

2024-04-02 19:55

关注

1.使用场景

一个mybatis entity 对应多张表(表明不同的表–> 多张表结构一致只有表名称不同),在使用时,可以动态映射表名称。
比如:按照时间分表,某些业务冷热数据分离后数据存在不同的表中等

2.一定要时常注意工具的更新,不吃亏

因为工作需要,最近需要实现一个类似如下业务等功能交互:

在这里插入图片描述

简单的描述就是:有一部分的表数据,采用了外部同步的模式,同步到了doris中,在业务中采用双数据源的方式,数据写在mysql,读走doris (此处不考虑数据同步的延迟问题 ,这是个大问题,但我们这篇文章先不考虑这个问题)。

要实现上面的方案,需要解决以下几个问题:

双数据源的问题doris/mysql中库和表的名称不一致(例如:上图绿色打底的表,在mysql和doris中表的结构一致,但在mysql中库.表名为 : databaseA.tableA ,在doris中则为 databaseB.ods_tableB_s)

在之前项目研究中,因为有自己去自定义dao层mapper的方法,mybatis表中的方法对应的sql在项目启动时就已经生成好了对应的sql模板,在程序运行中,只是用参数代替即可。

在这里插入图片描述

例如上图,因为我之前用的mybatis-plus 的版本比较低,在生成模板时实际上就已经确定了表的名称。这就导致了无法在使用的时候重新替换。为了实现这个功能,自己实现的时候也是一直往我如何在生成模板语句的时候就直接把我想要的表名替换替换进去。 在实现的差不多的时候,同事来了一句,mybatis-plus不是支持的吗? hhhh,所以说,还是要去关注一下你在项目中所用到的jar包的迭代更新哦,会发现很多,然后开始偷懒。

在这里插入图片描述

3.对mybatis-plus进行升级

我把版本从:3.3.0 升级到了 3.4.3.2
启动项目的时候发现服务启动失败了,着急嘿~

然后在解决问题的过程中发现时因为jar包冲突了 。
然后发现了idea中一个很好使用的工具【在pom.xml文件中要,右击鼠标进入到Maven -> show dependence 】可以很直观的看见冲突法jar包,然后去解决对应的冲突就可以了 (这里不多说了,给大家一个学习链接传送门:https://blog.csdn.net/daerzei/article/details/82344569)

4.将原来的mybatis的插件配置调整成新版本的,并添加上动态表名的模块

4.1 调整mybatis plus 配置

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));

        DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
        //添加上自己实现的表名处理器DayRecordTableNameHandler
        dynamicTableNameInnerInterceptor.setTableNameHandler(new DayRecordTableNameHandler());
        interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);

        return interceptor;
    }

4.2 自定义表名称处理器

结合threadlocal 来确定对对应的业务逻辑使用什么表名称(我这里是利用将数据源信息放入到threadlocal中,然后来映射不同的表名称),下面的代码示例是一个简化版:

public class DayRecordTableNameHandler implements TableNameHandler {
    private static final Logger log = LoggerFactory.getLogger(DayRecordTableNameHandler.class);

    public DayRecordTableNameHandler(){
    }

    @Override
    public String dynamicTableName(String sql, String tableName) {
        Object dataSource = HnThreadLocal.get(SystemConstants.DATASOURCE);
        if(Objects.isNull(dataSource)){
            return tableName;
        }
        if(Objects.equals(tableName,"zsh_day_record")){
            int dataSourceIntValue = (int)dataSource;
            if(Objects.equals(dataSourceIntValue,1)){
                log.info("表名替换:"+tableName+"--->sql:ods_zsh_day_record_s");
                return "ods_zsh_day_record_s";
            }
        }
        return tableName;
    }

}

4.3 利用AOP切换数据源

这里想省略了,多数据源用的是dynamic-datasource-spring-boot-starter
AOP监听多是 @DS ,依据注解value来判断数据源是不是走doris

5.运行一下

成功运行

6. 需要注意的地方

threadlocal 中的数据在aop中最好自己释放掉 ,spring是用的线程池,如果不清理掉会影响线程下次使用的程序这是个草稿实现,因为前面强调的数据同步模块,是需要考虑进去的,继续摸索啦~~~

到此这篇关于mybatis-plus动态表名实现方法的文章就介绍到这了,更多相关mybatis-plus动态表名内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯