SpringBoot+MyBatis配置多数据源
SpringBoot+MyBatis配置多数据源
在应用的入口中,我们需要修改一下,主要功能是能不能自动识别xml配置文件里面的设置,需要手动代码设置
例如:mybatis.mapper-locations=classpath:dbxml/*.xml
//排除数据源的自动配置
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
这是因为SpringBoot会自动根据依赖来自动配置,但是我们的数据源配置被我们自己自定义配置了,此时SpringBoot 无法完成自动化配置,因此就会报错,所以此处我们需要排除DataSourceAutoConfiguration
的自动配置.
配置数据源
这里我们配置来两个数据源 一个是shopcart,一个website,修改application.properties
文件

# 数据库配置 #基本属性-- spring.datasource.shopcart.url=jdbc:mysql://127.0.0.1:3306/program_shopcart?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 spring.datasource.shopcart.username=sa spring.datasource.shopcart.password=1234 spring.datasource.shopcart.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.shopcart.type-aliases-package=tb.db.mysql.shopcart.mybatis.pojo #基本属性-- spring.datasource.website.url=jdbc:mysql://127.0.0.1:3306/program_shopcart?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 spring.datasource.website.username=sa spring.datasource.website.password=1234 spring.datasource.website.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.website.type-aliases-package=tb.db.mysql.shopcart.mybatis.pojo # mybatis配置 mybatis.mapper-locations=classpath:dbxml/*.xml
创建配置文件封装类
为了更合理的使用配置文件,这里我们没有使用之前的@Value,而是自己封装一个PropertiesConfig
类对象.如下
@Data注解需要添加Lombok插件并开启,需要不想安装的话,请为下面的四个成员变量提供set/get方法即可
数据源shopcart配置文件封装

import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; /** * <pre> * 数据源shopcart配置文件封装 * </pre> * * @author wangyunpeng * @date 2020/2/24 8:52 */ @Data @Component @ConfigurationProperties(prefix = "spring.datasource.shopcart") public class ShopCartDataBaseProperties { String url; String username; String password; String driverClassName; String typeAliasesPackage; }
数据源website配置文件封装

import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; /** * <pre> * 数据源website配置文件封装 * </pre> * * @author wangyunpeng * @date 2020/2/24 8:53 */ @Data @Component @ConfigurationProperties(prefix = "spring.datasource.website") public class WebSiteDataBaseProperties { String url; String username; String password; String driverClassName; String typeAliasesPackage; }
完成数据源配置
这里需要完成DataSource/SqlSessionFactory/SessionTemp等对象的注入,需要注意的是,不管配置多少个数据源,其中的一个数据源配置的Bean必须使用@Primary
完成注解.
下面是两个数据源的配置,其中ShopCart使用了@Primary注解
MapperScan注解的basePackages 表示了其目录下的Mapper使用文件使用该数据源,如ShopCartDataSource中表示tb.db.mysql.shopcart.mybatis下的Maper文件将使用ShopCartDataSource.
第一个数据源: ShopCartDataSource

import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.jdbc.DataSourceBuilder; 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 org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import javax.annotation.Resource; import javax.sql.DataSource; /** * <pre> * 完成shopcart数据源配置 * </pre> * * @author wangyunpeng * @date 2020/2/24 9:00 */ @Configuration @MapperScan(basePackages = "tb.db.mysql.shopcart.mybatis" , sqlSessionTemplateRef ="shopcartSqlSessionTemplate") public class ShopCartDataSourceConfig { /** * 注入类 Environment 可以很方便的获取配置文件中的参数 */ @Resource private Environment env; @Resource private ShopCartDataBaseProperties prop; /** * 创建数据源 * @return */ @Bean(name = "shopcartDS") @Primary public DataSource getDataSource() { DataSource build = DataSourceBuilder.create() .driverClassName(prop.driverClassName) .url(prop.url) .username(prop.username) .password(prop.password) .build(); return build; } /** * 创建SessionFactory * @param dataSource * @return * @throws Exception */ @Bean(name = "shopcartSqlSessionFactory") @Primary public SqlSessionFactory sqlSessionFactory(@Qualifier("shopcartDS") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setTypeAliasesPackage(prop.typeAliasesPackage); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(env.getProperty("mybatis.mapper-locations"))); return bean.getObject(); } /** * 创建事务管理器 * @param dataSource * @return */ @Bean("shopcartTransactionManger") @Primary public DataSourceTransactionManager transactionManger(@Qualifier("shopcartDS") DataSource dataSource){ return new DataSourceTransactionManager(dataSource); } /** * 创建SqlSessionTemplate * @param sqlSessionFactory * @return */ @Bean(name = "shopcartSqlSessionTemplate") @Primary public SqlSessionTemplate sqlSessionTemplate(@Qualifier("shopcartSqlSessionFactory") SqlSessionFactory sqlSessionFactory){ return new SqlSessionTemplate(sqlSessionFactory); } }
第二个数据源:WebSiteDataSource

import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.jdbc.DataSourceBuilder; 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 org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import javax.annotation.Resource; import javax.sql.DataSource; /** * <pre> *完成website数据源配置 * </pre> * * @author wangyunpeng * @date 2020/2/24 9:06 */ @Configuration @MapperScan(basePackages = "tb.db.mysql.website.mybatis" , sqlSessionTemplateRef ="websiteSqlSessionTemplate") public class WebSiteDataSourceConfig { /** * 注入类 Environment 可以很方便的获取配置文件中的参数 */ @Resource private Environment env; @Resource private WebSiteDataBaseProperties prop; /** * 创建数据源 * @return */ @Bean(name = "websiteDS") public DataSource getDataSource() { DataSource build = DataSourceBuilder.create() .driverClassName(prop.driverClassName) .url(prop.url) .username(prop.username) .password(prop.password) .build(); return build; } /** * 创建SessionFactory * @param dataSource * @return * @throws Exception */ @Bean(name = "websiteSqlSessionFactory") @Primary public SqlSessionFactory sqlSessionFactory(@Qualifier("websiteDS") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setTypeAliasesPackage(prop.typeAliasesPackage); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(env.getProperty("mybatis.mapper-locations"))); return bean.getObject(); } /** * 创建事务管理器 * @param dataSource * @return */ @Bean("websiteTransactionManger") @Primary public DataSourceTransactionManager transactionManger(@Qualifier("websiteDS") DataSource dataSource){ return new DataSourceTransactionManager(dataSource); } /** * 创建SqlSessionTemplate * @param sqlSessionFactory * @return */ @Bean(name = "websiteSqlSessionTemplate") @Primary public SqlSessionTemplate sqlSessionTemplate(@Qualifier("websiteSqlSessionFactory") SqlSessionFactory sqlSessionFactory){ return new SqlSessionTemplate(sqlSessionFactory); } }
实现Mapper
根据数据源配置的MappScan目录来创建测试Mapper,代码如下,注意包名,放在正确的位置上.
程序入口Program
// 排除数据源的自动配置
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现