在配置文件中配置兩個數據源配置,以及mybatis xml配置文件路徑java
# mybatis 多數據源配置 mybatis.config-location = classpath:mapper/config/mybatis-config.xml ################# mysql 數據源1 ################# spring.datasource.one.jdbc-url=jdbc:mysql://localhost:3306/user?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true spring.datasource.one.username=root spring.datasource.one.password=root #spring.datasource.one.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.one.driver-class-name=com.mysql.jdbc.Driver ################# mysql 數據源1 ################# ################# mysql 數據源2 ################ spring.datasource.second.jdbc-url=jdbc:mysql://xxxxxxxxxx:3306/user?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true spring.datasource.second.username=root spring.datasource.second.password=root #spring.datasource.second.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.second.driver-class-name=com.mysql.jdbc.Driver ################# mysql 數據源1 #################
1 首先加載配置的數據源:手動將數據配置文件信息注入到數據源實例對象中。
2 根據建立的數據源,配置數據庫實例對象注入到SqlSessionFactory 中,構建對應的 SqlSessionFactory。
3 配置數據庫事務:將數據源添加到事務中。
4 將SqlSessionFactory 注入到SqlSessionTemplate 模板中
5 最後將上面建立的 SqlSessionTemplate 注入到對應的 Mapper 包路徑下,這樣這個包下面的 Mapper 都會使用第一個數據源來進行數據庫操做。mysql
basePackages 指明 Mapper 地址。 sqlSessionTemplateRef 指定 Mapper 路徑下注入的 sqlSessionTemplate。
在多數據源的狀況下,不須要在啓動類添加:@MapperScan("com.xxx.mapper") 的註解。
@Api("SqlSessionTemplate 注入到對應的 Mapper 包路徑下") @Configuration @MapperScan(basePackages = "com.example.demo.mapper.one", sqlSessionTemplateRef = "oneSqlSessionTemplate") public class OneDataSourceConfig { //------------------ 1 加載配置的數據源: ------------------------------- @Bean("oneDatasource") @ConfigurationProperties(prefix = "spring.datasource.one") @Primary //默認是這個庫 public DataSource DataSource1Config(){ return DataSourceBuilder.create().build(); } //---------------------- 2 建立的數據源 構建對應的 SqlSessionFactory。 ---------------------- @Bean(name = "oneSqlSessionFactory" ) @Primary public SqlSessionFactory oneSqlSessionFactory(@Qualifier("oneDatasource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/one/*.xml")); return bean.getObject(); } //------------------------3 配置事務 -------------------------- @Bean(name = "oneTransactionManager") @Primary public DataSourceTransactionManager oneTransactionManager(@Qualifier("oneDatasource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } //------------------------------- 4 注入 SqlSessionFactory 到 SqlSessionTemplate 中--------------------------------- @Bean(name = "oneSqlSessionTemplate") @Primary public SqlSessionTemplate oneSqlSessionTemplate(@Qualifier("oneSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
@Api("SqlSessionTemplate 注入到對應的 Mapper 包路徑下") @Configuration @MapperScan(basePackages = "com.example.demo.mapper.second", sqlSessionTemplateRef = "secondSqlSessionTemplate") public class SecondDataSourceConfig { //------------------ 加載配置的數據源: ------------------------------- @Bean("secondDatasource") @ConfigurationProperties(prefix = "spring.datasource.second") public DataSource DataSource2Config(){ return DataSourceBuilder.create().build(); } //---------------------- 建立的數據源 構建對應的 SqlSessionFactory。 ---------------------- @Bean(name = "secondSqlSessionFactory") public SqlSessionFactory secondSqlSessionFactory(@Qualifier("secondDatasource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:/mapper/second/*.xml")); return bean.getObject(); } //------------------------ 配置事務 -------------------------- @Bean(name = "secondTransactionManager") public DataSourceTransactionManager secondTransactionManager(@Qualifier("secondDatasource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } //------------------------------- 注入 SqlSessionFactory 到 SqlSessionTemplate 中--------------------------------- @Bean(name = "secondSqlSessionTemplate") public SqlSessionTemplate secondSqlSessionTemplate(@Qualifier("secondSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> </configuration>
public interface User1Mapper { public void inserts(User user); }
public interface User2Mapper { public void inserts(User user); }
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.demo.mapper.one.User1Mapper"> <insert id="inserts" parameterType="com.example.demo.pojo.User" useGeneratedKeys="true" keyProperty="id"> insert into user(`name`,age) VALUE (#{name},#{age}) </insert> </mapper>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.demo.mapper.one.User2Mapper"> <insert id="inserts" parameterType="com.example.demo.pojo.User" useGeneratedKeys="true" keyProperty="id"> insert into user(`name`,age) VALUE (#{name},#{age}) </insert> </mapper>
表示數據源建立成功,這裏鏈接池採用springboot默認的Hikari數據庫鏈接池(不須要配置)git
@Autowired User1Mapper user1Mapper; @Autowired User2Mapper user2Mapper; @Test public void test(){ user1Mapper.inserts(new User(22L, "a123456",1)); user1Mapper.inserts(new User(33L, "b123456", 1)); user2Mapper.inserts(new User(44L, "b123456", 1)); }
結果github
官方文檔 : https://github.com/alibaba/dr...spring
增長配置文件 , 更換爲durid數據源sql
# StatViewServlet 配置 spring.datasource.druid.stat-view-servlet.login-username=admin spring.datasource.druid.stat-view-servlet.login-password=admin # 配置 StatFilter spring.datasource.druid.filter.stat.log-slow-sql=true spring.datasource.druid.filter.stat.slow-sql-millis=2000 # Druid 數據源 1 配置 spring.datasource.druid.one.initial-size=3 spring.datasource.druid.one.min-idle=3 spring.datasource.druid.one.max-active=10 spring.datasource.druid.one.max-wait=60000 # Druid 數據源 2 配置 spring.datasource.druid.second.initial-size=6 spring.datasource.druid.second.min-idle=6 spring.datasource.druid.second.max-active=20 spring.datasource.druid.second.max-wait=120000
將上面數據庫配置文件前綴加上druid數據庫
如:springboot
# StatViewServlet 配置 spring.datasource.druid.stat-view-servlet.login-username=admin spring.datasource.druid.stat-view-servlet.login-password=admin # 配置 StatFilter spring.datasource.druid.filter.stat.log-slow-sql=true spring.datasource.druid.filter.stat.slow-sql-millis=2000 # Druid 數據源 1 配置 spring.datasource.druid.one.initial-size=3 spring.datasource.druid.one.min-idle=3 spring.datasource.druid.one.max-active=10 spring.datasource.druid.one.max-wait=60000 # Druid 數據源 2 配置 spring.datasource.druid.second.initial-size=6 spring.datasource.druid.second.min-idle=6 spring.datasource.druid.second.max-active=20 spring.datasource.druid.second.max-wait=120000 #mybatis.type-aliases-package = com.example.demo.pojo ################# mysql 數據源1 ################# spring.datasource.druid.one.url=jdbc:mysql://localhost:3306/user?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true spring.datasource.druid.one.username=root spring.datasource.druid.one.password=root spring.datasource.druid.one.driver-class-name=com.mysql.jdbc.Driver ################# mysql 數據源1 ################# ################# mysql 數據源2 ################# spring.datasource.druid.second.url=jdbc:mysql://xxxxxxxxxxx:3306/user?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true spring.datasource.druid.second.username=root spring.datasource.druid.second.password=root spring.datasource.druid.second.driver-class-name=com.mysql.jdbc.Driver ################# mysql 數據源1 #################
<!--druid--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency>
而後在加載數據源配置哪兒讀取配置文件註解改成mybatis
@ConfigurationProperties(prefix = "spring.datasource.druid.one") @ConfigurationProperties(prefix = "spring.datasource.druid.second")
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
Reason: Failed to determine a suitable driver class
緣由是:url連接寫錯了 , SpringBoot duridd沒法配置到 數據源urlapp
錯誤:spring.datasource.druid.one.jdbc-url=jdbc:mysql://localhost:3306/user? 這是jdbc的url連接 正確 : spring.datasource.druid.one.url=jdbc:mysql://localhost:3306/user? 這是鏈接池用的url