springboot框架 mybatis整合多資料來源配置
背景:
最近在學習當中,學到了多資料來源的配置,在網上找了很多的資料一邊配置,一邊踩坑,也一邊在學習,以此記錄一下吧。
參考:
本文參考了幾個文章,但是或多多少都有些問題,所以我自己整合了下。連結放出
出現的問題:
前期準備:
springboot 2.0, mybatis,工具類:SqlSessionFactory 和 SqlSessionTemplate
多資料來源:
首先將我的配置貼出來(宣告一下,我這裡用的yml格式)
spring: ###主資料來源 primary: datasource: name: test1 jdbc-url: jdbc:mysql://localhost:3306/test1?characterEncoding=utf8&useSSL=true username: root password: root type: com.alibaba.druid.pool.DruidDataSource ###第二資料來源 secondary: datasource: name: test2 jdbc-url: jdbc:mysql://localhost:3306/test2?characterEncoding=utf8&useSSL=true username: root password: root type: com.alibaba.druid.pool.DruidDataSource
我在這裡配置了兩個資料來源,如果有多個,以此類推往下配置即可,我用的是mysql。
坑1
這裡有一點說一下,如果配置單資料來源應該是 spring.datasource.name,這裡因為配置多個應該按照spring.yourname.datasource.name,差別是在datasource前邊加了一個自定義的名字,這樣來區分多個數據源,而且如果不加的話會在編譯的時候報錯 配置檔案內duplicate datasource。
坑2
這裡在配置資料庫連線的時候一般單源或者springboot1.x版本都用的是 url:xxxxxxxx,而現在這種情況,多個源而且我的版本是2.0的所以應該寫成jdbc-url: xxxxx,具體是因為版本還是多個數據源的原因只能去問大神了。
資料來源配置好了以後,在springboot內啟動時會自動載入資料來源的配置,這時候會出錯,所以我們在你的啟動類application.java內的註解新增一個屬性。
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class) @EnableTransactionManagement public class JisusearchApplication { public static void main(String[] args) { SpringApplication.run(JisusearchApplication.class, args); } }
就是在 啟動註解這裡SpringBootApplication 添加了exclude屬性。這裡是防止springboot自動建立datasource,而忽略我們的配置。
新建datasource:
我們禁掉了springboot預設建立的datasource,接下來我們就自己來建立我們需要的多個datasource。
1、新建一個類,來配置datasource
@Configuration
public class DataSourceConfig {
/**
* 主資料來源
* @return
*/
@Bean(name = "primaryDataSource")
// @Qualifier("primaryDataSource")
@Primary
@ConfigurationProperties(prefix = "spring.primary.datasource")
public DataSource primary() {
return DataSourceBuilder.create().build();
}
/**
* 從資料來源
* @return
*/
@Bean(name = "secondaryDataSource")
// @Qualifier("secondaryDataSource")
@ConfigurationProperties(prefix = "spring.secondary.datasource")
public DataSource secondary() {
return DataSourceBuilder.create().build();
}
}
首先 @Configuration 指定該類為spring的配置類相當於xml,
然後配置你在你的properties或yml檔案內配置的資料來源資訊
@ConfigurationProperties(prefix = "spring.secondary.datasource")
這個註解會去properties檔案內找你指定的字首為spring.secondary.datasource的配置,因此這個值要跟你配置檔案內些的一致。
名字你當然可以自定義了,我這個可能會有些長。
注意:
這裡需要注意的是 我註釋掉的註解@Qulifier 就是為該類指定名字的,因為我用了註解bean所以不能重複指定,不然會報錯,還有就是這裡可以指定一個預設的資料來源 @Primary(指定預設資料來源),網上也有人說沒有必要,但是我這裡不指定會報錯。
這個坑請知道的大神 指點一下。
2、接下來使用工具類SqlSessionFactory和 SqlSessionTemplate 來完善你的配置
我的是分開建立的,即你有幾個資料來源就建立幾個配置類,當然你先建立的多,也可以將這一步與上一步整合到一個類當中,看個人需要了。
上程式碼:
@Configuration
@MapperScan(basePackages = {"com.example.jisusearch.primarydao"}, sqlSessionFactoryRef = "primarySqlSessionFactory")
public class MybatisPrimaryConfig {
@Autowired
@Qualifier("primaryDataSource")
private DataSource primaryDataSource;
@Bean
public SqlSessionFactory primarySqlSessionFactory () throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(primaryDataSource);
return bean.getObject();
}
@Bean
public SqlSessionTemplate primarySqlSessionTemplate() throws Exception {
SqlSessionTemplate template = new SqlSessionTemplate(primarySqlSessionFactory());
return template;
}
}
這裡引入上一步配置的datasource,並通過註解@Qualifier 來指定你目前這個SqlSessionFactory使用的是哪個資料來源,類上加上註解@Configuration 宣告該類為配置類;
@MapperScan(basePackages = {"com.example.jisusearch.primarydao"}, sqlSessionFactoryRef = "primarySqlSessionFactory")
該註解來指定你哪個包要使用這個資料來源,要寫全路徑,不然會報錯,後邊這個屬性則是你SqlSessionFactory的bean的名字。
這裡是一個數據源的配置,接下來配置另外一個,類似就直接上程式碼了。
@Configuration
@MapperScan(basePackages = {"com.example.jisusearch.secondarydao"}, sqlSessionFactoryRef = "secondarySqlSessionFactory")
public class MybatisSecondaryConfig {
@Autowired
@Qualifier("secondaryDataSource")
private DataSource secondaryDataSource;
@Bean
public SqlSessionFactory secondarySqlSessionFactory() throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(secondaryDataSource);
return bean.getObject();
}
@Bean
public SqlSessionTemplate secondarySqlSessionTemplate() throws Exception {
SqlSessionTemplate template = new SqlSessionTemplate(secondarySqlSessionFactory());
return template;
}
}
因為我想要分開所以我建了兩個dao,你也可以在一個dao內指定這兩個,但是@MapperScan(basePackages = {"com.example.jisusearch.secondarydao"}) 這裡就不能寫到包了,路徑應該寫到你指定的mapper上,xml或者java類,例如:com.example.jisusearch.secondarydao.UserDao,多個的話用逗號分開就可以了。
3、新建dao
@Mapper
public interface PrimaryDao {
@SelectProvider(type = PrimaryProviders.class, method = "getUserSql")
@Results(id = "systemUser", value = {
@Result(property = "userId", column = "user_id"),
@Result(property = "username", column = "username"),
@Result(property = "createUserId", column = "create_user_id"),
@Result(property = "createTime", column = "create_time"),
})
UserModule getUser (String id);
@ResultMap("systemUser")
@SelectProvider(type = PrimaryProviders.class, method = "getUserByParamsSql")
UserModule getUserByParams (String id);
}
擴充套件一下:我這裡做了欄位的對映使用的是 @Results和@Result,因為這兩個都是方法級的註解,所以為了能共用我為@Results加了id的屬性,其他的地方引用使用@ResultMap("yourResultId"),有人說這樣不可以,但是本人親測可用。
另外一個dao包下的方法
@Mapper
public interface SecondaryDao {
@SelectProvider(type = SecondaryProviders.class, method = "getUserSql")
@Results(id = "systemUser", value = {
@Result(property = "userId", column = "user_id"),
@Result(property = "username", column = "username"),
@Result(property = "createUserId", column = "create_user_id"),
@Result(property = "createTime", column = "create_time"),
})
UserModule getUser(@Param("id") String id);
}
這裡sql語句我都是用java寫的,dao層用的註解@SelectProvider,因為本人實在不喜歡寫xml -_-!!!。
4、寫你的test類或者使用三層,將到dao正常的注入到你的service或controller內,就可以正常使用了。
@Resource
private PrimaryDao primaryDao;
@Resource
private SecondaryDao secondaryDao;
@RequestMapping("/primary/user")
public Result findUser(String id) {
Result re = new Result();
Map<String, Object> map = new HashMap<>();
UserModule userModule = primaryDao.getUser(id);
UserModule userModule1 = secondaryDao.getUser(id);
UserModule userModule2 = primaryDao.getUserByParams(id);
map.put("first", userModule);
map.put("second", userModule1);
map.put("third", userModule2);
re.setData(map);
return re;
}
這裡有個坑,就是注入你的dao時不能使用autowired,因為會報錯,你現在多個數據源而不是單個了。
好了, 我的配置到此就結束了,程式碼直接copy可用。
相關推薦
springboot框架 mybatis整合多資料來源配置
背景: 最近在學習當中,學到了多資料來源的配置,在網上找了很多的資料一邊配置,一邊踩坑,也一邊在學習,以此記錄一下吧。 參考: 本文參考了幾個文章,但是或多多少都有些問題,所以我自己整合了下。連結放出 出現的問題: 前期準備: sprin
Spring Boot整合MyBatis實現多資料來源配置
Spring Boot最大的特點是簡化開發,因此使用Java Config實現去xml配置,本文將使用這種方式完成對SpringBoot+Mybatis的多資料來源配置。同時,會用到阿里巴巴的開源資料來源Druid。依賴:<?xml version="1.0" encoding="UTF-8"?>
springboot+mybatis整合多資料來源MySQL/Oracle/SqlServer
日常開發中可能時常會遇到一些這樣的需求,業務資料庫和第三方資料庫,兩個或多個數據庫屬於不同資料庫廠商,這時候就需要通過配置來實現對資料庫實現多源處理.大致說一下我的業務場景,框架本身是配置的springboot+mybatis+MySQL,業務資料庫為mysql資料庫,現在需
Springboot+Mybatis實現多資料來源配置
1、預設application.properties配置檔案增加多資料來源配置,也可另行自己增加新的配置檔案獨立維護 ## master資料來源[主端業務]:用於mybatis自動程式碼生成呼叫及spring對資料庫的系列操作 master.datasource.url=j
全程解析,MyBatis在SpringBoot中的動態多資料來源配置
在分庫的業務場景和跨資料庫例項獲取資訊之類的場景中,我們會遇到處理多個數據源訪問的問題,**通常情況下可以採用中介軟體**,如cobar, tddl, mycat等。 但取決於業務需求,有時我們需要直接通過MyBatis和SpringData來完成這個任務。即使沒有,**理解MyBatis多資料來源配置的過
談一談Spring-Mybatis在多資料來源配置上的坑
蘇格團隊 作者:JayceKon 交流QQ群:855833773 歡迎加入我們的團隊,微信聯絡方式:foreverpx_cjl 概述 先聊一聊業務背景,隨著系統服務的不斷開發,我們的系統會充斥著各種個樣的業務.這種時候,我們應該要開始考慮一下如何將系統的粒度細化.
談一談 Spring-Mybatis 在多資料來源配置上的坑
團隊部落格: https://juejin.im/post/5bfb607f6fb9a04a08215920 概述 先聊一聊業務背景,隨著系統服務的不斷開發,我們的系統會充斥著各種個樣的業務.這種時候,我們應該要開始考慮一下如何將系統的粒度細化.舉個常見的例子: 電商系統可以拆分為 商品模組,訂單模組,地
SpringBoot和Mybatis整合二(基於配置檔案)
專案結構: EmployeeMapper: package com.lucifer.springboot.mapper; import com.lucifer.springboot.bea
spring boot+mybatis+druid 多資料來源配置
application.yml(application.properties)配置: spring: datasource: druid: type: com.alibaba.druid.pool.xa.DruidXADataSource
spring+mybatis-->多資料來源配置
配置檔案:dataSource.xml,在ApplicationContext.xml中引入即可 <!-- 資料庫管理 --> <import resource ="classpath:dataSource.xml"/> dataSource.xml
Springmvc+mybatis+spring多資料來源配置 AOP+註解方式切換資料來源
紙上得來終覺淺,絕知此事要躬行 最終效果就是,通過在service層類或方法上,註解宣告需要的資料來源名稱,從而實現切換資料來源的目的 理論知識就不說了,直接上程式碼(不支援分散式事務)* 1.準備多資料來源properties檔案 <!-- 資料
spring框架--spring整合postgre資料來源配置
ApplicationContext.xml配置中關於資料來源的部分。 使用spring,就不用再操心configuration和sissionFactory等等與業務程式碼不相關的部分。 <context:component-scan bas
springboot+mybatis+druid 多資料來源整合
前言:在上一篇文章裡面我們進行了spring boot 和 mybatis 的整合 《springboot整合mybatis使用druid資料來源》, 文中是使用的單資料來源,因為專案中有很多需要用到多資料來源的場景,比如主從同步(讀寫分離)
springboot+mybatis多資料來源配置,AOP註解動態切換資料來源
轉載至:https://blog.csdn.net/xiaosheng_papa/article/details/80218006 親測有效。 注:有些系統中已經配置了單資料來源,現在要轉成多資料來源,可能需要額外的配置。拿我自己當前專案來說: 專案在啟動類中配置了單資料來源:
基於SpirngBoot2.0+ 的 SpringBoot+Mybatis 多資料來源配置
Github 地址:github.com/Snailclimb/…(SpringBoot和其他常用技術的整合,可能是你遇到的講解最詳細的學習案例,力爭新手也能看懂並且能夠在看完之後獨立實踐。基於最新的 SpringBoot2.0+,是你學習SpringBoot 的最佳指南。) ,歡迎各位 Star。
新手也能看懂,基於SpirngBoot2.0+ 的 SpringBoot+Mybatis 多資料來源配置
Github 地址:https://github.com/Snailclimb/springboot-integration-examples(SpringBoot和其他常用技術的整合,可能是你遇到的講解最詳細的學習案例,力爭新手也能看懂並且能夠在看完之後獨立實踐。基於最新的 S
springboot+mybatis+druid實現多資料來源配置,支援註解和xml兩種sql書寫方式
https://github.com/cheegoday/springboot-demo-djg 要點: 一、依次建立以下幾個Bean 資料來源:DataSource session工廠:SqlSessionFactory 執行緒安全session:Sql
springboot+mybatis多資料來源配置實現
簡單實現了根據註解動態切換資料來源,支援同一個資料庫的宣告式事務,但不支援JTA事務。處理流程: 根據配置的資料來源資訊,建立動態資料來源bean 利用DataSourceAspect處理@DataSource註解,設定當前要使用的具體資料來源 pom.xm
Springboot整合mybatis實現多資料來源
1:SpringBoot整合mybatis實現多資料來源有兩種方法 1:靜態方式 將每個資料來源都實現一個mybatis的sqlSessionFactory中,但是這種方法,缺點在於:你有幾個資料來源都會有幾個mybatis的配置類;對於資料來源的事務也不是很
springboot整合mybatis的多資料來源解決辦法
最近專案有一個非解決不可的問題,我們的專案中的使用者表是用的自己庫的資料,但是這些資料都是從一個已有庫中遷過來的,所以使用者資訊都是在那個專案裡面維護,自然而然我們專案不提供使用者註冊功能,這就有個問題,如何解決資料遷移的問題,總不能我每次都手動導資料吧,所以我決心寫一個介面把那個庫中的使用者資訊同步我們