news 2026/9/2 9:32:41

这才是SpirngBoot轻松整合MybatisPlus多数据源的正确打开方式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
这才是SpirngBoot轻松整合MybatisPlus多数据源的正确打开方式

有一个这样子的需求,线上正在跑的业务,由于业务发展需要,需重新开发一套新系统,等新系统开发完成后,需要无缝对接切换,当初具体设计见草图。

添加依赖#

<!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.16</version> <!--scope=provided,说明它是在编译阶段生效,不需要打入包中,Lombok在编译期将带Lombok注解的Java文件正确编译为完整的Class文件--> <scope>provided</scope> </dependency> <!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--mybatis plus和spring boot整合--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency>

application.properties#

server.port=9999 spring.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.master.url=jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8&useSSL=false spring.datasource.master.username=root spring.datasource.master.password=root spring.datasource.slave.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.slave.jdbc-url=jdbc:mysql://127.0.0.1/test2?useUnicode=true&characterEncoding=utf-8&useSSL=false spring.datasource.slave.username=root spring.datasource.slave.password=root

2种方式创建DataSource#

Master配置,使用druid连接池#

import com.alibaba.druid.pool.DruidDataSource; import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.env.Environment; import javax.sql.DataSource; /** * @Author:chenyanbin */ @Configuration @MapperScan(basePackages = "com.example.demo.mapper", sqlSessionFactoryRef = "masterSqlSessionFactory") public class MasterDataSourceConfig { @Autowired private Environment env; @Primary @Bean(name = "masterDataSource") // @ConfigurationProperties("spring.datasource.master") public DataSource masterDataSource() { // return DataSourceBuilder.create().build(); DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl(env.getProperty("spring.datasource.master.url")); dataSource.setUsername(env.getProperty("spring.datasource.master.username")); dataSource.setPassword(env.getProperty("spring.datasource.master.password")); dataSource.setDriverClassName(env.getProperty("spring.datasource.master.driver-class-name")); //配置初始化大小、最小、最大 dataSource.setMinIdle(10); //配置初始化大小、最小、最大 dataSource.setMaxActive(200); //配置初始化大小、最小、最大 dataSource.setInitialSize(10); //配置获取连接等待超时的时间 dataSource.setMaxWait(60000); //配置一个连接在池中最小生存的时间,单位是毫秒 dataSource.setMinEvictableIdleTimeMillis(300000); //配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 dataSource.setTimeBetweenEvictionRunsMillis(60000); //默认的testWhileIdle=true,testOnBorrow=false,testOnReturn=false dataSource.setValidationQuery("SELECT 1"); //申请连接时执行validationQuery检测连接是否有效 dataSource.setTestOnBorrow(false); //建议配置为true,不影响性能,并且保证安全性。 dataSource.setTestWhileIdle(true); //是否缓存preparedStatement,也就是PSCache dataSource.setPoolPreparedStatements(false); return dataSource; } @Bean(name = "masterSqlSessionFactory") public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean(); sessionFactoryBean.setDataSource(dataSource); return sessionFactoryBean.getObject(); } }

Slave配置#

import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; /** * @Author:chenyanbin */ @Configuration @MapperScan(basePackages = "com.example.demo.mapper2",sqlSessionFactoryRef = "slaveSqlSessionFactory") public class SlaveDataSourceConfig { @Bean(name = "slaveDataSource") @ConfigurationProperties("spring.datasource.slave") public DataSource slaveDataSource(){ return DataSourceBuilder.create().build(); } @Bean(name = "slaveSqlSessionFactory") public SqlSessionFactory sqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean(); sessionFactoryBean.setDataSource(dataSource); return sessionFactoryBean.getObject(); } }

注意#

master和slave扫描不同的mapper包路径!!!!!!

如果需要指定.xml文件,需这样配置!!!

@Bean(name = "masterSqlSessionFactory") public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean(); sessionFactoryBean.setDataSource(dataSource); sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources("classpath:mapper/**/*.xml")); return sessionFactoryBean.getObject(); }

启动类#

@SpringBootApplication( exclude = {DataSourceAutoConfiguration.class, MybatisPlusAutoConfiguration.class} )

启动类上排查,自动装配,使用我们自定义的多数据源!!!

演示#

多个数据源,同时也是支持事务的

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 21:54:07

【开题答辩全过程】以 基于JavaWeb的宠物领养互助管理系统的设计与实现为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

作者头像 李华
网站建设 2026/9/2 19:21:31

C++开发者的嵌入式数据库革命:为什么选择DuckDB?

你是否曾为传统数据库的复杂部署而烦恼&#xff1f;或者因为内存数据库的性能瓶颈而束手束脚&#xff1f;今天&#xff0c;让我们一起来探索DuckDB——这款专为C开发者打造的嵌入式分析型数据库&#xff0c;看看它如何改变你的应用开发体验。 【免费下载链接】duckdb 项目地…

作者头像 李华
网站建设 2026/9/2 21:03:28

Simple Icons:3000+品牌SVG图标的终极解决方案

Simple Icons&#xff1a;3000品牌SVG图标的终极解决方案 【免费下载链接】simple-icons 项目地址: https://gitcode.com/gh_mirrors/sim/simple-icons 在现代Web开发中&#xff0c;寻找高质量、统一风格的品牌图标往往令人头疼。Simple Icons作为拥有3000多个开源品牌…

作者头像 李华
网站建设 2026/9/2 22:12:44

从“监控”到“可观测”:2025年主流IT监控系统架构演进与选型建议

一、演进背景&#xff1a;从被动告警到主动观测的范式转移 1.传统监控的三重瓶颈 随着企业IT架构迈入“传统云原生国产化”混合时代&#xff0c;传统监控工具面临结构性挑战&#xff1a; •数据割裂&#xff1a;指标、日志、链路数据分散存储&#xff0c;故障定位需跨平台串联&…

作者头像 李华
网站建设 2026/9/2 2:40:49

如何在5分钟内完成Azure CLI量子作业结果导出?真相曝光

第一章&#xff1a;Azure CLI 量子作业结果导出的核心概念在使用 Azure Quantum 服务进行量子计算任务时&#xff0c;作业执行完成后获取并导出结果是关键步骤。Azure CLI 提供了一套命令行工具&#xff0c;用于提交量子作业、监控其状态以及提取计算结果。理解如何通过 Azure …

作者头像 李华