爲什麼要在項目中整合多數據源?
在一些中大型的項目中,業務需求複雜,數據分佈散亂,項目的可維護性、穩定性、響應速度等時刻都面臨着挑戰,如何有效的解決這些問題,是我們需要考慮的問題。分佈式數據庫的讀寫分離,是一種不錯的解決方案,要實現讀寫分離便離不開多數據源的整合。當然,這只是我們使用多數據源的一種情況。
接下來我們通過講解 SpringBoot 整合 MyBatis 訪問 MySQL 多數據源來總結相關知識點。
現在我們考慮,假設在實際的項目應用中,有兩個不同的數據源 test01和test02,那麼項目中應該如何區分數據源?
在本地MySQL數據庫中分別創建t_user表,字段分別是 id(主鍵自增)、name(姓名)、age(年齡)
1、分包結構
將使用不同數據源的業務代碼分別放到不同的目錄結構中。
實現如下:
IDEA工具創建一個SpringBoot項目,並添加相關依賴。
Next
POM
編寫application.properties配置文件,並添加多數據源配置
spring.datasource.test01.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.test01.jdbc-url=jdbc:mysql://localhost:3306/test01?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
spring.datasource.test01.username=root
spring.datasource.test01.password=1q2w3e4r5t
spring.datasource.test02.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.test02.jdbc-url=jdbc:mysql://localhost:3306/test02?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
spring.datasource.test02.username=root
spring.datasource.test02.password=1q2w3e4r5t
分別創建 Test01DataSourceConfig 和 Test02DataSourceConfig 數據源配置類
@Configuration
@MapperScan(basePackages = "com.demo.mapper01", sqlSessionTemplateRef = "test01SqlSessionTemplate")
public class Test01DataSourceConfig {
@Bean(name = "test01DataSource")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.test01") //讀取配置文件中以 spring.datasource.test01 開頭的配置
public DataSource testDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "test01SqlSessionFactory")
@Primary
public SqlSessionFactory testSqlSessionFactory(@Qualifier("test01DataSource") DataSource dataSource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
}
@Bean(name = "test01SqlSessionTemplate")
@Primary
public SqlSessionTemplate testSqlSessionTemplate(
@Qualifier("test01SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
@Configuration
@MapperScan(basePackages = "com.demo.mapper02", sqlSessionTemplateRef = "test02SqlSessionTemplate")
public class Test02DataSourceConfig {
@Bean(name = "test02DataSource")
@ConfigurationProperties(prefix = "spring.datasource.test02")//讀取配置文件中以 spring.datasource.test02 開頭的配置
public DataSource testDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "test02SqlSessionFactory")
public SqlSessionFactory testSqlSessionFactory(@Qualifier("test02DataSource") DataSource dataSource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
}
@Bean(name = "test02SqlSessionTemplate")
public SqlSessionTemplate testSqlSessionTemplate(
@Qualifier("test02SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
注意 MapperScan basePackages 掃包範圍,對應不同的數據源
創建實體類對象 TUser
public class TUser {
//主鍵id
private Integer id;
//姓名
private String name;
//年齡
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
創建文件目錄 mapper01 及 mapper02,並新建MyBatis映射文件
/**
* 對應 Test01DataSourceConfig
**/
@Mapper
public interface UserMapper01 {
//保存對象
@Insert("insert into t_user (name,age) values (#{name},#{age})")
void save(TUser tUser);
//查找指定對象
@Select("select * from t_user where id = #{id}")
TUser findUser(Integer id);
//刪除指定對象
@Delete("delete from t_user where id = #{id}")
void deleteUser(Integer id);
}
/**
* 對應 Test02DataSourceConfig
**/
@Mapper
public interface UserMapper02 {
//保存對象
@Insert("insert into t_user (name,age) values (#{name},#{age})")
void save(TUser tUser);
//查找指定對象
@Select("select * from t_user where id = #{id}")
TUser findUser(Integer id);
//刪除指定對象
@Delete("delete from t_user where id = #{id}")
void deleteUser(Integer id);
}
創建Controller並引入 Mapper 對象
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserMapper01 userMapper01;
@Autowired
private UserMapper02 userMapper02;
@RequestMapping("/save01")
public String saveUser01(){
TUser user = new TUser();
user.setAge(30);
user.setName("A");
userMapper01.save(user);
return "success";
}
@RequestMapping("/save02")
public String saveUser02(){
TUser user = new TUser();
user.setAge(30);
user.setName("B");
userMapper02.save(user);
return "success";
}
@RequestMapping("/findUser01")
public TUser findUser01(@Param("id") Integer id){
return userMapper01.findUser(id);
}
@RequestMapping("/findUser02")
public TUser findUser02(@Param("id") Integer id){
return userMapper02.findUser(id);
}
}
以上就是全部代碼,下面我們來看看配置好多數據源的效果
啓動程序
訪問:http://localhost:8080/user/save01
訪問:http://localhost:8080/user/save02