1 配置文件
在配置文件中配置兩個數據源配置,以及mybatis xml配置文件路徑
# 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 #################
2 數據庫配置代碼:
1 步驟
1 首先加載配置的數據源:手動將數據配置文件信息注入到數據源實例對象中。
2 根據創建的數據源,配置數據庫實例對象注入到SqlSessionFactory 中,構建對應的 SqlSessionFactory。
3 配置數據庫事務:將數據源添加到事務中。
4 將SqlSessionFactory 注入到SqlSessionTemplate 模板中
5 最後將上面創建的 SqlSessionTemplate 注入到對應的 Mapper 包路徑下,這樣這個包下面的 Mapper 都會使用第一個數據源來進行數據庫操作。
basePackages 指明 Mapper 地址。
sqlSessionTemplateRef 指定 Mapper 路徑下注入的 sqlSessionTemplate。
在多數據源的情況下,不需要在啓動類添加:@MapperScan("com.xxx.mapper") 的註解。
2 項目結構:
3 第一個數據源
@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);
}
}
3 xml文件
<?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>
4 mapper 類
public interface User1Mapper {
public void inserts(User user);
}
public interface User2Mapper {
public void inserts(User user);
}
5 mybatis mapper.xml
<?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>
3 啓動成功
表示數據源創建成功,這裏連接池採用springboot默認的Hikari數據庫連接池(不需要配置)
6 測試
@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));
}
結果
7 更換數據源配置
官方文檔 : https://github.com/alibaba/dr...
增加配置文件 , 更換爲durid數據源
1 配置文件增加配置屬性
# 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
如:
# 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 #################
2 引入依賴
<!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
然後在加載數據源配置哪兒讀取配置文件註解改爲
@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無法配置到 數據源url
錯誤:spring.datasource.druid.one.jdbc-url=jdbc:mysql://localhost:3306/user? 這是jdbc的url鏈接
正確 : spring.datasource.druid.one.url=jdbc:mysql://localhost:3306/user? 這是連接池用的url