SpringBoot中mybatis多數(shù)據(jù)源

1.加入依賴

<!-- springboot-aop包,AOP切面注解,Aspectd等相關(guān)注解 -->

????????<dependency>

????????????<groupId>org.springframework.boot</groupId>

????????????<artifactId>spring-boot-starter-aop</artifactId>

????????</dependency>

2.新建一個(gè)注解伦泥,便于切換數(shù)據(jù)源

/**

* @program: springboot_course

* @description: 多數(shù)據(jù)源注解

* @author: ChenZhiXiang

* @create: 2019-06-12 09:21

**/

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface DataSource {

????String value() default "primaryDataSource";

}

3.新建一個(gè)類DataSourceContextHolder洋只,用于保存本地?cái)?shù)據(jù)源

/**

* @program: springboot_course

* @description: 用于保存本地?cái)?shù)據(jù)源

* @author: ChenZhiXiang

* @create: 2019-06-12 09:24

**/

public class DataSourceContextHolder {

????/**

?????* 默認(rèn)數(shù)據(jù)源

?????*/

????public static final String DEFAULT_DS = "primaryDataSource";

????/**

?????* ThreadLocal之后會進(jìn)行講解

?????*/

????private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();

????/** 設(shè)置數(shù)據(jù)源名 */

????public static void setDB(String dbType) {

????????System.out.println("切換到{"+dbType+"}數(shù)據(jù)源");

????????contextHolder.set(dbType);

????}

????/** 獲取數(shù)據(jù)源名 */

????public static String getDB() {

????????return (contextHolder.get());

????}

????/** 清除數(shù)據(jù)源名 */

????public static void clearDB() {

????????contextHolder.remove();

????}

}

4.新建DynamicDataSource類用于獲取本地?cái)?shù)據(jù)源

/**

* @program: springboot_course

* @description: 獲取本地?cái)?shù)據(jù)源

* @author: ChenZhiXiang

* @create: 2019-06-12 09:26

**/

public class DynamicDataSource extends AbstractRoutingDataSource {

????@Override

????protected Object determineCurrentLookupKey() {

????????System.out.println("數(shù)據(jù)源為"+DataSourceContextHolder.getDB());

????????return DataSourceContextHolder.getDB();

????}

}

5.新建DataSourceConfig讀取配置

/**

* @program: springboot_course

* @description: 多數(shù)據(jù)源配置類

* @author: ChenZhiXiang

* @create: 2019-06-12 09:27

**/

@Configuration

public class DataSourceConfig {

????@Autowired

????private Environment env;

????/**

?????* 數(shù)據(jù)源1

?????*??prefix application.properteis中對應(yīng)屬性的前綴

?????* @return

?????*/

????@Bean(name = "primaryDataSource")

????@ConfigurationProperties(prefix = "spring.datasource.primary")

????public DataSource primaryDataSource() {

????????return DataSourceBuilder.create().build();

????}

????/**

?????* 數(shù)據(jù)源2

?????* @return

?????*/

????@Bean(name = "secondDataSource")

????@ConfigurationProperties(prefix = "spring.datasource.second")

????public DataSource secondDataSource() {

????????return DataSourceBuilder.create().build();

????}

????/**

?????* 動態(tài)數(shù)據(jù)源: 通過AOP在不同數(shù)據(jù)源之間動態(tài)切換

?????* @return

?????*/

????@Primary

????@Bean(name = "dynamicDataSource")

????public DynamicDataSource dynamicDataSource() {

????????DynamicDataSource dynamicDataSource = new DynamicDataSource();

????????// 默認(rèn)數(shù)據(jù)源

????????dynamicDataSource.setDefaultTargetDataSource(primaryDataSource());

????????// 配置多數(shù)據(jù)源

????????Map<Object, Object> dsMap = new HashMap();

????????dsMap.put("primaryDataSource", primaryDataSource());

????????dsMap.put("secondDataSource", secondDataSource());

????????dynamicDataSource.setTargetDataSources(dsMap);

????????return dynamicDataSource;

????}

????/**

?????* 根據(jù)數(shù)據(jù)源創(chuàng)建SqlSessionFactory

?????*/

????@Bean

????public SqlSessionFactory sqlSessionFactory(DynamicDataSource ds) throws Exception {

????????SqlSessionFactoryBean fb = new SqlSessionFactoryBean();

????????// 指定數(shù)據(jù)源(這個(gè)必須有瘾敢,否則報(bào)錯(cuò))

????????fb.setDataSource(ds);

????????// 下邊兩句僅僅用于*.xml文件稽鞭,如果整個(gè)持久層操作不需要使用到xml文件的話(只用注解就可以搞定),則不加, 指定基包

????????fb.setTypeAliasesPackage(env.getProperty("mybatis.type-aliases-package"));

????????fb.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(env.getProperty("mybatis.mapper-locations")));

????????return fb.getObject();

????}

????/**

?????* 配置@Transactional注解事物

?????* @return

?????*/

????@Bean

????public PlatformTransactionManager transactionManager() {

????????return new DataSourceTransactionManager(dynamicDataSource());

????}

}

6.新建DynamicDataSourceAspect.java類用于自定義注解 + AOP的方式實(shí)現(xiàn)數(shù)據(jù)源動態(tài)切換址貌。

/**

* @program: springboot_course

* @description: java類用于自定義注解 + AOP的方式實(shí)現(xiàn)數(shù)據(jù)源動態(tài)切換

* @author: ChenZhiXiang

* @create: 2019-06-12 09:31

**/

@Aspect

@Component

public class DynamicDataSourceAspect {

????@Pointcut(value = "execution(* com.example.service.*.*(..))")

????public void pointcut() {

????}

????@Before("pointcut()")

????public void beforeSwitchDS(JoinPoint point){

????????//獲得當(dāng)前訪問的class

????????Class<?> className = point.getTarget().getClass();

????????//獲得訪問的方法名

????????String methodName = point.getSignature().getName();

????????//得到方法的參數(shù)的類型

????????Class[] argClass = ((MethodSignature)point.getSignature()).getParameterTypes();

????????String dataSource = DataSourceContextHolder.DEFAULT_DS;

????????try {

????????????// 得到訪問的方法對象

????????????Method method = className.getMethod(methodName, argClass);

????????????// 判斷是否存在@DS注解

????????????if (method.isAnnotationPresent(DataSource.class)) {

????????????????DataSource annotation = method.getAnnotation(DataSource.class);

????????????????// 取出注解中的數(shù)據(jù)源名

????????????????dataSource = annotation.value();

????????????}

????????} catch (Exception e) {

????????????e.printStackTrace();

????????}

????????// 切換數(shù)據(jù)源

????????DataSourceContextHolder.setDB(dataSource);

????}

????@After("pointcut()")

????public void afterSwitchDS(JoinPoint point){

????????DataSourceContextHolder.clearDB();

????}

}

7.添加配置文件

yml方式

spring:

??datasource:

? ? primaryDataSource:

??????jdbc-url: jdbc:mysql:/localhost:3306/test1?useUnicode=true&characterEncoding=UTF-8&useSSL=false&failOverReadOnly=false

??????username: test1

??????password: 123456

??????type: com.alibaba.druid.pool.DruidDataSource

??????driver-class-name: com.mysql.jdbc.Driver

? ?secondDataSource:

??????jdbc-url: jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=UTF-8&useSSL=false&failOverReadOnly=false

??????username: test2

??????password: 123456

??????type: com.alibaba.druid.pool.DruidDataSource

??????driver-class-name: com.mysql.jdbc.Driver

properties方式

spring.datasource.primary.jdbc-url=jdbc:mysql://192.168.0.194:3306/channel-reward?characterEncoding=UTF-8&useSSL=true&serverTimezone=GMT%2B8&useUnicode=true

spring.datasource.primary.username=root

spring.datasource.primary.password=bonc_mysql

spring.datasource.primary.type=com.alibaba.druid.pool.DruidDataSource

spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.second.jdbc-url=jdbc:mysql://localhost:3306/czx?characterEncoding=UTF-8&useSSL=true&serverTimezone=GMT%2B8&useUnicode=true

spring.datasource.second.username=

spring.datasource.second.password=

spring.datasource.second.type=com.alibaba.druid.pool.DruidDataSource

spring.datasource.second.driver-class-name=com.mysql.cj.jdbc.Driver

mybatis.mapper-locations=classpath:mapper/*.xml

mybatis.type-aliases-package=com.example.pojo

8.使用荔燎,使用注解自主切換


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丢胚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子跨扮,更是在濱河造成了極大的恐慌勤庐,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件好港,死亡現(xiàn)場離奇詭異愉镰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)钧汹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門丈探,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拔莱,你說我怎么就攤上這事碗降。” “怎么了塘秦?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵讼渊,是天一觀的道長。 經(jīng)常有香客問我尊剔,道長爪幻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任须误,我火速辦了婚禮挨稿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘京痢。我一直安慰自己奶甘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布祭椰。 她就那樣靜靜地躺著臭家,像睡著了一般疲陕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钉赁,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天鸭轮,我揣著相機(jī)與錄音,去河邊找鬼橄霉。 笑死窃爷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的姓蜂。 我是一名探鬼主播娱据,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼烂完,長吁一口氣:“原來是場噩夢啊……” “哼挠日!你這毒婦竟也來了缘眶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤束莫,失蹤者是張志新(化名)和其女友劉穎懒棉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體览绿,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡策严,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了饿敲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妻导。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖怀各,靈堂內(nèi)的尸體忽然破棺而出倔韭,到底是詐尸還是另有隱情,我是刑警寧澤瓢对,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布寿酌,位于F島的核電站,受9級特大地震影響硕蛹,放射性物質(zhì)發(fā)生泄漏醇疼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一妓美、第九天 我趴在偏房一處隱蔽的房頂上張望僵腺。 院中可真熱鬧,春花似錦壶栋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽琉兜。三九已至,卻和暖如春毙玻,著一層夾襖步出監(jiān)牢的瞬間豌蟋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工桑滩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留梧疲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓运准,卻偏偏與公主長得像幌氮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子胁澳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

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