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

下面我将给出详细的“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日

相关文章

  • IntelliJ IDEA本地代码覆盖后恢复原来的代码图解

    下面我就来详细讲解“IntelliJ IDEA本地代码覆盖后恢复原来的代码”攻略,包含以下内容: 准备工作 操作步骤 示例说明 1. 准备工作 在进行本地代码覆盖后恢复原来的代码前,需要进行以下准备工作: 在 IntelliJ IDEA 中打开需要覆盖和恢复的项目。 在项目的 settings.gradle 中添加以下代码: groovy include ‘…

    database 2023年5月18日
    00
  • MyBatis中模糊查询使用CONCAT(‘%’,#{str},’%’)出错的解决

    首先,MyBatis中模糊查询使用CONCAT(‘%’,#{str},’%’)是比较常见的一种方式,但是在实际应用中,如果不注意一些细节,就容易出现错误。 问题现象:当使用如下代码时,查询结果为空: <select id="findByNameLike" parameterType="java.lang.String&qu…

    database 2023年5月22日
    00
  • sql server 创建临时表的使用说明

    创建临时表是SQL Server中常用的一种操作,可以在查询过程中临时存储数据,方便后续使用,同时也不会占用数据库中的实际表格。本文将介绍如何创建临时表并使用它,涉及到创建、查询、修改、删除等操作。 1. 创建临时表的语法 在SQL Server中,创建临时表需要使用CREATE TABLE语句。临时表分为本地临时表和全局临时表两种,本地临时表只能在当前会话…

    database 2023年5月21日
    00
  • Redis – increment 递增方法 | 处理防重复和并发问题

      慌途L 2019-08-11 15:51:20 21316 收藏 25分类专栏: 日常记录 Redis 文章标签: redis increment 防重复 并发 递增版权 日常记录同时被 2 个专栏收录39 篇文章0 订阅订阅专栏 Redis3 篇文章0 订阅订阅专栏Redis – increment 递增方法 | 处理防重复和并发问题一、使用场景1.有…

    Redis 2023年4月11日
    00
  • MySQL算术/比较/逻辑/位/运算符与正则举例详解

    MySQL算术运算符 MySQL提供了常见的算术运算符,包括加、减、乘、除和取余。 运算符 描述 + 加法 – 减法 * 乘法 / 除法 % 取余操作 示例代码 SELECT 10+5; — 输出 15 SELECT 10-5; — 输出 5 SELECT 10*5; — 输出 50 SELECT 10/5; — 输出 2 SELECT 10%3; …

    database 2023年5月22日
    00
  • MySQL和MariaDB的区别

    MySQL和MariaDB都是关系型数据库管理系统(RDBMS),它们在很多方面都很相似,但也有一些不同点。在本文中,我们将探讨MySQL和MariaDB之间的不同之处。 MySQL和MariaDB的历史 MySQL是由瑞典MySQL AB公司在1995年开始开发的。该项目于2008年被Sun Microsystems收购。2010年,Sun Microsy…

    database 2023年3月27日
    00
  • Mysql 5.7 新特性之 json 类型的增删改查操作和用法

    Mysql 5.7 新特性之 json 类型的增删改查操作和用法 什么是json类型 JSON是JavaScript Object Notation的缩写,是一种用于数据交换的轻量级文本格式。MySQL 5.7支持JSON类型,可以在表的列中存储JSON格式的数据,这些数据可以在MySQL中进行查询和修改,支持JSON文档中的各种数据类型如字符串、数字、数组…

    database 2023年5月21日
    00
  • vue如何将对象中所有的key赋为空值

    下面是详细讲解“Vue如何将对象中所有的key赋为空值”的攻略: 一、使用Object.keys()和forEach或reduce 首先,使用Object.keys()获取该对象所有的key,返回一个数组。 然后,使用forEach或reduce(根据实际需求而定)遍历该数组,将对象中每个key的值赋为null或空字符串。 代码示例(使用forEach): …

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