欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

spring boot + mybatis實現(xiàn)動態(tài)切換數(shù)據(jù)源實例代碼

 更新時間:2018年10月30日 15:20:38   作者:擼碼識途  
這篇文章主要給大家介紹了關(guān)于spring boot + mybatis實現(xiàn)動態(tài)切換數(shù)據(jù)源的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

前幾天有個需求,需要使用不同的數(shù)據(jù)源,例如某業(yè)務(wù)要用A數(shù)據(jù)源,另一個業(yè)務(wù)要用B數(shù)據(jù)源。我上網(wǎng)收集了一些資料整合了一下,雖然最后這個需求不了了之了,但是多數(shù)據(jù)源動態(tài)切換還是蠻好用的,所以記錄一下,或許以后有用呢?或者自己感興趣又想玩呢!

下面話不多說了,隨著小編來一起看看詳細(xì)的介紹吧

方法如下:

1.加個依賴

 <dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
       <version>1.3.1</version>
 </dependency>

2.application.properties配置文件

#主從數(shù)據(jù)庫
master.db.driverClassName=com.mysql.jdbc.Driver
master.db.url=jdbc:mysql://localhost:3306/cbd?characterEncoding=UTF-8&useUnicode=true&useSSL=false
master.db.username=root
master.db.password=admin
slave.db.driverClassName=com.mysql.jdbc.Driver
slave.db.url=jdbc:mysql://localhost:3306/cbd_test?characterEncoding=UTF-8&useUnicode=true&useSSL=false
slave.db.username=root
slave.db.password=admin

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

3.禁用springboot默認(rèn)加載數(shù)據(jù)源配置

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class Application {
 
 public static void main(String[] args) throws Exception {
  SpringApplication.run(Application.class, args);
 }
}

4.數(shù)據(jù)源配置類

/**
 * 主數(shù)據(jù)源
 */
@Configuration
@ConfigurationProperties(prefix = "master.db")
public class MasterDataSourceConfig {
 private String url;
 private String username;
 private String password;
 private String driverClassName;
}
/**
 * 從數(shù)據(jù)源配置
 */
@Configuration
@ConfigurationProperties(prefix = "slave.db")
public class SlaveDataSourceConfig {
 private String url;
 private String username;
 private String password;
 private String driverClassName;
}
/**
 * 數(shù)據(jù)源配置類
 */
@Configuration
public class DataSourceComponent {

 @Resource
 private MasterDataSourceConfig masterDataSourceConfig;

 @Resource
 private SlaveDataSourceConfig slaveDataSourceConfig;


  @Bean(name = "master")
 public DataSource masterDataSource() {
  DataSource dataSource = new DataSource();
  dataSource.setUrl(masterDataSourceConfig.getUrl());
  dataSource.setUsername(masterDataSourceConfig.getUsername());
  dataSource.setPassword(masterDataSourceConfig.getPassword());
  dataSource.setDriverClassName(masterDataSourceConfig.getDriverClassName());
  return dataSource;
 }

 @Bean(name = "slave")
 public DataSource slaveDataSource() {
  DataSource dataSource = new DataSource();
  dataSource.setUrl(slaveDataSourceConfig.getUrl());
  dataSource.setUsername(slaveDataSourceConfig.getUsername());
  dataSource.setPassword(slaveDataSourceConfig.getPassword());
  dataSource.setDriverClassName(slaveDataSourceConfig.getDriverClassName());
  return dataSource;
 }

 @Primary//不加這個會報錯。
 @Bean(name = "multiDataSource")
 public MultiRouteDataSource exampleRouteDataSource() {
  MultiRouteDataSource multiDataSource = new MultiRouteDataSource();
  Map<Object, Object> targetDataSources = new HashMap<>();
  targetDataSources.put("master", masterDataSource());
  targetDataSources.put("slave", slaveDataSource());
  multiDataSource.setTargetDataSources(targetDataSources);
  multiDataSource.setDefaultTargetDataSource(masterDataSource());
  return multiDataSource;
 }
}

5.數(shù)據(jù)源上下文

/**
 * 數(shù)據(jù)源上下文
 */
public class DataSourceContext {
 private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();

 public static void setDataSource(String value) {
  contextHolder.set(value);
 }

 public static String getDataSource() {
  return contextHolder.get();
 }

 public static void clearDataSource() {
  contextHolder.remove();
 }
}

6.DataSource路由類

/*
* 重寫的函數(shù)決定了最后選擇的DataSource
*/
public class MultiRouteDataSource extends AbstractRoutingDataSource {

 @Override
 protected Object determineCurrentLookupKey() {
  //通過綁定線程的數(shù)據(jù)源上下文實現(xiàn)多數(shù)據(jù)源的動態(tài)切換,有興趣的可以去查閱資料或源碼
  return DataSourceContext.getDataSource();
 }

}

7.使用,修改上下文中的數(shù)據(jù)源就可以切換自己想要使用的數(shù)據(jù)源了。

 public UserVO findUser(String username) {
  DataSourceContext.setDataSource("slave");
  UserVO userVO = userMapper.findByVO(username);
  System.out.println(userVO.getName()+"=====================");
  return null;
 }

這種是在業(yè)務(wù)中使用代碼設(shè)置數(shù)據(jù)源的方式,也可以使用AOP+注解的方式實現(xiàn)控制,方法多多!

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • FastJSON字段智能匹配踩坑的解決

    FastJSON字段智能匹配踩坑的解決

    這篇文章主要介紹了FastJSON字段智能匹配踩坑的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • JFinal實現(xiàn)偽靜態(tài)的方法

    JFinal實現(xiàn)偽靜態(tài)的方法

    JFinal 是基于 Java 語言的極速 WEB + ORM 框架,其核心設(shè)計目標(biāo)是開發(fā)迅速、代碼量少、學(xué)習(xí)簡單、功能強大、輕量級、易擴展、Restful。這篇文章主要介紹了JFinal實現(xiàn)偽靜態(tài),需要的朋友可以參考下
    2018-04-04
  • Java實現(xiàn)的可選擇及拖拽圖片的面板功能【基于swing組件】

    Java實現(xiàn)的可選擇及拖拽圖片的面板功能【基于swing組件】

    這篇文章主要介紹了Java實現(xiàn)的可選擇及拖拽圖片的面板功能,涉及java基于swing組件選擇與操作圖片元素的相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2018-01-01
  • Java代碼實現(xiàn)循環(huán)隊列的示例代碼

    Java代碼實現(xiàn)循環(huán)隊列的示例代碼

    隊列作為基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),是程序員的入門課。也是所有程序員必須掌握的一種數(shù)據(jù)結(jié)構(gòu),隊列在程序中廣泛應(yīng)用,因此我們應(yīng)該對隊列有深入的了解,接下來我們通過代碼來對隊列這種數(shù)據(jù)結(jié)構(gòu)進行深度解析,感興趣的朋友一起看看吧
    2021-09-09
  • Java實現(xiàn)排列組合算法的兩種方案

    Java實現(xiàn)排列組合算法的兩種方案

    Java排列組合算法是一種用于生成所有可能的排列和組合的算法,在Java中,可以使用遞歸或迭代的方式實現(xiàn)排列組合算法,本文給大家介紹了Java實現(xiàn)排列組合算法的兩種方案,需要的朋友可以參考下
    2024-04-04
  • 為什么JDK8中HashMap依然會死循環(huán)

    為什么JDK8中HashMap依然會死循環(huán)

    這篇文章主要介紹了為什么JDK8中HashMap依然會死循環(huán),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Springboot-Starter造輪子之自動鎖組件lock-starter實現(xiàn)

    Springboot-Starter造輪子之自動鎖組件lock-starter實現(xiàn)

    這篇文章主要為大家介紹了Springboot-Starter造輪子之自動鎖組件lock-starter實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • BeanUtils.copyProperties復(fù)制不生效的解決

    BeanUtils.copyProperties復(fù)制不生效的解決

    這篇文章主要介紹了BeanUtils.copyProperties復(fù)制不生效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringBoot多種場景傳參模式

    SpringBoot多種場景傳參模式

    傳參是非常常見的,本文主要介紹了SpringBoot多種場景傳參模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Idea?中控制啟動命令的詳細(xì)過程?區(qū)分環(huán)境案例詳解

    Idea?中控制啟動命令的詳細(xì)過程?區(qū)分環(huán)境案例詳解

    這篇文章主要介紹了Idea?中控制啟動命令的詳細(xì)過程?區(qū)分環(huán)境案例詳解,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08

最新評論