java_Springboot_Mybatis-Plus_自定义多数据源MybatisSqlSessionFactoryBean配置

java_Springboot_Mybatis-Plus_自定义多数据源MybatisSqlSessionFactoryBean配置方法

目录

  • java_Springboot_Mybatis-Plus_自定义多数据源MybatisSqlSessionFactoryBean配置方法
  • 引言
  • 环境
  • 集成过程中遇到的问题
    • Invalid bound statement (not found) 错误
    • 默认数据源问题
  • 测试数据源是否正确
  • 总结

引言

需要在服务中集成表结构维护的功能,维护表结构就需要使用具有执行DDL脚本权限的账号。
为了保证系统的安全性,考虑在工程中配置多个数据源引入不同权限账号,高权限账号只在特定逻辑中使用,其它默认业务使用低权限账号。
加入新的数据源不能影响已有的功能,保证已有功能继续使用只具有CRUD权限的账号。
看了几个多数据源接入方案,都不太满足需求。

  • Springboot默认支持的多数据源
  • Mybatis-Plus的多数据源既动态数据源dynamic-datasource插件
  • Alibaba Druid动态数据源

环境

  • JDK 1.0
  • SpringBoot 1.5.6
  • Mybaits 3.5.3
  • Mybatis-plus 3.3.1

集成过程中遇到的问题

Invalid bound statement (not found) 错误

由于系统中调用了Mybatis-plus的BaseMapper中的扩展方法selectBatchIds(),
调用selectBatchIds()方法的位置都报:Invalid bound statement (not found) 错误。
一般遇到这种问题基本都是接口中定义的方法名在对应的XML文件中没有定义。
但是现在使用的是com.baomidou.mybatisplus.core.mapper.BaseMapper中的扩展方法,不需要在XML中定义的!
问题产生原因是没有使用Mybatis-Plust自定义的MybatisSqlSessionFactoryBean构建 SqlSessionFactory实例导致,
改用后解决了Invalid bound statement (not found)的问题。

    @Bean(name = "defSqlSessionFactory")@Primarypublic SqlSessionFactory defSqlSessionFactory(@Qualifier("defDataSource") DataSource dataSource) throws Exception {MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();//SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);//设置mybatis的xml所在位置Resource[] resources = new PathMatchingResourcePatternResolver().getResources("classpath:com/.../mapper/**/*Mapper.xml");bean.setMapperLocations(resources);SqlSessionFactory factory = bean.getObject();return factory;}

默认数据源问题

配置多个数据源时,必须明确声明DataSource、SqlSessionFactory、PlatformTransactionManager、SqlSessionTemplate关键对象!
在默认的Bean上加@Primary注解,标记为默认配置。以下为同一数据源的Bean配置,多个数据源需要加入多套配置。

@Configuration
public class DbDefaultConfig {@Bean(name = "defDataSource")@Primary@ConfigurationProperties(prefix = "spring.datasource")public DataSource defDataSource() {DataSource datasource =  DataSourceBuilder.create().build();return datasource;}@Bean(name = "defSqlSessionFactory")@Primarypublic SqlSessionFactory defSqlSessionFactory(@Qualifier("defDataSource") DataSource dataSource) throws Exception {MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();//SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);//设置mybatis的xml所在位置Resource[] resources = new PathMatchingResourcePatternResolver().getResources("classpath:com/.../mapper/**/*Mapper.xml");bean.setMapperLocations(resources);SqlSessionFactory factory = bean.getObject();return factory;}/*** JDBC事务管理器* @param dataSource* @return*/@Bean("defTransactionManager")@Primarypublic PlatformTransactionManager txManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}@Bean(name = "defSqlSessionTemplate")@Primarypublic SqlSessionTemplate defSqlSessionTemplate(@Qualifier("defSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);return sqlSessionTemplate;}
}

测试数据源是否正确

@RunWith(SpringRunner.class)
//@Transactional
@SpringBootTest(classes = StartApplication.class, webEnvironment = SpringBootTest.WebEnvironment.NONE)
@ActiveProfiles("")
public class MultiDatasourceTest {@Autowiredprivate List<SqlSessionFactory> sqlSessionFactoryList;@Beforepublic void before(){}@Testpublic void datasourceTest(){System.out.println("sqlSessionFactoryList Size = " + sqlSessionFactoryList.size());boolean success = true;for(SqlSessionFactory f:sqlSessionFactoryList ){System.out.println("【工厂】:"+f.toString());try {datasourceTest(f);System.out.println("成功!!!");}catch (Exception ex){System.out.println("异常:"+ex.toString());if(success)success = false;}}Assert.assertTrue("存在不支持的查询!",success);}private boolean datasourceTest(SqlSessionFactory factory){MyTestMapper mapper = factory.openSession(true).getMapper(MyTestMapper.class);//xml中的方法Object objPk = mapper.selectByPrimaryKey("111");//mybatis-plus BaseMapper 中的扩展方法(使用前必须在对象上加 @TableName,pk字段上加@TableId注解)Object objIds = mapper.selectBatchIds(Arrays.asList("1","2"));return true;}
}

总结

构建SqlSessionFactory必须使用MybatisPlust实现的MybatisSqlSessionFactoryBean对象,原理没有深入的去看。
梳理了一下Mapper实例的构建过程,发现调用的扩展方法必须继承BaseMapper类,Mapper实例又是通过SqlSessionFactory实例创建的,
大概率Mapper扩展方法绑定在MybatisSqlSessionFactoryBean的实例方法bean.getObject()中实现的。

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

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

相关文章

3D 视觉市场空间广阔,3D 感知龙头全技术路线布局

3D 视觉市场尚处在发展早期,空间广阔 人类 70%以上信息通过眼睛获取,对于机器而言,视觉感知也是其“智能化”升级的重要基础。3D 成像让每一个像素除 x、y 轴数据外,还有 z 轴(深度/距离)数据。围绕着人体、物体、空间扫描一圈,就能得到点云图和精准的“1:1”还原的 3D …

踩坑 | vue项目运行后使用require()图片也不显示

文章目录 踩坑 | vue项目运行后使用require()图片也不显示问题描述解决办法1&#xff1a;src属性直接传入地址解决办法2 踩坑 | vue项目运行后使用require()图片也不显示 问题描述 在网上查阅之后&#xff0c;发现结论是在使用vue动态加载图片时&#xff0c;必须使用require。…

rust :mod.rs和lib.rs中use的作用

一、mod.rs和lib.rs mod.rs往往是把同一目录下的n个rs文件综合在一起的有效方式&#xff1b; lib.rs是一个库或子库层次综合在一起的有效方式&#xff1b; songroomstaff-NB-146:~/myffi/rusttoc/src$ ls -R .: bar lib.rs./bar: data.rs ffi.rs mod.rsdata.rs文件内容 #[…

B. Sets and Union

题目&#xff1a; 样例&#xff1a; 输入 4 3 3 1 2 3 2 4 5 2 3 4 4 4 1 2 3 4 3 2 5 6 3 3 5 6 3 4 5 6 5 1 1 3 3 6 10 1 9 2 1 3 3 5 8 9 1 2 4 28输出 4 5 6 0 思路&#xff1a; 这里题目的意思是&#xff0c;要求合并尽可能多的集合&#xff0c;使它的集合大小最大&…

C#之性能优化

一、垃圾回收 1.避免不必要的对象创建 ①避免循环创建对象 如果对象并不会随每次循环而改变状态&#xff0c;那么在循环中反复创建对象将带来性能损耗。高效的做法是将对象提到循环外面创建。 ②在需要逻辑分支中创建对象 如果对象只在某些逻辑分支中才被用到&#xff0c;…

Spring面试题23:Spring支持哪些事务管理类型?Spring框架的事务管理有哪些优点?你更倾向用哪种事务管理类型?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring支持哪些事务管理类型? Spring 支持以下几种事务管理类型: 编程式事务管理:通过在代码中显式地使用事务管理 API(如 TransactionTempla…

【C++基础】内存泄漏检测——Valgrind、VLD、RTC

Valgrind Valgrind安装 &#xff08;这里我的安装环境是Ubuntu&#xff09; 打开终端&#xff0c;确保你的包列表是最新的。运行以下命令来更新包列表&#xff1a; sudo apt update 安装 valgrind。运行以下命令来安装 valgrind&#xff1a; sudo apt install valgrind 安装…

如何使ssh操作linux 更安全

对于提高linux的SSH远程操作安全性可从以下几个方面进行增强 禁用ROOT用户&#xff0c;创建其他用户&#xff0c;并使用密钥登陆更改SSH默认端口号&#xff0c;设置一个较长数位的端口号&#xff0c;增加被端口扫描到的难度可对常使用的用户经常执行的命令进行sudo授权&#x…

jenkins联动显示或隐藏参数

1. 添加组件 Active Choices Plug-in 如jenkins无法联网,可在以下两个地址中下载插件,然后放到/home/jenkins/.jenkins/plugin下面重启jenkins即可 Active Choices Active Choices | Jenkins plugin 2. 效果如下: sharding为空时,sharding_info和copy_info不显示 shard…

【LeetCode-简单题】589. N 叉树的前序遍历

文章目录 题目方法一&#xff1a;单循环栈做法方法二&#xff1a;递归 题目 方法一&#xff1a;单循环栈做法 关键在于子节点的入栈顺序&#xff0c;决定了子节点的出栈顺序&#xff0c; 因为是前序遍历 所以压栈顺序先让右边的入栈 依次往左 这样左边的节点会在栈顶 这样下次…

全链路压测:优化系统性能的关键措施

在现代互联网时代&#xff0c;系统的性能稳定性和可靠性对于企业的成功至关重要。全链路压测作为一项关键的测试措施&#xff0c;可以模拟真实的负载情况&#xff0c;全面评估系统在高负载环境下的表现。本文将介绍全链路压测的定义、作用以及在优化系统性能方面的重要性。 一、…

MATLAB打开历史命令窗口并保持

版本&#xff1a;matlab 2021a 方法&#xff1a;菜单栏 主页 - 布局 - 命令历史记录 - 停靠

elasticsearch 索引write.lock报错解决 —— 筑梦之路

ES报错&#xff1a; Caused by: org.apache.lucene.store.LockObtainFailedException: Lock held by another xxx write.lock 这是ES异常关闭导致索引的写锁未释放&#xff0c;索引一直处于red状态 解决方法&#xff1a; 1. 停掉ES服务 2. 找到相应的数据目录&#xff0c…

成都直播基地排名,天府蜂巢直播基地获高知名度直播基地称号

成都直播基地的排名在近年来不断攀升&#xff0c;其中成都天府蜂巢直播产业基地凭借其卓越的表现获得了高知名度的直播基地称号。成都天府蜂巢直播产业基地凭借其卓越的发展成就和优质的服务&#xff0c;力争为西部地区打造了一个独具魅力的直播产业基地。 双方携手 提速发展 …

经典算法:最短点对

软件架构师何志丹 说明 旧文新发&#xff0c;改了错别字&#xff0c;死链等。尽量保持“原汁原味”。 难点 如何测试。我的解决方式是&#xff1a;a,三种解法&#xff0c;看结果是否一致。b,小数据&#xff08;100个点&#xff09;&#xff0c;人工排查。第一种方法&#x…

【无标题】C语言学习笔记5--循环结构和选择结构

5.1 运算符和运算符 5.1.1逻辑运算发 运算符说明结核性举例&&与运算&#xff0c;双目&#xff0c;对应数学中的“且”左结合1&&0、(9>3)&&(b>a与运算&#xff0c;双目&#xff0c;对应数学中的“且”左结合1!非运算&#xff0c;单目&#xff0…

MySQL(6)LOCK和MVCC

一、锁的分类 按照锁的属性&#xff1a;读锁、写锁、共享锁、排它锁、悲观锁、乐观锁 按照锁的范围&#xff1a;表锁、页锁、间隙锁、临键锁、行锁 按照锁的作用&#xff1a;意向锁、意向共享锁、意向排它锁、IS锁、IX锁 二、MySQL为什么要有锁 锁是计算机协调多个进程或线程并…

vue-cli2项目运行时中断解决方案记录

目录 前情提要解决方案1. cmd设置【结论&#xff1a;不得行】2. npm cache verify 清除缓存【结论&#xff1a;不得行】3. 删除node_modules&#xff0c;再重新npm i安装【结论&#xff1a;不得行】4. 安装cross-env和increase-memory-limit【结论&#xff1a;不得行】5. 在sci…

Redis的安装与基本使用

文章目录 Linux 环境下安装Redis下载Redis 安装包解压安装包安装Redis进入redis安装包下编译并且安装到指定目录下 启动redis配置远程访问找到Redis.config文件 Windows 环境下安装Redis说明官方提供方式安装或启用WSL2在WSL&#xff08;Ubuntu&#xff09;上安装Redis启动Redi…

26052-2022 硬质合金管状焊条 思维导图

声明 本文是学习GB-T 26052-2022 硬质合金管状焊条. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了硬质合金管状焊条的技术要求、试验方法、检验规则、标志、包装、运输、贮存、随行文 件和订货单内容。 本文件适用于钢件的表…