1. 程式人生 > >Spring boot 瞭解(五)(配置多資料來源)

Spring boot 瞭解(五)(配置多資料來源)

一個專案裡面訪問多個數據庫的操作,記錄如下:

(學習地址:https://www.majiaxueyuan.com/front/couinfo/36

目錄

1.application.properties檔案配置

2.建立Configure

3.建立mapper

4.執行訪問


1.application.properties檔案配置

因為是訪問多個數據庫 所以需要多個數據庫資訊,在application.properties中去配置兩個資料庫訪問的路徑

我的如下:

spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/learnboot1?characterEncoding=utf-8
spring.datasource.primary.username=root
spring.datasource.primary.password=123456
spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/learnboot?characterEncoding=utf-8
spring.datasource.secondary.username=root
spring.datasource.secondary.password=123456
spring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver

這樣的話會產生applicaion.properties配置檔案就可以了

2.建立Configure

這個是去配置每個資料庫的配置類

需要這四個方法:

 public DataSource dataSource() {}
 public SqlSessionFactory SqlSessionFactory(){}
 public DataSourceTransactionManager dataSourceTransactionManager(){}
 public SqlSessionTemplate sqlSessionTemplate(){}


/*
這四個方法的作用如下:

建立資料來源Datasource指定使用的哪個資料來源配置,並將其注入到SqlSessionFactory 會話工廠;
建立事務TransactionManager,需把資料來源注入;
把SqlSessionFactory 注入,建立sqlSessionTemplate模板,使用模板操作mapper介面;
把模板放到mapper 路徑下,並 @MapperScan註解 宣告mapper介面位置;
*/

第一個DataSource()方法是用於去獲取一個數據源,

第二個SqlSessionFactory()是將datasource放入到會話工廠

第三個是建立一個事務的管理,也是將datasource注入進去

第四個是個模版,去操作Mapper介面

我的configure類的編寫具體如下:

1,建立類,並且需要將@configure註解和mapper掃描路徑寫進去

@Configuration  //註解這個是一個Configure

//MapperScan mapper的掃描路徑的配置
//basePackages mapper的掃描路徑 
//sqlSessionTemplateRef 需要套用的模版
@MapperScan(basePackages = "com.zqj.mutildatasource.mapper", sqlSessionTemplateRef = "primarySqlSessionTemplate")  

public class PriamryDataSourceConfigure {

1.dataSource(){}

2.SqlSessoinFactory(){}

3.DataSourceTransactionManager(){}

4.SqlSessionTemplate(){}

}

接下來是去配置剩下的東西

2,建立dataSource方法,配置需要連結哪個資料庫(我這裡展示的是主庫的配置類程式碼,還有一個庫的配置程式碼和主庫基本一致,除了沒有@Primary註解 和 配置的名字不一致,方法都一樣)

.....
public class PriamryDataSourceConfigure {
 //主庫

    //datasource(){}

    @Bean(name = "primaryDataSource")    //配置屬性為primaryDataSource
   
    //這個是application.properties中配置的資料庫屬性的字首,區分使用哪個資料來源庫
    @ConfigurationProperties(prefix = "spring.datasource.primary")   
    @Primary   //這個是設定為主庫,必須有一個庫是主庫
    public DataSource primaryDataSource() {
        System.out.println("-------------------- primaryDataSource init ---------------------");
        return DataSourceBuilder.create().build();  //返回生成好的資料庫源
    }

........

}

3,配置SqlSessionFactory的會話工廠

public class PriamryDataSourceConfigure{


//sqlSessoinFactory(){}

@Bean(name = "primarySqlSessionFactory") //設定屬性,
    @Primary  //主庫
    public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception { //@Qualifier根據名字注入屬性,放置剛剛建立的datasource 

        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);//放置剛剛建立的datasource
        return bean.getObject(); 返回得到的SqlSessionFactory物件
    }

}

4,配置事務的管理的一個方法


public class PriamryDataSourceConfigure {


   //trascationManage(){}

 @Bean(name = "primaryTrascationManager")  //配置屬性
    @Primary  //主庫用的
    public DataSourceTransactionManager primarydataSourceTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {  //注入datasource
        return new DataSourceTransactionManager(dataSource); 
    }

}

5,建立模版,用於操作mapper

 
//tempate(){}

  @Bean(name = "primarySqlSessionTemplate")
    @Primary
    public SqlSessionTemplate primarysqlSessionTemplate(@Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {

        SqlSessionTemplate sqlSessionTemplate =  new SqlSessionTemplate(sqlSessionFactory);

        return sqlSessionTemplate;
    }

這個配置主庫的連線的配置類就寫好了,去掃描com.zqj.mutildatasource.mapper這個路徑下的mapper介面。讓mapper裡的sql語句去訪問

spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/learnboot1

這個learnboot1資料庫裡的表

主類配置的完整資訊。

@Configuration
@MapperScan(basePackages = "com.zqj.mutildatasource.mapper", sqlSessionTemplateRef = "primarySqlSessionTemplate")
public class PriamryDataSourceConfigure {

    //主庫

    @Bean(name = "primaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    @Primary
    public DataSource primaryDataSource() {
        System.out.println("-------------------- primaryDataSource init ---------------------");
        return DataSourceBuilder.create().build();
    }


    @Bean(name = "primarySqlSessionFactory")
    @Primary
    public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean.getObject();
    }

    @Bean(name = "primaryTrascationManager")
    @Primary
    public DataSourceTransactionManager primarydataSourceTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {
        return new DataSourceTransactionManager(dataSource);
    }


    @Bean(name = "primarySqlSessionTemplate")
    @Primary
    public SqlSessionTemplate primarysqlSessionTemplate(@Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {

        SqlSessionTemplate sqlSessionTemplate =  new SqlSessionTemplate(sqlSessionFactory);

        return sqlSessionTemplate;
    }

還有一個非主庫的資料庫,也要寫一個一樣的配置類,不過需要修改的是掃描的mapper包路徑和連線的資料庫地址。

完整類如下:

@Configuration
@MapperScan(basePackages = "com.zqj.mutildatasource.mapper1", sqlSessionTemplateRef = "secondarySqlSessionTemplate")

public class SecondaryDataSourceConfigure {

    //非主庫

    @Bean("secondaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        System.out.println("-------------------- secondaryDataSource init ---------------------");
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "secondarySqlSessionFactory")
    public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return  bean.getObject();
       
    }


    @Bean(name = "secondaryTrascationManager")
    public DataSourceTransactionManager secondarydataSourceTransactionManager(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception {
        return new DataSourceTransactionManager(dataSource);
    }


    @Bean(name = "secondarySqlSessionTemplate")
    public SqlSessionTemplate secondarysqlSessionTemplate(@Qualifier("secondarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {

        SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);

        return sqlSessionTemplate;
    }


}

注意沒有@Primary

3.建立mapper

這裡因為我寫了兩個配置類,按理說就有兩個mapper包

如下:

第一個mapper包是去訪問主庫的連線

第二個mapper包是去訪問非主庫的資料庫的連線

然後建立mapper

(隨便寫一個訪問資料庫的方法)

比如我的:mapper包下Usermapper

@Mapper
@Component
public interface UserMapper {

    @Select("select * from users where id = #{id}")
    User findUserById(@Param("id") Integer id);

}

mapper對應的連線的資料庫的表資料有:

mapper1包下的OrderMapper介面的方法:

@Mapper
public interface Ordermapper {

    @Select("select * from orders where id = #{id}")
    Order getOrderById(@Param("id") Integer id);

}

對應的資料庫裡的orders表資料有:

 

4.執行訪問

建立一個Controller

去放載入兩個mapper然後返回一個json串到頁面

@RestController
public class UserController {


    @Autowired
    UserMapper userMapper;
    
    @Autowired
    Ordermapper ordermapper;

    @RequestMapping("/user1")  //訪問user表的 主庫
    public Object getUser1() {
        return userMapper.findUserById(1);
    }

    @RequestMapping("order2")  //訪問order表的 非主庫
    public Object getOrder() {
        return ordermapper.getOrderById(1);
    }

}

執行,訪問

 

(可以看看大佬寫的關於那幾個屬性的講解:http://www.pianshen.com/article/3415102997/)

以上。