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日

相关文章

  • MySQL提示The InnoDB feature is disabled需要开启InnoDB的解决方法

    当MySQL提示“The InnoDB feature is disabled”,表示InnoDB存储引擎没有被开启,需要进行相应的操作来开启此功能。下面是完整的攻略。 1. 检查MySQL是否支持InnoDB存储引擎 在MySQL命令行窗口输入以下命令检查MySQL是否支持InnoDB存储引擎: SHOW ENGINES; 如果结果中没有InnoDB,说明…

    database 2023年5月22日
    00
  • 如何使用MySQL Workbench操作数据库(表)

    下面是详细讲解“如何使用MySQL Workbench操作数据库(表)”的完整攻略: 准备工作 下载MySQL Workbench并安装,可以在 MySQL官网 下载。 连接到需要操作的MySQL数据库。 操作数据库 新建数据库: 在MySQL Workbench上方导航栏中选择“Database” → ”Create Database”。 输入数据库名称和…

    database 2023年5月21日
    00
  • java实现文件上传到服务器

    下面我来详细讲解Java实现文件上传到服务器的完整攻略。首先,我们需要了解两种上传文件的方式:使用Servlet API和使用第三方库。 使用Servlet API 使用Servlet API实现文件上传需要依赖于HttpServletRequest和Part对象。具体步骤如下: 1. 在html页面中添加文件上传表单 <form method=&qu…

    database 2023年5月21日
    00
  • MySQL数据库表的合并与分区实现介绍

    MySQL数据库表的合并与分区实现介绍 1. 表的合并 MySQL支持将多张表的数据合并成一张表,常用的两种合并方式为UNION和JOIN。 1.1 UNION操作 UNION操作用来组合多个结果集,要求每个结果集的列数和数据类型必须一致。语法格式如下: SELECT column_name(s) FROM table1 UNION SELECT colum…

    database 2023年5月19日
    00
  • MySQL timestamp自动更新时间分享

    当我们需要在MySQL中自动更新一个表的最后修改时间,可以使用timestamp数据类型,它会在表中每次更新记录时自动更新为当前时间。下面是介绍如何使用MySQL的timestamp类型自动更新时间的方法: 1. 创建带有timestamp的表 在创建表时,可以使用类似下面的语句创建一个带有timestamp类型的列: CREATE TABLE my_tab…

    database 2023年5月22日
    00
  • MySQ登录提示ERROR 1045 (28000)错误的解决方法

    当使用MySQL登录时,可能会遇到错误提示ERROR 1045 (28000),这通常是因为用户名或密码不正确而导致的,也有可能是权限问题所致。下面是解决方法的完整攻略。 1. 确认用户名和密码 首先,请确认你输入的用户名和密码是否正确。如果你不确定自己的用户名和密码是否正确,可以尝试使用以下命令测试登录: mysql -u username -p 其中,-…

    database 2023年5月18日
    00
  • 三天吃透MySQL面试八股文

    什么是MySQL MySQL是一个关系型数据库,它采用表的形式来存储数据。你可以理解成是Excel表格,既然是表的形式存储数据,就有表结构(行和列)。行代表每一行数据,列代表该行中的每个值。列上的值是有数据类型的,比如:整数、字符串、日期等等。 数据库的三大范式 第一范式1NF 确保数据库表字段的原子性。 比如字段 userInfo: 广东省 10086′ …

    2023年4月8日
    00
  • Oracle 触发器trigger使用案例

    下面是详细讲解 “Oracle 触发器 Trigger 使用案例” 的完整攻略。 1.什么是 Oracle 触发器(Trigger) Oracle 触发器是一种特殊的存储过程,可以在数据库表上定义并在特定的事件发生时自动执行。这些事件可以是对表进行的插入、更新或删除操作。 Oracle 触发器可以用来实现复杂的业务逻辑,例如:数据约束、自动填充、业务日志等等…

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