spring boot下mybatis配置雙數(shù)據(jù)源的實(shí)例
最近項(xiàng)目上遇到需要雙數(shù)據(jù)源的來(lái)實(shí)現(xiàn)需求,并且需要基于spring boot,mybatis的方式來(lái)實(shí)現(xiàn),在此做簡(jiǎn)單記錄。
單一數(shù)據(jù)源配置
單一數(shù)據(jù)源配置的話并沒(méi)有什么特別的,在spring boot框架下,只需要在配置文件內(nèi)添加對(duì)應(yīng)的配置項(xiàng)即可,spring boot會(huì)自動(dòng)初始化需要用到的bean。
配置信息如下。這里使用的是德魯伊的數(shù)據(jù)源配置方式
#datasource配置 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://xxx spring.datasource.username=root spring.datasource.password=123456 #mybatis配置 #mybatis xmlMapper文件路徑 mybatis.mapper-locations=classpath:META-INF/mybatis/mapper/*Mapper.xml mybatis.configuration.map-underscore-to-camel-case=true #mappers mapper接口文件路徑 多個(gè)接口時(shí)逗號(hào)隔開(kāi) mapper.mappers=com.xxxx.xxxx mapper.not-empty=false mapper.identity=MYSQL
在使用mapper的時(shí)候,直接使用spring的注解注入即可。
多個(gè)數(shù)據(jù)源配置
假如需要新增配置一個(gè)數(shù)據(jù)源,那么在spring boot 框架下如何實(shí)現(xiàn)呢?在多數(shù)據(jù)源的情況下,數(shù)據(jù)源配置需要添加兩份,數(shù)據(jù)源、mybatis等使用到的bean不能再依賴(lài)spring boot替我們完成。
多數(shù)據(jù)源配置文件
配置文件改成如下,第二個(gè)數(shù)據(jù)源的配置前綴需要自定義為另外的。
#datasource 1配置 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://xxx spring.datasource.username=root spring.datasource.password=123456 #datasource 2配置,前綴改為second以區(qū)分第一個(gè)數(shù)據(jù)源 second.datasource.type=com.alibaba.druid.pool.DruidDataSource second.datasource.driver-class-name=com.mysql.jdbc.Driver second.datasource.url=jdbc:mysql://xxx second.datasource.username=root second.datasource.password=123456
多數(shù)據(jù)源配置類(lèi)
編寫(xiě)第一個(gè)數(shù)據(jù)源使用的配置類(lèi),如下所示。
對(duì)于Datasource的bean定義,需要使用@ConfigurationProperties(prefix = "spring.datasource")前綴匹配來(lái)指定使用第一個(gè)數(shù)據(jù)源的配置,同時(shí)還需要使用注解@Primary來(lái)指定當(dāng)有依賴(lài)注入需要注入datasource時(shí),優(yōu)先使用@Primary注解修飾的datasource。
對(duì)于SqlSessionFactory定義,我們無(wú)法依賴(lài)spring boot做自動(dòng)化配置實(shí)現(xiàn),有一些動(dòng)作需要我們手動(dòng)處理。首先是mapper.xml文件路徑的指定,這樣mapper接口才能注冊(cè)到mybatis容器中;假如你定義的的mapper接口沒(méi)有對(duì)應(yīng)的MapperXml,你還需要手動(dòng)指定mapper接口的包路徑作為參數(shù),調(diào)用addMappers的方法,進(jìn)行掃描注冊(cè),手動(dòng)注冊(cè)接口到mybatis容器中,一般這個(gè)過(guò)程在解析MapperXml文件時(shí)會(huì)由mybatis框架實(shí)現(xiàn)。
還有就是SqlSessionTemplate,DataSourceTransactionManager的定義,第一個(gè)數(shù)據(jù)源都需要配置為優(yōu)先注入。
上面所有的配置第一個(gè)數(shù)據(jù)源相關(guān)bean優(yōu)先注入都是為了方便spring容器,管理第一個(gè)數(shù)據(jù)源的mapper接口的代理類(lèi)實(shí)例bean。spring boot實(shí)現(xiàn)Mapper代理類(lèi)實(shí)例的注冊(cè)時(shí),是從容器中獲取一個(gè)SqlSessionTemplatebean,然后調(diào)用SqlSessionTemplate.getMapper()方法獲取一個(gè)實(shí)例的,因此SqlSessionTemplate優(yōu)先注入者,spring容器管理的Mapper代理類(lèi)就是對(duì)應(yīng)數(shù)據(jù)源定義的。所以第一個(gè)數(shù)據(jù)源的Mapper使用時(shí),可以直接使用@Resource注解或者別的依賴(lài)注解來(lái)使用。
import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import javax.sql.DataSource; /** * @author garine * @date 2018年11月16日 **/ @Configuration public class OdsMybatisConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource") @Primary public DataSource odsDataSource(){ return DataSourceBuilder.create().build(); } @Bean @Primary public SqlSessionFactory odsSqlSessionFactory(DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); //設(shè)置mapper.xml文件路徑 bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:META-INF/mybatis/mapper/*Mapper.xml")); //設(shè)置mapper接口的掃描包路徑 //sqlSessionFactory.getConfiguration().addMappers("com.xxx.mapper"); return bean.getObject(); } @Bean @Primary public DataSourceTransactionManager odsTransactionManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean @Primary public SqlSessionTemplate odsSqlSessionTemplate(SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
下面是第二個(gè)數(shù)據(jù)源的配置類(lèi)。針對(duì)第二個(gè)數(shù)據(jù)源配置,方法內(nèi)容基本一致,但是需要注意的是,由于第一個(gè)數(shù)據(jù)源設(shè)置了優(yōu)先配置,那么所有依賴(lài)注入默認(rèn)都將注入第一個(gè)數(shù)據(jù)源的配置,所以第二個(gè)數(shù)據(jù)源配置需要額外指定使用何種bean注入。
datasource的定義需要使用 @Qualifier注解指定值,在依賴(lài)注入時(shí)使用 @Qualifier和指定值就可以注入目標(biāo)bean。wmsSqlSessionFactory方法 使用@Qualifier(“wmsDatasource”)注解可以注入第二個(gè)數(shù)據(jù)源bean。
import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.SqlSessionTemplate; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import javax.sql.DataSource; /** * @author garine * @date 2018年11月16日 **/ @Configuration public class WmsMybatisConfig { @Bean @ConfigurationProperties(prefix = "second.datasource") @Qualifier("wmsDatasource") public DataSource wmsDataSource(){ return DataSourceBuilder.create().build(); } @Bean @Qualifier("wmsSqlSessionFactory") public SqlSessionFactory wmsSqlSessionFactory(@Qualifier("wmsDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:META-INF/mybatis/wms/mapper/*Mapper.xml")); bean.getObject(); SqlSessionFactory sqlSessionFactory = bean.getObject(); //設(shè)置wms數(shù)據(jù)源額外的mapper.java注冊(cè) //sqlSessionFactory.getConfiguration().addMappers("com.xx.maper"); return sqlSessionFactory; } @Bean public DataSourceTransactionManager wmsTransactionManager(@Qualifier("wmsDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean @Qualifier("wmsSqlSessionTemplate") public SqlSessionTemplate wmsSqlSessionTemplate( @Qualifier("wmsSqlSessionFactory") SqlSessionFactory wmsSqlSessionFactory) throws Exception { return new SqlSessionTemplate(wmsSqlSessionFactory); } }
通過(guò)上面的配置就可以實(shí)現(xiàn)雙數(shù)據(jù)源配置,下面是使用方式。
- 第一個(gè)數(shù)據(jù)源定義的maper由spring容器管理,可以直接使用@Resource注解使用
- 第二個(gè)數(shù)據(jù)源使用可能比較麻煩,代碼如下
//依賴(lài)注入第二個(gè)數(shù)據(jù)源的SqlSession @Resource @Qualifier("wmsSqlSessionTemplate") SqlSessionTemplate wmsSqlSessionTemplate; //使用時(shí)手動(dòng)獲取Mapper然后調(diào)用接口方法 wmsSqlSessionTemplate.getMapper(ReturnResultRecoderMapper.class).selectTest()
最后需要注意一點(diǎn)就是,使用上面的配置方式,mybatis的結(jié)果處理器對(duì)下劃線結(jié)果集合并沒(méi)有自動(dòng)轉(zhuǎn)換為駝峰方式,需要手動(dòng)在sql中定義別名。
例如實(shí)體
class People{ private String peopleGender; }
mybatis執(zhí)行sql,結(jié)果集映射為People類(lèi)。
sekect people_gender from people;
people_gender這個(gè)結(jié)果無(wú)法自動(dòng)映射到peopleGender,需要執(zhí)行以下sql才能映射上
sekect people_gender as peopleGendler from people;
所以這個(gè)配置過(guò)程應(yīng)該是漏了某些配置導(dǎo)致結(jié)果處理器的名稱(chēng)映射不起作用,這個(gè)問(wèn)題先mark。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- springboot整合mybatis的超詳細(xì)過(guò)程(配置模式+注解模式)
- 解析整合mybatis-spring需要的maven依賴(lài)配置問(wèn)題
- springboot mybatis druid配置多數(shù)據(jù)源教程
- springboot配置多數(shù)據(jù)源后mybatis攔截器失效的解決
- SpringBoot配置MyBatis-Plus實(shí)現(xiàn)增刪查改
- 使用Spring掃描Mybatis的mapper接口的三種配置
- mybatis spring配置SqlSessionTemplate的使用方式
- SpringBoot集成Mybatis+xml格式的sql配置文件操作
- Spring整合Mybatis具體代碼實(shí)現(xiàn)流程
相關(guān)文章
Java JDBC自定義封裝工具類(lèi)的步驟和完整代碼
這篇文章主要給大家介紹了關(guān)于Java JDBC自定義封裝工具類(lèi)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02SpringBoot中的PropertySource原理詳解
這篇文章主要介紹了SpringBoot中的PropertySource原理詳解,PropertySource?是一個(gè)非常重要的概念,它允許您在應(yīng)用程序中定義屬性,并將這些屬性注入到?Spring?環(huán)境中,需要的朋友可以參考下2023-07-07Java之MultipartFile和File類(lèi)型互轉(zhuǎn)方式
這篇文章主要介紹了Java之MultipartFile和File類(lèi)型互轉(zhuǎn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09springboot過(guò)濾器執(zhí)行兩次的解決及跨域過(guò)濾器問(wèn)題
這篇文章主要介紹了springboot過(guò)濾器執(zhí)行兩次的解決及跨域過(guò)濾器問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12華為技術(shù)專(zhuān)家講解JVM內(nèi)存模型(收藏)
這篇文章主要介紹了華為技術(shù)專(zhuān)家講解JVM內(nèi)存模型(收藏)的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),具有一定的收藏借鑒價(jià)值,需要的朋友可以參考下2021-05-05Java實(shí)現(xiàn)表達(dá)式二叉樹(shù)
這篇文章主要為大家詳細(xì)介紹了如何利用Java實(shí)現(xiàn)表達(dá)式二叉樹(shù),感興趣的小伙伴們可以參考一下2016-08-08jax-ws handler 的詳解及簡(jiǎn)單實(shí)例
這篇文章主要介紹了 jax-ws handler 的詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-09-09java?http請(qǐng)求獲取圖片并返回文件流給前端的方法步驟
作為一名Java后端開(kāi)發(fā)者,掌握如何從后端返回文件流至前端是基本技能之一,這篇文章主要介紹了java?http請(qǐng)求獲取圖片并返回文件流給前端的方法步驟,需要的朋友可以參考下2024-09-09