springboot2.x集成mybatis连接多数据源 1、引入依赖 2、配置文件配置数据源 3、查看项目结构 4、配置主数据源 5、配置从数据源(可有多个从数据源) 6、 测试从不同数据源获取不同数据库里面的数据
有时候项目处理的数据的时候数据都存在不同的数据库里面,这个时候就需要我们自己配置其他的数据源了,这里我使用的是Spring boot2.3.7的版本
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.2</version> </dependency> <!-- 阿里巴巴连接驱动 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.13</version> </dependency>
2、配置文件配置数据源
#数据源配置 #连接池的类型 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource #连接驱动 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver #主数据库 spring.datasource.url=jdbc:mysql://ip:端口/数据库名?serverTimezone=Asia/Shanghai spring.datasource.username=xxx spring.datasource.password=xxx #从数据库(可以有多个从数据源) spring.datasource.druid.slave.url=jdbc:mysql://ip:端口/数据库名?serverTimezone=Asia/Shanghai spring.datasource.druid.slave.username=xxx spring.datasource.druid.slave.password=xxx #初始大小 spring.datasource.druid.initial-size=1 #最大连接数 spring.datasource.druid.max-active=100 #最小空闲连接数 spring.datasource.druid.min-idle=10 #配置获取连接等待超时的时间 spring.datasource.druid.max-wait=60000 spring.datasource.druid.default-auto-commit=true #每个连接大小的MAX池准备 spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20
3、查看项目结构
4、配置主数据源
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.annotation.MapperScan; 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.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import javax.sql.DataSource; /** * @Author qt * @Date 2021/3/10 * @Description 配置主数据源 */ @Configuration @MapperScan(basePackages = MasterDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "masterSqlSessionFactory") public class MasterDataSourceConfig { static final String PACKAGE = "com.xxx.xxx.dao.master"; static final String MAPPER_LOCATION = "classpath:mapper/master/*.xml"; @ConfigurationProperties("spring.datasource.druid.master") @Bean(name = "masterDataSource") public DataSource masterDataSource() { return DruidDataSourceBuilder.create().build(); } @Bean(name = "masterTransactionManager") @Primary //设置主数据库 public DataSourceTransactionManager masterTransactionManager() { return new DataSourceTransactionManager(masterDataSource()); } @Bean(name = "masterSqlSessionFactory") @Primary //设置主数据库 public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource) throws Exception { final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(masterDataSource); sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources(MasterDataSourceConfig.MAPPER_LOCATION)); return sessionFactory.getObject(); } }
5、配置从数据源(可有多个从数据源)
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import javax.sql.DataSource; /** * @Author qt * @Date 2021/3/10 * @Description 从数据源配置 */ @Configuration @MapperScan(basePackages = SlaveDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "slaveSqlSessionFactory") public class SlaveDataSourceConfig { static final String PACKAGE = "com.xxx.xxx.dao.slave"; static final String MAPPER_LOCATION = "classpath:mapper/slave/*.xml"; @ConfigurationProperties("spring.datasource.druid.slave") @Bean(name = "slaveDataSource") public DataSource slaveDataSource() { return DruidDataSourceBuilder.create().build(); } @Bean(name = "slaveTransactionManager") public DataSourceTransactionManager slaveTransactionManager() { return new DataSourceTransactionManager(slaveDataSource()); } @Bean(name = "slaveSqlSessionFactory") public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slaveDataSource") DataSource slaveDataSource) throws Exception { final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(slaveDataSource); sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources(SlaveDataSourceConfig.MAPPER_LOCATION)); return sessionFactory.getObject(); } }
6、 测试从不同数据源获取不同数据库里面的数据
@Resource private UserMasterDao userMasterDao; @Resource private UserSlaveDao userSlaveDao; @Test public void mainTest() { User userMaster = userMasterDao.getMasterUserById("456"); System.out.println("主数据库===>:" + JSON.toJSONString(userMaster)); User userSlave = userSlaveDao.getSlaveUserById("123"); System.out.println("从数据库===>:" + JSON.toJSONString(userSlave)); }
总结:实践是检验真理的唯一标准,亲测可用。