springboot2+mybatis多种方式实现多数据配置方法

yizhihongxing

下面我将给出详细的“springboot2+mybatis多种方式实现多数据配置方法”的攻略,包含以下内容:

  1. 环境配置
  2. 多数据源引入方式
  3. 多数据源的实现

1. 环境配置

首先,我们需要在pom.xml文件中引入springboot-mybatis-starter,可以使用如下配置:

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

同时,如果需要连接多个数据源,也需要在pom.xml文件中引入对应的数据库驱动:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 这里可以引入多个数据库驱动,以实现对多个不同的数据源的支持 -->

2. 多数据源引入方式

接着,我们需要在SpringBoot的配置文件application.properties或application.yml中进行多数据源的配置,并且在代码中使用对应的数据源进行操作。我们可以使用多种方式来实现多数据源的配置:

2.1 使用SpringBoot2提供的多配置文件方式

  • 在resources目录下新建application-dev.properties和application-prod.properties,并分别配置对应的数据库信息,如下所示:
# application-dev.properties
spring.datasource.url=jdbc:mysql://localhost:3306/db1?useSSL=false
spring.datasource.username=root
spring.datasource.password=123456

# application-prod.properties
spring.datasource.url=jdbc:mysql://localhost:3306/db2?useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
  • 在SpringBoot主启动类中,使用@ConfigurationProperties(prefix = “spring.datasource”)注解,将application.properties或application.yml中的数据库配置映射到DataSource对象中:
@Configuration
@MapperScan(basePackages = "com.example.dao")
public class DataSourceConfig {

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

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

@SpringBootApplication
public class MultiDatasourceApplication {

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

}
  • 在具体的操作类中,使用@Qualifier注解指定使用哪个数据源:
@Service("userService")
public class UserServiceImpl implements UserService {

    @Autowired
    @Qualifier("devDataSource")
    private DataSource devDataSource;

    @Autowired
    @Qualifier("prodDataSource")
    private DataSource prodDataSource;

    @Autowired
    private UserMapper userMapper;

    @Override
    public User getUserById(Long id) {
        User user;
        if (id < 100) {
            // 使用devDataSource数据源
            user = userMapper.selectByPrimaryKey(id, devDataSource);
        } else {
            // 使用prodDataSource数据源
            user = userMapper.selectByPrimaryKey(id, prodDataSource);
        }

        return user;
    }
}

2.2 使用SpringBoot2提供的多Profile方式

  • 在SpringBoot主启动类中,使用spring.profiles.active属性指定当前使用的配置文件,如下所示:
@SpringBootApplication
public class MultiDatasourceApplication {

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(MultiDatasourceApplication.class);
        app.setAdditionalProfiles("dev"); // 指定使用dev配置文件
        // app.setAdditionalProfiles("prod"); // 指定使用prod配置文件
        app.run(args);
    }

}
  • 在配置文件中,针对不同的配置文件,指定不同的数据源信息,如下所示:
# application.yml
spring:
  profiles:
    active: prod

---

# application-dev.yml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/db1?useSSL=false
    username: root
    password: 123456

---

# application-prod.yml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/db2?useSSL=false
    username: root
    password: 123456
  • 采用与2.1中相似的方式对具体的操作类进行注入和使用。

3. 多数据源的实现

了解了多种数据源的配置方式后,接下来我们来了解如何实现多数据源的操作。

3.1 使用Spring的AbstractRoutingDataSource实现动态数据源

  • 实现一个继承AbstractRoutingDataSource的动态数据源类,重写determineCurrentLookupKey方法,根据当前的线程,动态切换数据源:
public class DynamicDataSource extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDataSourceKey();
    }

}
  • 创建一个数据源的上下文类,通过ThreadLocal来保存当前的数据源key:
public class DataSourceContextHolder {

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

    public static void setDataSourceKey(String dataSourceKey) {
        CONTEXT_HOLDER.set(dataSourceKey);
    }

    public static String getDataSourceKey() {
        return CONTEXT_HOLDER.get();
    }

    public static void clearDataSourceKey() {
        CONTEXT_HOLDER.remove();
    }
}
  • 在SpringBoot配置类中,创建两个DataSource对象,分别指定不同的数据源信息:
@Configuration
@MapperScan(basePackages = "com.example.dao")
public class DataSourceConfig {

    @Bean(name = "devDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.dev")
    public DataSource devDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "prodDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.prod")
    public DataSource prodDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "dynamicDataSource")
    public DataSource dynamicDataSource(@Qualifier("devDataSource") DataSource devDataSource,
                                         @Qualifier("prodDataSource") DataSource prodDataSource) {
        Map<Object, Object> targetDataSource = new HashMap<>();
        targetDataSource.put("dev", devDataSource);
        targetDataSource.put("prod", prodDataSource);
        DynamicDataSource dataSource = new DynamicDataSource();
        dataSource.setTargetDataSources(targetDataSource);
        dataSource.setDefaultTargetDataSource(devDataSource);
        return dataSource;
    }

}
  • 在需要动态切换数据源的操作类中,使用@Autowired注解直接注入DynamicDataSource即可:
@Service("userService")
public class UserServiceImpl implements UserService {

    @Autowired
    private DynamicDataSource dynamicDataSource;

    @Autowired
    private UserMapper userMapper;

    @Override
    public User getUserById(Long id) {
        if (id < 100) {
            // 切换到dev数据源
            DataSourceContextHolder.setDataSourceKey("dev");
        } else {
            // 切换到prod数据源
            DataSourceContextHolder.setDataSourceKey("prod");
        }

        User user = userMapper.selectByPrimaryKey(id);
        DataSourceContextHolder.clearDataSourceKey();

        return user;
    }
}

参考示例代码:https://github.com/Ricardo-LiPeng/springboot-mybatis-multipledatasource

3.2 使用注解和AOP实现动态数据源

  • 在动态切换数据源的注解类中,使用自定义注解@TargetDataSource来指定需要使用的数据源key:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface TargetDataSource {
    String value() default "";
}
  • 创建一个AOP切面类,在切面中动态切换数据源:
@Aspect
@Component
public class DynamicDataSourceAspect {

    @Before("@annotation(ds)")
    public void beforeSwitchDS(JoinPoint point, TargetDataSource ds) {
        String dataSourceValue = ds.value();
        if (StringUtils.isEmpty(dataSourceValue)) {
            // 没有指定数据源key,使用默认数据源
            DataSourceContextHolder.setDataSourceKey("dev");
        } else {
            DataSourceContextHolder.setDataSourceKey(dataSourceValue);
        }
    }

    @After("@annotation(ds)")
    public void afterSwitchDS(JoinPoint point, TargetDataSource ds) {
        DataSourceContextHolder.clearDataSourceKey();
    }

}
  • 在需要动态切换数据源的操作类中,使用自定义注解@TargetDataSource来指定需要使用的数据源key:
@Service("userService")
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @TargetDataSource("prod") // 指定使用prod数据源
    @Override
    public User getUserById(Long id) {
        return userMapper.selectByPrimaryKey(id);
    }
}

参考示例代码:https://github.com/Ricardo-LiPeng/springboot-mybatis-multipledatasource/tree/master/springboot-mybatis-multipledatasource-annotation方式

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot2+mybatis多种方式实现多数据配置方法 - Python技术站

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

相关文章

  • MySQL——修改root密码的4种方法(以windows为例)

    方法1: 用SET PASSWORD命令 首先登录MySQL。 格式:mysql> set password for 用户名@localhost = password(‘新密码’); 例子:mysql> set password for root@localhost = password(‘123’); 方法2:用mysqladmin 格式:my…

    MySQL 2023年4月16日
    00
  • Linux内核设备驱动之内存管理笔记整理

    我来详细解析一下“Linux内核设备驱动之内存管理笔记整理”的攻略。 概述 本文旨在介绍 Linux 内核设备驱动中的内存管理部分,包括内存的分配、释放、映射等方面,并对常用的内存管理 API 做简单的示例介绍。 内存分配 在 Linux 内核中,内存的分配可以通过kmalloc 和 vmalloc 两个函数实现。 kmalloc kmalloc 函数可以用…

    database 2023年5月22日
    00
  • RDBMS和IBM DB2的区别

    RDBMS是关系型数据库管理系统的简称,它以关系数据模型为基础,使用表格来存储和管理数据。而IBM DB2是企业级的关系型数据库管理系统,是IBM公司开发的一种高性能、可扩展的数据库软件。 以下是RDBMS和IBM DB2的区别及实例说明: RDBMS 数据组织结构 RDBMS使用表格来存储和管理数据。表格由行和列组成,每个表格包含多个字段或属性,每个字段或…

    database 2023年3月27日
    00
  • Spring boot 使用Redis 消息队列

    package com.loan.msg.config; import com.loan.msg.service.MessageReceiver; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configur…

    Redis 2023年4月12日
    00
  • linux实现mysql数据库每天自动备份定时备份

    首先我们需要安装crontab,一个在Linux下用来定时执行任务的工具。可以使用以下命令进行安装: sudo apt-get update sudo apt-get install cron 安装完成后,我们需要编辑cron的定时任务配置文件。在终端输入以下命令: crontab -e 该命令会打开当前用户的crontab配置文件。接下来,我们可以在文件中…

    database 2023年5月22日
    00
  • linux下安装启动性能测试工具redis benchmark

    下面是详细的操作步骤: 准备工作 在开始安装 Redis Benchmark 工具之前,需要先安装 Redis 数据库。可以参考以下文章进行安装: Ubuntu18.04下安装Redis教程 安装完 Redis 数据库之后,可以使用以下命令来检查 Redis 是否安装成功: redis-cli ping 如果出现 PONG 字样,则说明 Redis 安装成功…

    database 2023年5月22日
    00
  • SQL Server 使用join all优化 or 查询速度

    什么是JOIN ALL 在SQL Server中,JOIN ALL实际上是UNION ALL联接(一种特殊的联接方式)。UNION ALL是将两个或多个SELECT语句的结果集组合成一个包含所有行的结果集。在执行UNION ALL联接时,数据库管理系统将查询中的所有结果集组合到一个新临时表中,以优化执行效率。与INNER JOIN不同,它是将两个表的每一行都…

    database 2023年5月21日
    00
  • MySQL 数据库 ALTER命令讲解

    MySQL 数据库 ALTER命令讲解 概述 ALTER命令是MySQL用于修改表结构的命令,它允许添加、删除、修改表的列、约束条件以及其他属性等。 ALTER命令格式 ALTER命令的语法如下: ALTER TABLE table_name action; 其中,table_name表示要修改的表名,action表示接下来要执行的命令,可选的action有…

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