mybatis-plus动态表名实现方法

目录
  • 1.使用场景
  • 2.一定要时常注意工具的更新,不吃亏
  • 3.对mybatis-plus进行升级
  • 4.将原来的mybatis的插件配置调整成新版本的,并添加上动态表名的模块
  • 5.运行一下
  • 6. 需要注意的地方

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动态表名内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MyBatis-Plus 动态表名SQL解析器的实现

    一.引言 先来说下动态名表在什么场景下需要使用呢? 拿小编的实际项目来说,小编公司手里掌握着国内各个部分地区的医院患者数据,那么一个医院的患者的数据流量肯定是很大的,这个时候如果全部放在同一张表中,那么可想而知数据量的庞大.所以数据库设计的时候可以一家医院对应一张表,分开来存储,表中的列名都是一样的,只是表名不同. 或者还可以做日志的存储,日志数据量也是很大的,可以分一个月对应一张表,比如:log_201907.log_201908等等之类的. 二.具体实现 动态表名SQL解析器也是基于MP分页

  • mybatis-plus动态表名的实现示例

    背景 在分表的背景下,有时候查询数据的时候需要跨表查询,那此时就需要MP在解析的时候,能够很好的自适应表格名称 实现 MP中是通过PaginationInterceptor(分页插件)完成动态表名解析的,配置如下: 数据库中表 依赖 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version&

  • mybatis-plus动态表名实现方法

    目录 1.使用场景 2.一定要时常注意工具的更新,不吃亏 3.对mybatis-plus进行升级 4.将原来的mybatis的插件配置调整成新版本的,并添加上动态表名的模块 5.运行一下 6. 需要注意的地方 1.使用场景 一个mybatis entity 对应多张表(表明不同的表–> 多张表结构一致只有表名称不同),在使用时,可以动态映射表名称.比如:按照时间分表,某些业务冷热数据分离后数据存在不同的表中等 2.一定要时常注意工具的更新,不吃亏 因为工作需要,最近需要实现一个类似如下业务等功能

  • mybatis plus 的动态表名的配置详解

    mybatis plus简介 详见mybatis plus的官网 业务要求 业务上要求存储数据的时候根据某个字段动态的选择数据要存储的表. 如根据code字段: code->[1001,1002]来进行选择存储的表: 经过下面的配置实现动态表名如 --> table1_1001,table_1002的效果.以此动态生成表名的效果. 具体实现 MPConfig.java import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.J

  • Mybatis 动态表名+Map参数传递+批量操作详解

    需求: 之前项目一个变动,需要对3张mysql数据库表数据进行清洗,3张表表名不同,表结构完全相同,需要对这3张表进行相同的增.改.查动作,一开始比较紧急先对一张表进行操作,后来复制了3个一样的 service.dao.mapper等.后来对代码进行优化,研究了一下动态表名的处理. 1,查询操作: 查询操作只需要传入动态表名的时候,传递参数仍然是map mapper.xml内,需要使用statementType="STATEMENT",采用非预编译模式 mapper.xml内,动态表名

  • mybatis水平分表实现动态表名的项目实例

    目录 一.水平分表 二.项目实现 目录结构 三.扩展 一.水平分表 当业务需求的数据量过大时,一个表格存储数据会非常之多,故时长采用水平分表的方式来减少每张表的数据量即是提升查询数据库时的效率. 水平分表时,各表的结构完全一样,表名不同. 例如:这里我们建了10张user表,每张表的结构完全一致,表名由0~9. 表中包含有id和name属性且都采用varchar的存储类型. 为什么id没有采用int自增的形式? 大型项目极有可能采用分布式数据库,若采用自增的方式,会导致id重复.且id也不一定只

  • Yii操作数据库实现动态获取表名的方法

    本文实例讲述了Yii操作数据库实现动态获取表名的方法.分享给大家供大家参考,具体如下: yii  获取某个库中的表名,而且这个库不确定表的多少,此时没法按照gii去根据表去生成文件,这里有个方法去解决掉. $sqls = "show tables"; $datebase = YII::app()->db_order->createCommand($sqls)->queryAll(); //获取表名 这里$datebase 就是所有的表名,我当前有4个库,一个网站公用这

  • SQL数据分表Mybatis Plus动态表名优方案

    目录 一.应用场景 二.动态表名处理器接口实现 三.测试实现效果 一.应用场景 大家在使用Mybatis进行开发的时候,经常会遇到一种情况:按照月份month将数据放在不同的表里面,查询数据的时候需要跟不同的月份month去查询不同的表. 但是我们都知道,Mybatis是ORM持久层框架,即:实体关系映射,实体Object与数据库表之间是存在一一对应的映射关系. 比如: @Data public class Student {     private Integer id;     privat

  • MyBatis-Plus动态表名的使用

    目录 MyBatis-Plus版本 MyBatis-Plus配置 请求参数传递辅助类 使用 MyBatis-Plus实现动态表名 MyBatis实现方法如下现在要用MyBatis-Plus 实现 <select id="getList" resultType="com.wys.entity.User"> SELECT * FROM ${tableName} </select> MyBatis-Plus官网说明 MyBatis-Plus版本 1

  • YII动态模型(动态表名)支持分析

    本文分析了YII动态模型(动态表名)支持机制.分享给大家供大家参考,具体如下: 给YII 框架增加动态模型支持 Yii框架中的数据模型使用静态机制,如果要使用模型方式操作某张数据表,就必须得事先创建数据表对应的模型类(位于 protected/models 目录下),这种方式,在有的情况下给我们的工作带来了一些不便,如仅仅将数据表进行显示,或者数据表是动态生成的,或者要实现数据表模型中的读写分离,(如数据写入与数据呈现逻辑可能定义到不同的模型中,以提高性能,如前后台的分离). 为解决这个问题,经

  • MyBatis使用动态表或列代码解析

    有时候会不可避免使用动态表或者列进行业务处理.下面学习几种动态表/列的使用方式: [1]使用预编译 即,默认值. <select id="hisNumber" parameterType="hashmap" resultType="hashmap" > select number from ${oldTableName} <!--这里使用"$"!!!--> where name=#{name} and

随机推荐