多數據源用到的場景很多,所以就寫了本篇文章進行演示如何配置多數據源。項目源碼地址點擊此處查看
項目依賴springboot2+mybatis+mysql
首先在mysql中創建數據庫db1和db2,然後分別在兩個數據庫中創建表test1和test2並插入演示數據
create DATABASE test1;
use test1;
create table test1(
id int not null,
name varchar(50)
);
insert into test1(id,name) values(2,'李四');
create DATABASE test2;
use test2;
create table test2(
id int not null,
name varchar(50)
);
insert into test2(id,name) values(1,'張三');
創建springboot項目並導入mybatis和mysql依賴
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
項目結構
application.properties配置數據源
spring.datasource.test1.jdbc-url=jdbc:mysql://localhost:3306/test1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.test1.username=root
spring.datasource.test1.password=root
spring.datasource.test1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.test2.jdbc-url=jdbc:mysql://localhost:3306/test2?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.test2.username=root
spring.datasource.test2.password=root
spring.datasource.test2.driver-class-name=com.mysql.cj.jdbc.Driver
MybatisTest1Config.java主數據源
package com.example.mybatis.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
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;
@Configuration
@MapperScan(basePackages = "com.example.mybatis.mapper.test1", sqlSessionTemplateRef = "test1SessionTemplate")
public class MybatisTest1Config {
@Bean(name = "test1")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.test1")
public DataSource test1() {
return DataSourceBuilder.create().build();
}
@Bean
@Primary
public SqlSessionFactory test1SessionFactory(@Qualifier("test1") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
//添加XML目錄
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:/mapper/test1/**/*Mapper.xml"));
return bean.getObject();
}
@Bean
@Primary
public DataSourceTransactionManager test1TransactionManager(@Qualifier("test1") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean
@Primary
public SqlSessionTemplate test1SessionTemplate(@Qualifier("test1SessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
MybatisTest2Config.java
package com.example.mybatis.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
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;
@Configuration
@MapperScan(basePackages = "com.example.mybatis.mapper.test2", sqlSessionTemplateRef = "test2SessionTemplate")
public class MybatisTest2Config {
@Bean(name = "test2")
@ConfigurationProperties(prefix = "spring.datasource.test2")
public DataSource test2() {
return DataSourceBuilder.create().build();
}
@Bean
public SqlSessionFactory test2SessionFactory(@Qualifier("test2") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:/mapper/test2/**/*Mapper.xml"));
return bean.getObject();
}
@Bean
public DataSourceTransactionManager test2TransactionManager(@Qualifier("test2") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean
public SqlSessionTemplate test2SessionTemplate(@Qualifier("test2SessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
這裏用了兩個數據庫進行演示,如果還要其它的可以繼續按上面示例增加類和application.properties數據庫配置,@Primary只需指定其中一個數據庫就行
Test1.java
package com.example.mybatis.entity;
public class Test1 {
private int id;
private String name;
@Override
public String toString() {
return "Test1{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Test2.java
package com.example.mybatis.entity;
public class Test2 {
private int id;
private String name;
@Override
public String toString() {
return "Test2{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Test1Mapper.java
package com.example.mybatis.mapper.test1;
import com.example.mybatis.entity.Test1;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface Test1Mapper {
@Select("select * from test1")
List<Test1> getAll();
}
Test2Mapper.java
package com.example.mybatis.mapper.test2;
import com.example.mybatis.entity.Test2;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface Test2Mapper {
@Select("select * from test2")
List<Test2> getAll();
}
TestService.java
package com.example.mybatis.service;
import com.example.mybatis.entity.Test1;
import com.example.mybatis.entity.Test2;
import com.example.mybatis.mapper.test1.Test1Mapper;
import com.example.mybatis.mapper.test2.Test2Mapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class TestService {
@Autowired
private Test1Mapper test1Mapper;
@Autowired
private Test2Mapper test2Mapper;
public void getStudents() {
List<Test1> test1 = test1Mapper.getAll();
List<Test2> test2 = test2Mapper.getAll();
System.out.println("數據源DB1:" + test1);
System.out.println("數據源DB2:" + test2);
}
}
TestController.java
package com.example.mybatis.controller;
import com.example.mybatis.service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@Autowired
private TestService testService;
@RequestMapping("/test")
public void getStudents() {
testService.getStudents();
}
}
最後啓動項目,瀏覽器訪問http://localhost:8080/test看控制檯打印結果