1. 程式人生 > >springboot框架 mybatis整合多資料來源配置

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

全程解析,MyBatisSpringBoot中的動態資料來源配置

在分庫的業務場景和跨資料庫例項獲取資訊之類的場景中,我們會遇到處理多個數據源訪問的問題,**通常情況下可以採用中介軟體**,如cobar, tddl, mycat等。 但取決於業務需求,有時我們需要直接通過MyBatis和SpringData來完成這個任務。即使沒有,**理解MyBatis多資料來源配置的過

談一談Spring-Mybatis資料來源配置上的坑

蘇格團隊 作者:JayceKon 交流QQ群:855833773 歡迎加入我們的團隊,微信聯絡方式:foreverpx_cjl 概述 先聊一聊業務背景,隨著系統服務的不斷開發,我們的系統會充斥著各種個樣的業務.這種時候,我們應該要開始考慮一下如何將系統的粒度細化.

談一談 Spring-Mybatis資料來源配置上的坑

團隊部落格: https://juejin.im/post/5bfb607f6fb9a04a08215920 概述 先聊一聊業務背景,隨著系統服務的不斷開發,我們的系統會充斥著各種個樣的業務.這種時候,我們應該要開始考慮一下如何將系統的粒度細化.舉個常見的例子: 電商系統可以拆分為 商品模組,訂單模組,地

SpringBootMybatis整合二(基於配置檔案)

專案結構: 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資料來源解決辦法

  最近專案有一個非解決不可的問題,我們的專案中的使用者表是用的自己庫的資料,但是這些資料都是從一個已有庫中遷過來的,所以使用者資訊都是在那個專案裡面維護,自然而然我們專案不提供使用者註冊功能,這就有個問題,如何解決資料遷移的問題,總不能我每次都手動導資料吧,所以我決心寫一個介面把那個庫中的使用者資訊同步我們