tk-mybatis整合springBoot使用两个数据源的方法

下面是“tk-mybatis整合springBoot使用两个数据源的方法”的完整攻略及两条示例:

一、准备工作

在进行整合之前,我们需要做以下准备工作:

  1. 创建两个数据库,分别为db1db2,并分别创建表user,表结构如下:
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
  1. pom.xml中添加tk-mybatisdruidmysql-connector-java依赖:
<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>2.1.5</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.9</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.22</version>
</dependency>

二、配置数据源

application.yml中配置数据源,如下:

spring:
  datasource:
    master:
      url: jdbc:mysql://localhost:3306/db1?useSSL=false&serverTimezone=UTC
      username: root
      password: root
      driver-class-name: com.mysql.cj.jdbc.Driver
    slave:
      url: jdbc:mysql://localhost:3306/db2?useSSL=false&serverTimezone=UTC
      username: root
      password: root
      driver-class-name: com.mysql.cj.jdbc.Driver

### druid连接池配置
  druid:
    master:
      maxActive: 32
      initialSize: 2
      minIdle: 2
      maxWait: 60000
      poolPreparedStatements: true
      maxPoolPreparedStatementPerConnectionSize: 20
      validationQuery: select 1 from dual
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      filters: stat
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
    slave:
      maxActive: 32
      initialSize: 2
      minIdle: 2
      maxWait: 60000
      poolPreparedStatements: true
      maxPoolPreparedStatementPerConnectionSize: 20
      validationQuery: select 1 from dual
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      filters: stat
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

上面的配置中,我们使用了两个数据源,分别为masterslave,并分别对应db1db2两个数据库。其中,我们使用了druid连接池来管理数据源,提高应用的性能。

三、整合tk-mybatis

application.yml中配置tk-mybatis,如下:

tk:
  mybatis:
    mapper-locations: classpath:mapper/**Mapper.xml
    config-location: classpath:mybatis-config.xml
    check-config-location: true
    mapper-ids: com.example.mapper.*
    sqlSessionTemplate:
      masters: masterSqlSessionTemplate
      slaves: slaveSqlSessionTemplate

com.example.config包中创建DataSourceConfig类,如下:

@Configuration
@Slf4j
public class DataSourceConfig {

    @Bean(name = "masterDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.master")
    public DataSource masterDataSource() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean(name = "slaveDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.slave")
    public DataSource slaveDataSource() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean
    public DynamicDataSource dynamicDataSource(@Qualifier("masterDataSource") DataSource masterDataSource,
                                               @Qualifier("slaveDataSource") DataSource slaveDataSource) {
        Map<Object, Object> targetDataSources = new HashMap<>(2);
        targetDataSources.put("master", masterDataSource);
        targetDataSources.put("slave", slaveDataSource);
        DynamicDataSource dynamicDataSource = new DynamicDataSource();
        dynamicDataSource.setTargetDataSources(targetDataSources);
        dynamicDataSource.setDefaultTargetDataSource(masterDataSource);
        return dynamicDataSource;
    }

    @Bean(name = "masterTransactionManager")
    public DataSourceTransactionManager masterTransactionManager(@Qualifier("masterDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "slaveTransactionManager")
    public DataSourceTransactionManager slaveTransactionManager(@Qualifier("slaveDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "masterSqlSessionFactory")
    public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath:mapper/master/*.xml"));
        return bean.getObject();
    }

    @Bean(name = "slaveSqlSessionFactory")
    public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath:mapper/slave/*.xml"));
        return bean.getObject();
    }

    @Bean(name = "masterSqlSessionTemplate")
    public SqlSessionTemplate masterSqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

    @Bean(name = "slaveSqlSessionTemplate")
    public SqlSessionTemplate slaveSqlSessionTemplate(@Qualifier("slaveSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

com.example.config包中创建DynamicDataSource类,实现动态数据源切换,代码如下:

public class DynamicDataSource extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        return DynamicDataSourceContextHolder.getDataSource();
    }

}

com.example.config包中创建DynamicDataSourceContextHolder类,定义数据源的上下文,代码如下:

public class DynamicDataSourceContextHolder {

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

    /**
     * 设置数据源名
     *
     * @param dataSource 数据源名
     */
    public static void setDataSource(String dataSource) {
        contextHolder.set(dataSource);
    }

    /**
     * 获取数据源名
     *
     * @return 数据源名
     */
    public static String getDataSource() {
        return contextHolder.get();
    }

    /**
     * 清除数据源名
     */
    public static void clearDataSource() {
        contextHolder.remove();
    }

}

com.example.aop包中创建DataSourceAop类,为数据源切换提供切面支持,代码如下:

@Slf4j
@Aspect
@Component
public class DataSourceAop {

    @Pointcut("@annotation(com.example.annotation.Slave) ")
    public void dsSlavePointcut() {
    }

    @Before("dsSlavePointcut()")
    public void setSlaveDataSource(JoinPoint joinPoint) {
        DynamicDataSourceContextHolder.setDataSource("slave");
    }

    @After("dsSlavePointcut()")
    public void restoreDataSource(JoinPoint joinPoint) {
        DynamicDataSourceContextHolder.clearDataSource();
    }

}

com.example.annotation包中创建Slave注解,用于标注从数据源,代码如下:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Slave {

}

四、示例

1. 使用主数据源的示例

com.example.mapper.master包中创建UserMapper接口,定义查询方法,如下:

@Mapper
public interface UserMapper {

    List<User> selectAll();

}

com.example.service包中创建UserService类,注入UserMapper,实现查询所有用户的方法,如下:

@Service
public class UserService {

    @Autowired
    UserMapper userMapper;

    public List<User> getAllUsers() {
        return userMapper.selectAll();
    }

}

com.example.controller包中创建UserController类,注入UserService,实现查询所有用户的接口,如下:

@RestController
public class UserController {

    @Autowired
    UserService userService;

    @GetMapping("/users")
    public List<User> getUsers() {
        return userService.getAllUsers();
    }

}

启动应用,在浏览器中访问http://localhost:8080/users,可以查看到主数据源中的所有用户。

2. 使用从数据源的示例

com.example.mapper.slave包中创建UserMapper接口,定义查询方法,如下:

@Mapper
public interface UserMapper {

    @Slave
    List<User> selectAll();

}

com.example.service包中创建UserService类,注入UserMapper,实现查询所有用户的方法,如下:

@Service
public class UserService {

    @Autowired
    UserMapper userMapper;

    public List<User> getAllUsers() {
        return userMapper.selectAll();
    }

}

com.example.controller包中创建UserController类,注入UserService,实现查询从数据源所有用户的接口,如下:

@RestController
public class UserController {

    @Autowired
    UserService userService;

    @GetMapping("/slave-users")
    public List<User> getSlaveUsers() {
        return userService.getAllUsers();
    }

}

启动应用,在浏览器中访问http://localhost:8080/slave-users,可以查看到从数据源中的所有用户。

到这里,tk-mybatis整合springBoot使用两个数据源的方法就详细讲解完毕了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:tk-mybatis整合springBoot使用两个数据源的方法 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Spring Boot 功能整合的实现

    实现SpringBoot功能整合的过程可以分为以下几步: 在pom.xml文件中添加所需的依赖 SpringBoot提供了丰富的starter依赖,可以帮助我们快速引入需要的依赖。例如,如果需要引入Spring MVC和Thymeleaf,只需要在pom.xml文件中添加以下依赖: <dependencies> <dependency&gt…

    Java 2023年5月15日
    00
  • 浅谈Java8 判空新写法

    下面是详细讲解“浅谈Java8 判空新写法”的完整攻略。 简介 在Java编程中,需要频繁对对象、数组等进行非空判断,以避免出现空指针异常的情况。传统的判空写法往往较繁琐,不够简洁明了。在Java8中,引入了Optional类,可以使用一种新的判空写法,使代码更加简洁易懂。 Optional类介绍 Optional类是Java8中新增的类,用于解决NullP…

    Java 2023年5月26日
    00
  • Java常用JVM参数实战

    Java常用JVM参数实战 Java虚拟机(JVM)是Java语言的核心,它在执行Java程序时起到了关键的作用。Java虚拟机参数可以控制Java应用程序的各种执行行为,优化Java程序的性能和资源利用率。在本篇文章中,我将分享Java常用JVM参数的实际应用,分析它们的作用和效果。 本文主要包含以下几个方面: 启动JVM参数 Java虚拟机启动时通过设置…

    Java 2023年5月26日
    00
  • Java中关键字synchronized的使用方法详解

    下面我将详细讲解 Java 中关键字 synchronized 的使用方法。 什么是 synchronized synchronized 是 Java 中的关键字,用来保证线程安全。 在 Java 中,当多个线程访问同一资源时,如果没有对这个资源加锁,可能会发生数据不一致的情况。而使用 synchronized 关键字可以保证在同一时刻只有一个线程可以访问一…

    Java 2023年5月26日
    00
  • IDEA Java win10环境配置的图文教程

    让我详细讲解如何配置 IDEA Java 环境。 环境准备 首先需要准备以下两个软件:1. JDK,可前往 Oracle 官网下载对应版本;2. IDEA,可前往官网下载最新版本。 安装JDK 下载对应版本的JDK,并进行安装; 配置 JDK 环境变量,以 Windows 10 为例,具体步骤如下: 搜索“环境变量”并进入系统属性 -> 高级 -&gt…

    Java 2023年5月19日
    00
  • 利用Maven添加工程版本信息及时间戳

    我很乐意为您提供“利用Maven添加工程版本信息及时间戳”的完整攻略。 1. 添加Maven插件到POM文件中 在POM文件中添加Maven插件来管理版本信息。首先,您需要打开POM文件,然后再<build>标签中添加以下代码片段: <plugins> <plugin> <groupId>org.apache.…

    Java 2023年5月19日
    00
  • knife4j3.0.3整合gateway和注册中心的详细过程

    本攻略将详细讲解如何将knife4j3.0.3整合gateway和注册中心的过程。整合后,可以让我们的服务更加方便地管理和维护。下面将分步骤进行讲解。 安装gateway和注册中心 首先,我们需要安装gateway和注册中心,推荐使用Spring Cloud Gateway和Nacos作为gateway和注册中心。具体安装过程可以参考官方文档。 安装完成后,…

    Java 2023年5月19日
    00
  • Spring boot整合mybatis实现过程图解

    首先我们来讲解一下Spring Boot整合Mybatis的基本过程和步骤: 1. 引入相关依赖 首先我们需要在我们的pom.xml文件中引入以下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boo…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部