一、配置單數據源
在學習配置多數據源之前,先來複習一下單數據源的配置。
創建好 SpringBoot 項目,在pom.xml
添加需要的依賴:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.22</version>
</dependency>
由於我們將 mapper.xml 和 mapper.java 放在相同的 java 目錄,所以還要添加如下配置,避免打包時java目錄下的xml文件被忽略掉:
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include> **/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
在項目啓動類上使用MapperScan
註解配置要掃描的 mapper 包路徑,需要將 mapper 文件放在這個目錄下:
@SpringBootApplication
@MapperScan("com.sh.mybatis.mapper")
public class MybatisApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisApplication.class, args);
}
}
然後在application.properties
進行數據庫連接的相關配置:
spring.datasource.url=jdbc:mysql://localhost:3306/mytest?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B0
spring.datasource.username=root
spring.datasource.password=shehuan
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 如果mapper.xml是放置在resources下邊的mapper目錄可以配置這個
# mybatis.mapper-locations=classpath:mapper/*.xml
# 打印sql
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
二、配置多數據源
在單數據源的基礎上我們完成多數據源的配置,我們以兩個數據源爲例。
首先pom.xml
不用做修改。
取消掉啓動類上的MapperScan
註解。
然後就是修改application.properties
,添加兩個數據源:
# 數據源1
spring.datasource.one.url=jdbc:mysql://localhost:3306/mytest?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B0
spring.datasource.one.username=root
spring.datasource.one.password=shehuan
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.one.driver-class-name=com.mysql.cj.jdbc.Driver
# 數據源2
spring.datasource.two.url=jdbc:mysql://localhost:3306/mytest2?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B0
spring.datasource.two.username=root
spring.datasource.two.password=shehuan
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.two.driver-class-name=com.mysql.cj.jdbc.Driver
接下來通過Configuration
配置類的像是來初始化兩個數據源:
@Configuration
public class DataSourceConfig {
@Bean(name = "dsOne")
@ConfigurationProperties(prefix = "spring.datasource.one")
DataSource dsOne() {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "dsTwo")
@ConfigurationProperties(prefix = "spring.datasource.two")
DataSource dsTwo() {
return DruidDataSourceBuilder.create().build();
}
}
由於是多數據源,我們無法在啓動類配置MapperScan
,所以需要爲每個數據源單獨配置要掃描的 mapper 文件目錄,以及創建SqlSessionFactory
、SqlSessionTemplate
。
@Configuration
@MapperScan(basePackages = "com.sh.mybatis.mapper", sqlSessionFactoryRef = "sqlSessionFactory1", sqlSessionTemplateRef = "sqlSessionTemplate1")
public class MyBatisConfigOne {
@Autowired
@Qualifier("dsOne")
DataSource dsOne;
@Bean
SqlSessionFactory sqlSessionFactory1() {
SqlSessionFactory sqlSessionFactory = null;
try {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dsOne);
sqlSessionFactory = bean.getObject();
} catch (Exception e) {
e.printStackTrace();
}
return sqlSessionFactory;
}
@Bean
SqlSessionTemplate sqlSessionTemplate1() {
return new SqlSessionTemplate(sqlSessionFactory1());
}
}
@Configuration
@MapperScan(basePackages = "com.sh.mybatis.mapper2", sqlSessionFactoryRef = "sqlSessionFactory2", sqlSessionTemplateRef = "sqlSessionTemplate2")
public class MyBatisConfigTwo {
@Autowired
@Qualifier("dsTwo")
DataSource dsTwo;
@Bean
SqlSessionFactory sqlSessionFactory2() {
SqlSessionFactory sessionFactory = null;
try {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dsTwo);
sessionFactory = bean.getObject();
} catch (Exception e) {
e.printStackTrace();
}
return sessionFactory;
}
@Bean
SqlSessionTemplate sqlSessionTemplate2() {
return new SqlSessionTemplate(sqlSessionFactory2());
}
}
最後只需要在com.sh.mybatis.mapper
、com.sh.mybatis.mapper2
兩個包下分別放置兩個數據源對應的 mapper.java、mapper.xml 文件即可,後邊的用法就沒有什麼特別之處了。