Spring Boot 整合mybatis 使用多數(shù)據(jù)源的實(shí)現(xiàn)方法
前言
本篇教程偏向?qū)崙?zhàn),程序猿直接copy代碼加入到自己的項(xiàng)目中做簡單的修修改改便可使用,而對(duì)于springboot以及mybatis不在此進(jìn)行展開介紹,如有讀者希望了解可以給我留言,并持續(xù)關(guān)注,我后續(xù)會(huì)慢慢更新。(黑色區(qū)域代碼部分,安卓手機(jī)可手動(dòng)向左滑動(dòng),來查看全部代碼)
整合
其實(shí)整合很簡單,如果是用gradle的話,在build.gradle文件里加入
compile('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.1')
如果是用maven的話在pom.xml文件里加入
單庫配置:
引入之后,默認(rèn)情況下,Spring Boot會(huì)自動(dòng)為我們配置好一個(gè)DataSource,它會(huì)在classpath中搜索H2、hsqldb等內(nèi)存數(shù)據(jù)庫的jar包,如果找到了,就會(huì)自動(dòng)配置一個(gè)內(nèi)存數(shù)據(jù)庫的DataSource。
如果在application.yml或application.property中指定了spring.datasource.*的相關(guān)配置參數(shù),Spring Boot就會(huì)使用該配置創(chuàng)建一個(gè)DataSource。
然后會(huì)自動(dòng)創(chuàng)建使用該DataSource的SqlSessionFactoryBean以及SqlSessionTemplate。會(huì)自動(dòng)掃描你的Mappers,連接到SqlSessionTemplate,并注冊(cè)到Spring上下文中。
spring.datasource.url=jdbc:mysql://localhost/test spring.datasource.username=dbuser spring.datasource.password=dbpass spring.datasource.driver-class-name=com.mysql.jdbc.Driver
更多參數(shù)請(qǐng)查看DataSourceProperties
多庫配置:
由于業(yè)務(wù)需要,項(xiàng)目要同時(shí)使用多個(gè)數(shù)據(jù)庫進(jìn)行業(yè)務(wù)開發(fā):
首先,我們必須在application.property中自定義兩個(gè)數(shù)據(jù)源的配置,一個(gè)使用first.datasource.*,另一個(gè)使用second.datasource.*,為了能使別人一眼看出連接的是什么庫,可以使用數(shù)據(jù)庫命名,比如user庫,則可以使用user.datasource.*,在使用多數(shù)據(jù)源的時(shí)候,所有必要配置都不能省略。
first.datasource.url=jdbc:mysql://localhost/first first.datasource.username=dbuser1 first.datasource.password=dbpass1 first.datasource.driver-class-name=com.mysql.jdbc.Driver first.datasource.type=com.alibaba.druid.pool.DruidDataSource//我用的是Druid,也可以不加用默認(rèn)的 second.datasource.url=jdbc:mysql://localhost/second second.datasource.username=dbuser2 second.datasource.password=dbpass2 second.datasource.driver-class-name=com.mysql.jdbc.Driver second.datasource.type=com.alibaba.druid.pool.DruidDataSource
直接上代碼,我的做法是將兩個(gè)數(shù)據(jù)源用兩個(gè)配置類創(chuàng)建:
@Configuration
@MapperScan(basePackages = {"com.user.server.dao"}, sqlSessionTemplateRef = "userSqlSessionTemplate")
public class UserMybatisConfig {
@Bean(name = "userDataSource")
@Primary //必須加此注解,不然報(bào)錯(cuò),下一個(gè)類則不需要添加
@ConfigurationProperties(prefix = "first.datasource") // prefix值必須是application.properteis中對(duì)應(yīng)屬性的前綴
public DataSource userDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public SqlSessionFactory userSqlSessionFactory(@Qualifier("userDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
//添加XML目錄
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
try {
bean.setMapperLocations(resolver.getResources("classpath*:com/user/server/dao/mapping/*.xml"));
return bean.getObject();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Bean
public SqlSessionTemplate userSqlSessionTemplate(@Qualifier("userSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory); // 使用上面配置的Factory
return template;
}
}
@Configuration
@MapperScan(basePackages = {"com.airmi.server.dao"}, sqlSessionTemplateRef = "autoTestSqlSessionTemplate")
public class AutoTestMybatisConfig {
@Bean
@ConfigurationProperties(prefix = "autotest.datasource")
public DataSource autoTestDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public SqlSessionTemplate autoTestSqlSessionTemplate(@Qualifier("autoTestSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory);
return template;
}
@Bean
public SqlSessionFactory autoTestSqlSessionFactory(@Qualifier("autoTestDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
//添加XML目錄
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
try {
bean.setMapperLocations(resolver.getResources("classpath*:com/airmi/server/dao/mapping/*.xml"));
return bean.getObject();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
@Primary //該注解表示在同一個(gè)接口有多個(gè)實(shí)現(xiàn)類可以注入的時(shí)候,默認(rèn)選擇哪一個(gè),而不是讓autowire注解報(bào)錯(cuò),官網(wǎng)要求當(dāng)多個(gè)數(shù)據(jù)源時(shí),必須指定一個(gè)datasource,另一個(gè)datasource則不用添加。
@Qualifier 根據(jù)名稱進(jìn)行注入,通常是在具有相同的多個(gè)類型的實(shí)例的一個(gè)注入(例如有多個(gè)DataSource類型的實(shí)例)。
@MapperScan (basePackages = {"com.user.server.dao"}, sqlSessionTemplateRef = "userSqlSessionTemplate") basePackages為mapper所在的包,sqlSessionTemplateRef要引用的實(shí)例。
user代碼結(jié)構(gòu)如下:
總結(jié)
以上所述是小編給大家介紹的Spring Boot 整合mybatis 使用多數(shù)據(jù)源的實(shí)現(xiàn)方法,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Java基于fork/koin類實(shí)現(xiàn)并發(fā)排序
這篇文章主要介紹了Java基于fork/koin類實(shí)現(xiàn)并發(fā)排序,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02
RabbitMQ實(shí)現(xiàn)Work Queue工作隊(duì)列的示例詳解
工作隊(duì)列(又稱任務(wù)隊(duì)列)的主要思想是避免立即執(zhí)行資源密集型任務(wù),而不得不等待它完成。本篇文章將記錄和分享RabbitMQ工作隊(duì)列相關(guān)的知識(shí)點(diǎn),希望對(duì)大家有所幫助2023-01-01
淺談Java內(nèi)存模型之happens-before
于存在線程本地內(nèi)存和主內(nèi)存的原因,再加上重排序,會(huì)導(dǎo)致多線程環(huán)境下存在可見性的問題。那么我們正確使用同步、鎖的情況下,線程A修改了變量a何時(shí)對(duì)線程B可見?下面小編來簡單介紹下2019-05-05
詳解idea從git上拉取maven項(xiàng)目詳細(xì)步驟
這篇文章主要介紹了詳解idea從git上拉取maven項(xiàng)目詳細(xì)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
SpringBoot實(shí)現(xiàn)圖形驗(yàn)證碼生成的方法
驗(yàn)證碼可以有效防止其他人對(duì)某一個(gè)特定的注冊(cè)用戶用特定的程序暴力 破解方式進(jìn)行不斷的登錄嘗試,斷的登錄嘗試2025-03-03
我們其實(shí)很經(jīng)??吹?登錄一些網(wǎng)站其實(shí)是需要驗(yàn)證碼的,本文給大家介紹了SpringBoot實(shí)現(xiàn)圖形驗(yàn)證碼生成的方法,需要的朋友可以參考下
java實(shí)現(xiàn)MD5加密的方法小結(jié)
這篇文章主要介紹了java實(shí)現(xiàn)MD5加密的方法,結(jié)合具體實(shí)例形式總結(jié)分析了java實(shí)現(xiàn)md5加密的常用操作技巧與使用方法,需要的朋友可以參考下2017-10-10
JDK動(dòng)態(tài)代理的深入理解與實(shí)際應(yīng)用
這篇文章主要介紹了JDK動(dòng)態(tài)代理的深入理解與實(shí)際應(yīng)用,在Java的世界里,JDK的動(dòng)態(tài)代理是一項(xiàng)非常強(qiáng)大且實(shí)用的技術(shù),它為我們?cè)谶\(yùn)行時(shí)動(dòng)態(tài)地創(chuàng)建代理類提供了可能,從而實(shí)現(xiàn)對(duì)目標(biāo)對(duì)象方法調(diào)用的靈活攔截和增強(qiáng),需要的朋友可以參考下2025-02-02
Springboot快速集成sse服務(wù)端推流(最新整理)
SSE?Server-Sent?Events是一種允許服務(wù)器向客戶端推送實(shí)時(shí)數(shù)據(jù)的技術(shù),它建立在?HTTP?和簡單文本格式之上,提供了一種輕量級(jí)的服務(wù)器推送方式,通常也被稱為“事件流”(Event?Stream),這篇文章主要介紹了Springboot快速集成sse服務(wù)端推流(最新整理),需要的朋友可以參考下2024-02-02

