Spring Boot整合MyBatis多數據源
在一些復雜的應用開發中,一個應用可能會涉及到連接多個數據源,所謂多數據源這里就定義為至少連接兩個及以上的數據庫了。
首先創建Spring Boot工程
添加MyBatis、Druid依賴(這里的Druid必須是專為Spring boot打造的Druid,不能使用傳統的Druid)、MySQL以及Web依賴,完整的依賴如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!--注意配置版本號-->
<version>5.1.28</version>
https://i.cnblogs.com/EditCategories.aspx?catid=1 <scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--druid連接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
</dependencies>
多數據源配置
接下來配置多數據源,在application.properties中配置數據庫基本信息,然后提供兩個DataSource即可,下面是簡單的application.properties中的配置:
spring.datasource.one.url=jdbc:mysql://localhost:3306/test01?useUnicode=true&characterEncoding=utf-8
spring.datasource.one.username=root
spring.datasource.one.password=123456
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.two.url=jdbc:mysql://localhost:3306/test02?useUnicode=true&characterEncoding=utf-8
spring.datasource.two.username=root
spring.datasource.two.password=123456
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource
然后創建DataSourceConfig 配置類,里面配置對應的兩個數據源:
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.one")
DruidDataSource dsOne() {
return DruidDataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.two")
DruidDataSource dsTwo() {
return DruidDataSourceBuilder.create().build();
}
}
MyBatis配置
這里需要配置兩個Bean,所以兩個數據源分兩個類配置:
@Configuration//聲明該類是一個配置類
@MapperScan(basePackages = "com.lwh.mybatistest.mapper", sqlSessionFactoryRef = "sqlSessionFactory1", sqlSessionTemplateRef = "sqlSessionTemplate1")
//掃描的包是com.lwh.mybatistest.mapper
//SqlSessionFactory根據dsOne創建,然后再根據創建好的SqlSessionFactory創建一個SqlSessionTemplate。
public class MyBatisConfigOne {
@Resource(name = "dsOne")
DataSource dsOne;
@Bean
SqlSessionFactory sqlSessionFactory1() {
SqlSessionFactory sessionFactory = null;
try {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dsOne);
sessionFactory = bean.getObject();
} catch (Exception e) {
e.printStackTrace();
}
return sessionFactory;
}
@Bean
SqlSessionTemplate sqlSessionTemplate1() {
return new SqlSessionTemplate(sqlSessionFactory1());
}
}
依照第一個配置,配置第二個數據源即可,這里需要注意因為操作的是不同的數據源,所以掃描的包是不一樣的,不同的Mapper將操作不同的數據源。如下:
@Configuration//聲明該類是一個配置類
@MapperScan(basePackages = "com.lwh.mybatistest.mapper2", sqlSessionFactoryRef = "sqlSessionFactory2", sqlSessionTemplateRef = "sqlSessionTemplate2")
public class MyBatisConfigTwo {
@Resource(name = "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());
}
}
項目結構如下:

上面的mapper.xml文件是用MyBatis逆向工程生成的,這里不再贅述。
在Maven項目中,官方建議我們把XML文件放在resources文件下,如果放在java下面,項目打包的時候會自動的過濾掉,所以我們在Maven的配置文件中,讓項目不要過濾我們的XML文件,因此我們需要在pom.xml配置文件中的 bulid 節點里面添加配置信息,如下:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
這樣項目在打包發布的時候,就不會過濾掉我們的mapper.xml文件了
數據庫one的數據為:

數據庫two的數據為:

現在去測試類測試我們的配置是否成功:
@RunWith(SpringRunner.class)
@SpringBootTest
public class MybatistestApplicationTests {
@Autowired
BookMapper bookMapper;
@Autowired
BookMapper2 bookMapper2;
@Test
public void contextLoads() {
List<Book> list = bookMapper.getAllBook();
System.out.println("第一個:" + list);
System.out.println("第二個:" + bookMapper2.getAllBook());
}
}
輸出結果為:
第一個:[Book{id=1, bookname='三國演義', author='羅貫中'}]
第二個:[Book{id=2, bookname='紅樓夢', author='曹雪芹'}]
因此我們的項目多數據源的操作就配置成功了!
總結:
1,首先給Spring Boot項目引入相關的依賴。
2,在application.properties中配置多個數據庫相關信息,創建DataSource配置類。
3,分別給不同的數據庫配置對應的Mybatis配置類,不同的mapper操作對應的數據庫。
以上配置教程參考江南一點雨的博客。
