spring boot + mybatis实现动态切换数据源实例代码

作者:撸码识途 时间:2021-11-14 03:37:59 

前言

前几天有个需求,需要使用不同的数据源,例如某业务要用A数据源,另一个业务要用B数据源。我上网收集了一些资料整合了一下,虽然最后这个需求不了了之了,但是多数据源动态切换还是蛮好用的,所以记录一下,或许以后有用呢?或者自己感兴趣又想玩呢!

下面话不多说了,随着小编来一起看看详细的介绍吧

方法如下:

1.加个依赖


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

2.application.properties配置文件


#主从数据库
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默认加载数据源配置


@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class Application {

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

4.数据源配置类


/**
* 主数据源
*/
@Configuration
@ConfigurationProperties(prefix = "master.db")
public class MasterDataSourceConfig {
private String url;
private String username;
private String password;
private String driverClassName;
}

/**
* 从数据源配置
*/
@Configuration
@ConfigurationProperties(prefix = "slave.db")
public class SlaveDataSourceConfig {
private String url;
private String username;
private String password;
private String driverClassName;
}

/**
* 数据源配置类
*/
@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.数据源上下文


/**
* 数据源上下文
*/
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路由类


/*
* 重写的函数决定了最后选择的DataSource
*/
public class MultiRouteDataSource extends AbstractRoutingDataSource {

@Override
protected Object determineCurrentLookupKey() {
 //通过绑定线程的数据源上下文实现多数据源的动态切换,有兴趣的可以去查阅资料或源码
 return DataSourceContext.getDataSource();
}

}

7.使用,修改上下文中的数据源就可以切换自己想要使用的数据源了。


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

这种是在业务中使用代码设置数据源的方式,也可以使用AOP+注解的方式实现控制,方法多多!

来源:http://www.cnblogs.com/tinyj/p/9864128.html

标签:springboot,mybatis,数据源
0
投稿

猜你喜欢

  • Spring @Bean注解的使用场景与案例实现

    2023-11-20 04:44:22
  • java中类与对象的使用详情

    2023-09-27 17:10:43
  • Java实现分页查询功能

    2023-03-03 14:30:19
  • java 静态代理 动态代理深入学习

    2022-07-24 21:46:25
  • Hadoop的安装与环境搭建教程图解

    2022-06-28 16:19:47
  • SpringBoot微信消息接口配置详解

    2023-08-23 09:51:21
  • 详解HDFS多文件Join操作的实例

    2023-09-20 07:44:14
  • 详解spring中的Aware接口功能

    2023-07-02 00:36:01
  • 解决IntelliJ IDEA中鼠标拖动选择为矩形区域问题

    2022-04-03 21:08:51
  • 一文详解Spring是怎么读取配置Xml文件的

    2023-07-30 00:27:37
  • Java实现插入公式到PPT的示例代码

    2023-11-12 03:04:41
  • 使用springboot logback动态获取application的配置项

    2023-09-03 21:21:41
  • 关于SpringBoot使用Redis空指针的问题(不能成功注入的问题)

    2023-09-04 01:30:03
  • DecimalFormat多种用法详解

    2022-11-13 15:06:52
  • C++实现LeetCode(159.最多有两个不同字符的最长子串)

    2023-06-20 22:39:46
  • Spring security如何重写Filter实现json登录

    2023-09-15 13:33:31
  • C#导出生成excel文件的方法小结(xml,html方式)

    2023-10-03 16:32:26
  • Spring spel表达式使用方法示例

    2023-08-25 00:43:32
  • flutter窗口初始和绘制流程详析

    2023-08-17 21:07:30
  • java计算工作时间除去节假日以及双休日

    2023-09-24 20:34:58
  • asp之家 软件编程 m.aspxhome.com