Spring boot 瞭解(五)(配置多資料來源)
一個專案裡面訪問多個數據庫的操作,記錄如下:
(學習地址:https://www.majiaxueyuan.com/front/couinfo/36)
目錄
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/)
以上。