這篇文章主要講解了“Springboot整合多數據源配置流程是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Springboot整合多數據源配置流程是什么”吧!
主要介紹兩種整合方式,分別是 springboot+mybatis 使用分包方式整合,和 springboot+druid+mybatisplus 使用注解方式整合。
spring-boot-starter-web
mybatis-spring-boot-starter
mysql-connector-java
pom.xml jar包如下:
<!-- spring 依賴 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- mysql 依賴 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.0</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency>
server:port:8080# 啟動端口spring:datasource:db1:# 數據源1jdbc-url:jdbc:mysql://localhost:3306/db1?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8username:rootpassword:rootdriver-class-name:com.mysql.cj.jdbc.Driverdb2:# 數據源2jdbc-url:jdbc:mysql://localhost:3306/db2?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8username:rootpassword:rootdriver-class-name:com.mysql.cj.jdbc.Driver
注意事項
各個版本的 springboot 配置 datasource 時參數有所變化,例如低版本配置數據庫 url 時使用 url 屬性,高版本使用 jdbc-url 屬性,請注意區分。
第一個配置文件
@Configuration@MapperScan(basePackages = "com.qizhidao.demo.mapper.db1", sqlSessionFactoryRef = "db1SqlSessionFactory")publicclassDataSourceConfig1 { @Primary// 表示這個數據源是默認數據源, 這個注解必須要加,因為不加的話spring將分不清楚那個為主數據源(默認數據源)@Bean("db1DataSource")@ConfigurationProperties(prefix = "spring.datasource.db1")//讀取application.yml中的配置參數映射成為一個對象public DataSource getDb1DataSource(){ return DataSourceBuilder.create().build(); } @Primary@Bean("db1SqlSessionFactory")public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource)throws Exception { SqlSessionFactoryBeanbean=newSqlSessionFactoryBean(); bean.setDataSource(dataSource); // mapper的xml形式文件位置必須要配置,不然將報錯:no statement (這種錯誤也可能是mapper的xml中,namespace與項目的路徑不一致導致) bean.setMapperLocations(newPathMatchingResourcePatternResolver().getResources("classpath*:mapping/db1/*.xml")); return bean.getObject(); } @Primary@Bean("db1SqlSessionTemplate")public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory){ returnnewSqlSessionTemplate(sqlSessionFactory); } }
第二個配置文件
@Configuration@MapperScan(basePackages = "com.example.demon.mapper.db2", sqlSessionFactoryRef = "db2SqlSessionFactory")publicclassDataSourceConfig2{ @Bean("db2DataSource")@ConfigurationProperties(prefix = "spring.datasource.db2")public DataSource getDb1DataSource(){ return DataSourceBuilder.create().build(); } @Bean("db2SqlSessionFactory")public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapping/db2/*.xml")); return bean.getObject(); } @Bean("db2SqlSessionTemplate")public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory){ return new SqlSessionTemplate(sqlSessionFactory); } }
項目結構如下:
注意事項
在 service 層中根據不同的業務注入不同的 dao 層
如果是主從復制- -讀寫分離:比如 db1 中負責增刪改,db2 中負責查詢。但是需要注意的是負責增刪改的數據庫必須是主庫(master)
spring-boot-starter-web
mybatis-plus-boot-starter
dynamic-datasource-spring-boot-starter # 配置動態數據源
druid-spring-boot-starter # 阿里的數據庫連接池
mysql-connector-java
pom.xml 引入jar如下:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.2.0</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>2.5.6</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.20</version></dependency>
server:port:8080spring:datasource:dynamic:primary:db1# 配置默認數據庫datasource:db1:# 數據源1配置url:jdbc:mysql://localhost:3306/db1?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8username:rootpassword:rootdriver-class-name:com.mysql.cj.jdbc.Driverdb2:# 數據源2配置url:jdbc:mysql://localhost:3306/db2?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8username:rootpassword:rootdriver-class-name:com.mysql.cj.jdbc.Driverdurid:initial-size:1max-active:20min-idle:1max-wait:60000autoconfigure:exclude:com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure# 去除druid配置
DruidDataSourceAutoConfigure會注入一個DataSourceWrapper,其會在原生的spring.datasource下找 url, username, password 等。動態數據源 URL 等配置是在 dynamic 下,因此需要排除,否則會報錯。排除方式有兩種,一種是上述配置文件排除,還有一種可以在項目啟動類排除:
@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)publicclassApplication { publicstaticvoidmain(String[] args) { SpringApplication.run(Application.class, args); } }
@DS 可以注解在方法上和類上,同時存在方法注解優先于類上注解。
注解在 service 實現或 mapper 接口方法上,不要同時在 service 和 mapper 注解。
@DS("db2")publicinterfaceUserMapperextendsBaseMapper<User> { } @Service@DS("db2")publicclassModelServiceImplextendsServiceImpl<ModelMapper, Model> implementsIModelService {} @Select("SELECT * FROM user")@DS("db2") List<User> selectAll();
感謝各位的閱讀,以上就是“Springboot整合多數據源配置流程是什么”的內容了,經過本文的學習后,相信大家對Springboot整合多數據源配置流程是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。