[SpringBoot實(shí)戰(zhàn)]快速配置多數(shù)據(jù)源(整合MyBatis)

前言

由于業(yè)務(wù)需求僧免,需要同時在SpringBoot中配置兩套數(shù)據(jù)源(連接兩個數(shù)據(jù)庫)辞色,要求能做到service層在調(diào)用各數(shù)據(jù)庫表的mapper時能夠自動切換數(shù)據(jù)源图云,也就是mapper自動訪問正確的數(shù)據(jù)庫劲够。

本文內(nèi)容:

  • 在Springboot+Mybatis項目的基礎(chǔ)上聊疲,學(xué)習(xí)多數(shù)據(jù)源的快速配置
  • 避免網(wǎng)上某些配置數(shù)據(jù)源文章的深坑

正文

多數(shù)據(jù)源配置實(shí)戰(zhàn)(整合MyBatis)

SpringBoot版本:2.0.6.RELEASE

項目結(jié)構(gòu)圖(原諒我保護(hù)隱私代碼):

image.png

排除SpringBoot的自動配置類DataSourceAutoConfiguration

首先要在@SpringBootApplication排除該類,因?yàn)樗鼤x取application.properties文件的spring.datasource.*屬性并自動配置單數(shù)據(jù)源

@SpringBootApplication(exclude = {
        DataSourceAutoConfiguration.class
})

在application.properties中配置多數(shù)據(jù)源連接信息

你需要連接多少個數(shù)據(jù)庫源搭儒,就配置幾個越锈,名字可以自由命名代替db1,db2

# database
db.conn.str = useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useLocalSessionState=true&tinyInt1isBit=false

spring.datasource.db1.jdbc-url=jdbc:mysql://xxxx1:xxxx/xxxxx1?${db.conn.str}
spring.datasource.db1.username=xxxxx
spring.datasource.db1.password=xxxxx
spring.datasource.db1.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.db2.jdbc-url=jdbc:mysql://xxxxx2:xxxx/xxxxx2?${db.conn.str}
spring.datasource.db2.username=xxxxx
spring.datasource.db2.password=xxxxx
spring.datasource.db2.driver-class-name=com.mysql.jdbc.Driver

注意:這里請一定將spring.datasource.db1.url改為spring.datasource.db1.jdbc-url

官方文檔的解釋是:因?yàn)檫B接池的實(shí)際類型沒有被公開,所以在您的自定義數(shù)據(jù)源的元數(shù)據(jù)中沒有生成密鑰膘滨,而且在IDE中沒有完成(因?yàn)镈ataSource接口沒有暴露屬性)。另外火邓,如果您碰巧在類路徑上有Hikari,那么這個基本設(shè)置就不起作用了摇天,因?yàn)镠ikari沒有url屬性(但是確實(shí)有一個jdbcUrl屬性)腕让。在這種情況下觉鼻,您必須重寫您的配置如下:

手動創(chuàng)建數(shù)據(jù)庫配置類

由于我們禁掉了自動數(shù)據(jù)源配置,因些下一步就需要手動將這些數(shù)據(jù)源創(chuàng)建出來若未,創(chuàng)建DataSourceConfig類

@Configuration
public class DataSourceConfig {

    @Bean(name = "db1")
    @ConfigurationProperties(prefix = "spring.datasource.db1")
    public DataSource businessDbDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "db2")
    @ConfigurationProperties(prefix = "spring.datasource.db2")
    public DataSource newhomeDbDataSource() {
        return DataSourceBuilder.create().build();
    }
}

分別配置不同數(shù)據(jù)源的mybatis的SqlSessionFactory

這樣做可以讓我們的不同包名底下的mapper自動使用不同的數(shù)據(jù)源

創(chuàng)建Db1Config:

/**
 * @author yangzhendong01
 */
@Configuration
@MapperScan(basePackages = {"com.xxxxx.webApi.mapper.db1"}, sqlSessionFactoryRef = "sqlSessionFactoryDb1")
public class Db1Config {

    @Autowired
    @Qualifier("db1")
    private DataSource dataSourceDb1;


    @Bean
    public SqlSessionFactory sqlSessionFactoryDb1() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSourceDb1);
        factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/db1/*.xml"));
        return factoryBean.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplateDb1() throws Exception {
        return new SqlSessionTemplate(sqlSessionFactoryDb1());
    }

}

創(chuàng)建Db2Config:

/**
 * @author yangzhendong01
 */
@Configuration
@MapperScan(basePackages = {"com.xxxxx.webApi.mapper.db2"}, sqlSessionFactoryRef = "sqlSessionFactoryDb2")
public class Db2Config {

    @Autowired
    @Qualifier("db2")
    private DataSource dataSourceDb2;


    @Bean
    public SqlSessionFactory sqlSessionFactoryDb2() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSourceDb2);
        factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/db2/*.xml"));
        return factoryBean.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplateDb2() throws Exception {
        return new SqlSessionTemplate(sqlSessionFactoryDb2());
    }

}

注意:此步一定要添加mapper.xml文件掃描路徑行冰,否則報錯Invalid bound statement (not found)

factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/xxxxxx/*.xml"));

完成這些配置后朽色,假設(shè)我們有2個Mapper mapper.db1.xxxMapper和mapper.db2.xxxMapper,我們在程序的任何位置使用前者時會自動連接db1庫,后者連接db2庫。

參考文獻(xiàn)

主要參考:

https://blog.csdn.net/neosmith/article/details/61202084

其他參考:

http://blog.didispace.com/springbootmultidatasource/

總結(jié)

本文在一個Springboot+Mybatis項目的基礎(chǔ)上讯私,學(xué)習(xí)多數(shù)據(jù)源的快速配置热押。

祝大家國慶節(jié)假期快樂!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末斤寇,一起剝皮案震驚了整個濱河市桶癣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌娘锁,老刑警劉巖牙寞,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡间雀,警方通過查閱死者的電腦和手機(jī)悔详,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惹挟,“玉大人茄螃,你說我怎么就攤上這事》嘶停” “怎么了责蝠?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長萎庭。 經(jīng)常有香客問我,道長齿拂,這世上最難降的妖魔是什么驳规? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮署海,結(jié)果婚禮上吗购,老公的妹妹穿的比我還像新娘。我一直安慰自己砸狞,他們只是感情好捻勉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刀森,像睡著了一般踱启。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上研底,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天埠偿,我揣著相機(jī)與錄音,去河邊找鬼榜晦。 笑死冠蒋,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的乾胶。 我是一名探鬼主播抖剿,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼识窿!你這毒婦竟也來了斩郎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤腕扶,失蹤者是張志新(化名)和其女友劉穎孽拷,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體半抱,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脓恕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年膜宋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炼幔。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡秋茫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出乃秀,到底是詐尸還是另有隱情肛著,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布跺讯,位于F島的核電站枢贿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏刀脏。R本人自食惡果不足惜局荚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望愈污。 院中可真熱鬧耀态,春花似錦、人聲如沸暂雹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杭跪。三九已至仙逻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間揍魂,已是汗流浹背桨醋。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留现斋,地道東北人喜最。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像庄蹋,于是被迫代替她去往敵國和親瞬内。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容