springboot配置多数据源
在很多场景下我们可能需要使用查询多个数据库的数据来组合使用,索性我就将springboot下配置多数据源的方法分享出来
1.多数据源配置
maven配置
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>3.3.9</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.2.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
数据库配置
datasource: defaultDb: type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://127.0.0.1:3306/default?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2B8 username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver testDb: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2B8& username: root password: 123456
defaultDb默认是主库配置,testDb是从库配置
mapper的位置

可以看到我为主库和从库在dao.mapper设置了两个文件夹用来存放对应的mapper及mapper.xml文件
主库配置
package com.chinaoly.config; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Primary; import org.springframework.core.annotation.Order; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.stereotype.Component; import tk.mybatis.spring.mapper.MapperScannerConfigurer; import javax.sql.DataSource; /** * @author ljh * @date 2025/4/28 */ @Slf4j @Component @Order(1) public class DefaultDbConfigurer { /** * 读取配置defaultDb库的参数 */ @Value("${spring.datasource.defaultDb.url}") private String url; @Value("${spring.datasource.defaultDb.username}") private String username; @Value("${spring.datasource.defaultDb.password}") private String password; @Value("${spring.datasource.defaultDb.driver-class-name}") private String driverClass; /** * @Primary是默认数据源 * 配置数据源 */ @Primary @Bean(name = "defaultDb") @ConfigurationProperties(prefix = "spring.datasource.defaultDb") public DataSource defaultDbDataSource(){ DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); dataSource.setDriverClassName(driverClass); return DruidDataSourceBuilder.create().build(); } /** * 用于创建 SqlSession 实例的工厂 */ @Primary @Bean public SqlSessionFactory sqlSessionFactoryBeanDefaultDb(@Qualifier("defaultDb") DataSource Db) throws Exception { log.info("初始化数据库_defaultDb"); SqlSessionFactoryBean factory = new SqlSessionFactoryBean(); factory.setDataSource(Db); ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); //配置mapper对应xml文件位置 factory.setMapperLocations(resolver.getResources("classpath*:com/chinaoly/dao/mapper/defaultDb/*.xml"));//扫描xml映射文件路径 return factory.getObject(); } /** * 定义MyBatis的映射扫描 * 等同于<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> */ @Primary @Bean public MapperScannerConfigurer mapperScannerConfigurerDefaultDb() { MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer(); mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactoryBeanDefaultDb"); mapperScannerConfigurer.setBasePackage("com.chinaoly.dao.mapper.defaultDb"); return mapperScannerConfigurer; } }
从库配置
package com.chinaoly.config; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.core.annotation.Order; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.stereotype.Component; import tk.mybatis.spring.mapper.MapperScannerConfigurer; import javax.sql.DataSource; /** * @author ljh * @date 2025/4/24 */ @Slf4j @Component @Order(1) public class TestDbConfigurer { @Value("${spring.datasource.testDb.url}") private String url; @Value("${spring.datasource.testDb.username}") private String username; @Value("${spring.datasource.testDb.password}") private String password; @Value("${spring.datasource.testDb.driver-class-name}") private String driverClass; @Bean(name = "testDb") @ConfigurationProperties(prefix = "spring.datasource.testDb") public DataSource testDbDataSource(){ DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); dataSource.setDriverClassName(driverClass); return DruidDataSourceBuilder.create().build(); } /** * 用于创建 SqlSession 实例的工厂 */ @Bean public SqlSessionFactory sqlSessionFactoryBeanTestDb(@Qualifier("testDb") DataSource Db) throws Exception { log.info("初始化数据库_testDb"); SqlSessionFactoryBean factory = new SqlSessionFactoryBean(); factory.setDataSource(Db); //添加xml目录 ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); factory.setMapperLocations(resolver.getResources("classpath*:com/chinaoly/dao/mapper/testDb/*.xml"));//扫描xml映射文件路径 return factory.getObject(); } @Bean public MapperScannerConfigurer mapperScannerConfigurerTestDb() { MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer(); mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactoryBeanTestDb"); mapperScannerConfigurer.setBasePackage("com.chinaoly.dao.mapper.testDb"); return mapperScannerConfigurer; } }
从库其实根主库的配置大差不差,区别主要在于指定默认数据库注解及扫描的mapper文件路径
2.主库和从库测试结果


浙公网安备 33010602011771号