SpringBoot MybatisPlus 配置动态表名多数据源

需求

业务场景: 日志、交易流水表或者其他数据量大的表,通过日期进行了水平分表,需要通过日期参数,动态的查询数据。
实现思路:利用MybatisPlus的动态表名插件DynamicTableNameInnerInterceptor ,实现Sql执行时,动态的修改表名。

实现步骤:在数据库预先创建好各年份或者月份的表之后,在配置类统一配置拦截器MybatisPlusInterceptor需要处理的动态表。

版本 3.5.2

        <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version></dependency>

second

DBSecondConfig.java

打印单个数据源日志
配置拦截器
动态表名配置
配置分页,在下面配置,否则不是动态表名

@Configuration
@MapperScan(basePackages = SecondDataSourceConfig.PACKAGE, sqlSessionTemplateRef = "secondSqlSessionTemplate")
public class SecondDataSourceConfig {static final String PACKAGE = "com.xazy.medical.mapper.second";static final String MAPPER_LOCATION = "classpath*:mapper/second/*.xml";@Primary@ConfigurationProperties(prefix = "spring.datasource.second")@Bean(name = "secondDataSource")public DataSource secondDataSource() {return DataSourceBuilder.create().build();}@Primary@Bean(name = "secondSqlSessionFactory")public SqlSessionFactory secondSqlSessionFactory(@Qualifier("secondDataSource") DataSource dataSource) throws Exception {MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();sessionFactory.setDataSource(dataSource);sessionFactory.setPlugins(mybatisPlusInterceptor());sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION));MybatisConfiguration mybatisConfiguration = new MybatisConfiguration();mybatisConfiguration.setLogImpl(org.apache.ibatis.logging.stdout.StdOutImpl.class);sessionFactory.setConfiguration(mybatisConfiguration);return sessionFactory.getObject();}@Primary@Bean(name = "secondSqlSessionTemplate")public SqlSessionTemplate secondSqlSessionTemplate(@Qualifier("secondSqlSessionFactory") SqlSessionFactory sessionFactory) throws Exception {return new SqlSessionTemplate(sessionFactory);}//    @Primary
//    @Bean(name = "secondTransactionManager")
//    public DataSourceTransactionManager secondTransactionManager() {
//        return new DataSourceTransactionManager(secondDataSource());
//    }@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();//dynamicTableNameInnerInterceptor.setTableNameHandler(new MyTableNameHandler());//动态表名插件dynamicTableNameInnerInterceptor.setTableNameHandler((sql, tableName) -> {if("spzl".equals(tableName) || "spkc".equals(tableName) || "spjg".equals(tableName)){tableName = tableName + "_001";log.info("动态查询表" + tableName);}return tableName;});interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);//放到下边位置interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
}

ServiceImpl 接口


/*** @author lyd* @Description: ErpSpkcService 接口实现类* @date 2024/05/07 14:17*/
@Service
public class ErpSpkcServiceImpl extends ServiceImpl<ErpSpkcMapper, ErpSpkc> implements ErpSpkcService {@Resourceprivate ErpSpkcMapper erpSpkcMapper;@Overridepublic List<ErpSpkc> getPage(){Page<ErpSpkc> rowPage = new Page(1, 10);LambdaQueryWrapper<ErpSpkc> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(ErpSpkc::getSpid, "0000000001709");super.baseMapper.selectPage(rowPage, queryWrapper); //分页查询return null;}@Overridepublic List<ErpSpkc> getErpSpkcList(){LambdaQueryWrapper<ErpSpkc> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(ErpSpkc::getSpid, "0000000001709");List<ErpSpkc> erpSpkcList = erpSpkcMapper.selectList(queryWrapper); //mapper查询return null;}@Overridepublic List<ErpSpkc> getOneErpSpkc(){LambdaQueryWrapper<ErpSpkc> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(ErpSpkc::getSpid, "0000000001709");ErpSpkc erpSpkc = this.baseMapper.selectOne(queryWrapper);if(erpSpkc != null){log.info("-----" + erpSpkc.getLasttime());}return null;}
}

问题

mybatis-plus添加多数据源插件和动态表名导致分页失效

日志

实体表 spkc 变为 spkc_001

2024-05-10 10:48:05.863  INFO 31392 --- [nio-8093-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2024-05-10 10:48:05.863  INFO 31392 --- [nio-8093-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2024-05-10 10:48:05.864  INFO 31392 --- [nio-8093-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@615d3061] was not registered for synchronization because synchronization is not active
2024-05-10 10:48:05.937  INFO 31392 --- [nio-8093-exec-1] c.x.m.config.SecondDataSourceConfig      : 动态查询表: spkc_001
2024-05-10 10:48:05.967  INFO 31392 --- [nio-8093-exec-1] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2024-05-10 10:48:06.698  INFO 31392 --- [nio-8093-exec-1] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
JDBC Connection [HikariProxyConnection@654387138 wrapping com.mysql.cj.jdbc.ConnectionImpl@7e9f079b] will not be managed by Spring
==>  Preparing: SELECT COUNT(*) AS total FROM spkc_001 WHERE (spid = ?)
==> Parameters: 0000000001709(String)
<==    Columns: total
<==        Row: 1
<==      Total: 1
==>  Preparing: SELECT spid,spbh,shl,sxrq,cgy,ckid,lasttime,up_status,sjly FROM spkc_001 WHERE (spid = ?) LIMIT ?
==> Parameters: 0000000001709(String), 10(Long)
<==    Columns: spid, spbh, shl, sxrq, cgy, ckid, lasttime, up_status, sjly
<==        Row: 0000000001709, 00714, 0.0, , , , 2024/4/9 18:43:28, 0, TS039
<==      Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@615d3061]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5847749b] was not registered for synchronization because synchronization is not active
2024-05-10 10:48:07.153  INFO 31392 --- [nio-8093-exec-1] c.x.m.config.SecondDataSourceConfig      : 动态查询表: spkc_001
JDBC Connection [HikariProxyConnection@1955085493 wrapping com.mysql.cj.jdbc.ConnectionImpl@7e9f079b] will not be managed by Spring
==>  Preparing: SELECT spid,spbh,shl,sxrq,cgy,ckid,lasttime,up_status,sjly FROM spkc_001 WHERE (spid = ?)
==> Parameters: 0000000001709(String)
<==    Columns: spid, spbh, shl, sxrq, cgy, ckid, lasttime, up_status, sjly
<==        Row: 0000000001709, 00714, 0.0, , , , 2024/4/9 18:43:28, 0, TS039
<==      Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5847749b]
2024-05-10 10:48:07.382  INFO 31392 --- [nio-8093-exec-1] c.x.m.service.impl.ErpSpkcServiceImpl    : -----ErpSpkc(spid=0000000001709, spbh=00714, shl=0.0, sxrq=, cgy=, ckid=, lasttime=2024/4/9 18:43:28, upStatus=0, sjly=TS039)
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@454c8e60] was not registered for synchronization because synchronization is not active
2024-05-10 10:48:07.385  INFO 31392 --- [nio-8093-exec-1] c.x.m.config.SecondDataSourceConfig      : 动态查询表: spkc_001
JDBC Connection [HikariProxyConnection@177690205 wrapping com.mysql.cj.jdbc.ConnectionImpl@7e9f079b] will not be managed by Spring
==>  Preparing: SELECT spid,spbh,shl,sxrq,cgy,ckid,lasttime,up_status,sjly FROM spkc_001 WHERE (spid = ?)
==> Parameters: 0000000001709(String)
<==    Columns: spid, spbh, shl, sxrq, cgy, ckid, lasttime, up_status, sjly
<==        Row: 0000000001709, 00714, 0.0, , , , 2024/4/9 18:43:28, 0, TS039
<==      Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@454c8e60]
2024-05-10 10:48:07.614  INFO 31392 --- [nio-8093-exec-1] c.x.m.service.impl.ErpSpkcServiceImpl    : -----2024/4/9 18:43:28

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/10272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Matten:视频生成与Mamba-Attention

Matten:视频生成与Mamba-Attention 摘要IntroductionRelated WorkMethodology Matten: Video Generation with Mamba-Attention 摘要 在本文中&#xff0c;作者介绍了Matten&#xff0c;一种具有Mamba-Attention架构的尖端潜在扩散模型&#xff0c;用于视频生成。在极小的计算…

带EXCEL附件邮件发送相关代码

1.查看生成的邮件 2.1 非面向对象的方式&#xff08;demo直接copy即可&#xff09; ​ REPORT Z12. DATA: IT_DOCUMENT_DATA TYPE SODOCCHGI1,IT_CONTENT_TEXT TYPE STANDARD TABLE OF SOLISTI1 WITH HEADER LINE,IT_PACKING_LIST TYPE TABLE OF SOPCKLSTI1 WITH HEADER LIN…

《他强由他强,清风拂山岗;他横由他横,明月照大江》之三

常见的设计模式 1.策略模式 使用场景 通俗来说,策略模式就像是让你有一个策略的工具箱,在不同的情况下选择最合适的策略来解决问题。 使用场景通常包括以下一些: 多重条件判断语句: 当一个操作包含大量的条件判断语句,并且这些分支具有不同的行为时,可以使用策略模式来…

docker runc升级1.1.12

上传runc-1.1.12制品至中控机 874e970eaa932a97de9888344ae08f24 runc.arm64 将所有节点的runc文件备份 所有节点(包括master+node) vim host [all] 10.1.0.183 ansible_password=Bigdata@Ksyun123 ansible_user=root ansible_port=22 10.1.0.249 ansible_password=Bigdata…

关于 vs2019 c++ 20规范,STL 库提供的标准分配器 alloctor 及其 traits 及涉及分配器交换的全局函数 _Pocs

(1) 我们写 c 代码&#xff0c;使用 STL 库中的模板&#xff0c;很少自己写对象的分配器。用 STL 中的分配器也够用。研究 STL 中的分配器也可以为咱们自己写分配器提供参考。 咱们会遇到这样的场景&#xff0c;例如交换两个容器对象&#xff1a; list a ,b ; a .swap (b) ; 这…

自建XXL-JOB调度平台教程

一、XXL-JOB简介 XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。它支持通过Web界面进行管理调度任务&#xff0c;包括任务的增删改查、执行状态监控等。同时&#xff0c;XXL-JOB提供了Java、Spring Boot等多种接入方式&am…

C++中向量的操作vector

在C中&#xff0c;std::vector 是一个非常有用的动态数组容器&#xff0c;它允许你在运行时动态添加或删除元素&#xff0c;并且提供了许多方法来操作这些元素。下面是一些常见的 std::vector 操作&#xff1a; 创建一个 vector&#xff1a; #include <vector> std::vec…

像编排容器一样编排进程

背景 当前微服务架构大行其道&#xff0c;一个业务应用往往是由多个独立的服务构成&#xff0c;通过K8S&#xff0c;Docker Compose等容器编排工具&#xff0c;以及Jekins等DevOPS工具&#xff0c;我们也能够很方便的将服务发布到容器&#xff0c;并通过配置和编排轻松部署到线…

std::async、std::future

async和future std::async和std::thread都是C11标准库中实现多线程的类。async是一种异步执行任务的方式&#xff0c;它可以在后台线程中执行一个函数或者函数对象&#xff0c;并返回一个std::future对象&#xff0c;可以用来获取函数的返回值或者异常信息。它允许线程返回fut…

40道 Nginx 高频面试题

Nginx 是一款轻量级的 Web 服务器、反向代理服务器&#xff0c;由于它的内存占用少&#xff0c;启动极快&#xff0c;高并发能力强&#xff0c;在互联网项目中广泛应用。那么关于 Nginx 的核心面试题有哪些呢&#xff1f;今天给大家整理了40道Nginx 高频面试题&#xff0c;最近…

麒麟kylin-v10系统,虚拟机kvm的使用

kvm的使用 虚拟机新建 点击选择对应的iso文件 选择相应的系统 &#xff08;注意&#xff0c;如果这里没有相应的系统比如&#xff1a;windows&#xff0c;可以直接选择Generic default这是通用默认的意思&#xff09; 选择cpu 完成即可 等待安装完毕 网络设置-ssh连接 虚拟…

Electron+Vue+pyinstaller服务打包

electron环境安装略 1. electron的入口文件配置test.js, 需要在package.json 配置文件中指定main: src/test.js const { app, BrowserWindow } require(electron)const createWindow () > {const win new BrowserWindow({width: 800,height: 600})// win.loadFile(inde…

实体类和对象之间的关系是什么

实体类&#xff08;Entity Class&#xff09;和对象&#xff08;Object&#xff09;在面向对象编程&#xff08;OOP, Object-Oriented Programming&#xff09;和ORM&#xff08;Object-Relational Mapping&#xff09;框架如Hibernate中扮演着重要的角色。以下是它们之间的关系…

守好参数之门:防止 IllegalArgumentException 入侵的七大策略

1. 原因分析 java.lang.IllegalArgumentException 是 Java 中的一个运行时异常&#xff0c;它通常表示向方法传递了一个不合法或不适当的参数。这种异常不会由 Java 虚拟机自动抛出&#xff0c;而是由程序员在编写代码时通过显式地调用 throw 语句来抛出&#xff0c;或者在某些…

如何利用python选股

使用Python进行选股是一个复杂但有趣的过程,它结合了数据分析、统计建模和机器学习等多个领域的知识。 由于篇幅限制,我将提供一个概述性的框架和关键步骤,并尽量保持内容的精炼和深入。 一、引言 背景介绍:简述股市投资的重要性和复杂性,以及利用Python进行量化选股的优…

红龙工业设备制造有限公司亮相2024杭州数字物流技术设备展

参展企业介绍 温州红龙工业设备制造有限公司成立于2015年11月。是中国先进的工业皮带设备研发制造和工业皮带整体解决方案运营服务商&#xff0c;现主营皮带接头机、皮带热压机、皮带接驳机、皮带打齿机、输送带打齿机、输送带分层级、输送带导条机、输送带裁切机、高频机等工业…

力扣HOT100 - 84. 柱状图中最大的矩形

解题思路&#xff1a; 单调栈 对于一个高度height[ i ]&#xff0c;找左右两边均严格小于它的值。 class Solution {public int largestRectangleArea(int[] heights) {int n heights.length;int[] left new int[n];int[] right new int[n];Deque<Integer> mono_st…

HDFS集群间互访配置

HDFS集群间互访配置 目录 1 HDFS互访 1.1 前置条件 1.2 互访配置 2 NameService修改 HDFS互访

【element-plus】自动导入 + typescript 提示

1、自动导入 2、引用加载组件类型提示 第一步&#xff1a;安装自动导入功能所需的插件 npm install -D unplugin-vue-components unplugin-auto-import 第二步&#xff1a; vite版&#xff1a; // vite.config.ts import { defineConfig } from vite import AutoImport fr…

力扣:738. 单调递增的数字

738. 单调递增的数字 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 示例 1: 输入: n 10 输出: 9示例 2: 输入: n 1234 输…