springBoot入門總結(六)整合多數據源的實現

爲什麼要在項目中整合多數據源?

在一些中大型的項目中,業務需求複雜,數據分佈散亂,項目的可維護性、穩定性、響應速度等時刻都面臨着挑戰,如何有效的解決這些問題,是我們需要考慮的問題。分佈式數據庫的讀寫分離,是一種不錯的解決方案,要實現讀寫分離便離不開多數據源的整合。當然,這只是我們使用多數據源的一種情況。

接下來我們通過講解 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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章