springboot+mybatis实现mysql和oracle多数据源

这篇具有很好参考价值的文章主要介绍了springboot+mybatis实现mysql和oracle多数据源。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.aop+注解方式

在实际项目中很多时候会涉及到多个数据库的访问,或者数据库读写分离的形式。

下面通过使用 Aspect+注解来实现mysql+oracle的多数据源配置(注意:事务一致性未提供)

首先要去oracle官网下载ojdbc的jar包,根据oracle的版本去下载,或者在下载的oracle的jdbc包下的lib里面有,然后导入项目中!!!

动态数据源流程说明

Spring Boot 的动态数据源,本质上是把多个数据源存储在一个 Map 中,当需要使用某个数据源时,从 Map 中获取此数据源进行处理。而在 Spring 中,已提供了抽象类 AbstractRoutingDataSource 来实现此功能。因此,我们在实现动态数据源的,只需要继承它,重写determineCurrentLookupKey的方法即可

代码如下:

1.数据库连接信息配置
在application.yml中添加如下信息,根据自己项目的需要进行替换
spring:
  datasource:
    master:
      driver-class-name: com.mysql.cj.jdbc.Driver
      jdbc-url: jdbc:mysql://localhost:3306/数据库名
      username: root
      password: root
    slave:
      type: com.alibaba.druid.pool.DruidDataSource
      platform: oracle
      jdbc-url: jdbc:oracle:thin:@localhost:1521:数据库名
      username: system
      password: system
      #指定数据源的全限定名
      driver-class-name: oracle.jdbc.driver.OracleDriver

注意:根据springboot的版本不同,有不同的写法,在springboot2.0的版本中,注意url要写成jdbc-url,尝试过url的话会报错

2.数据源配置

根据连接信息,把数据源注入到 Spring 中,添加 DynamicDataSourceConfig 文件,配置如下

@Configuration
@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class })
public class DynamicDataSourceConfig {
    @Bean(DataSourceConstants.MASTER)
    @ConfigurationProperties(prefix = "spring.datasource.master")
    public DataSource masterDataSource() {
        return DataSourceBuilder.create().build();
    }

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

    @Bean
    @Primary
    public DataSource dynamicDataSource() {
        Map<Object, Object> dataSourceMap = new HashMap<>(2);
        dataSourceMap.put(DataSourceConstants.MASTER, masterDataSource());
        dataSourceMap.put(DataSourceConstants.SLAVE, slaveDataSource());
        //设置动态数据源
        DynamicDataSource dynamicDataSource = new DynamicDataSource();
        dynamicDataSource.setTargetDataSources(dataSourceMap);
        dynamicDataSource.setDefaultTargetDataSource(masterDataSource());
        return dynamicDataSource;
    }


}

需要在 DynamicDataSourceConfig 中,排除 DataSourceAutoConfiguration 的自动配置,否则 会出现The dependencies of some of the beans in the application context form a cycle的错误

使用注解 Primary 优先从动态数据源中获取

DataSourceConstants类:

public class DataSourceConstants {
    public final static String MASTER = "master";

    public final static String SLAVE = "slave";
}
3.动态数据源设置

添加动态数据源类

DynamicDataSourceDynamicDataSourceContextHolder

public class DynamicDataSource extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        return DynamicDataSourceContextHolder.getContextKey();
    }

}
public class DynamicDataSourceContextHolder {
   
    /*这是为了线程安全*/
    private static final ThreadLocal<String> DATASOURCE_CONTEXT_KEY_HOLDER = new ThreadLocal<>();

    /* 设置/切换数据源*/
    public static void setContextKey(String key) {
       
        DATASOURCE_CONTEXT_KEY_HOLDER.set(key);
    }

    /* 获取数据源名称 */
    public static String getContextKey() {
        String key = DATASOURCE_CONTEXT_KEY_HOLDER.get();
        return key == null ? DataSourceConstants.MASTER : key;
    }

    /*删除当前数据源名称*/
    public static void removeContextKey() {
        DATASOURCE_CONTEXT_KEY_HOLDER.remove();
    }

}
4.使用AOP选择数据源
自定义一个annotation DbAnnotation注解
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface DbAnnotation {
    /**
     * 数据源名称,默认master
     */
    String value() default DataSourceConstants.MASTER;
}

定义数据源切面

@Aspect
@Component
public class DynamicDataSourceAspect {
    //拦截DbAnnotation
    @Pointcut("@within(com.example.constant.DbAnnotation)"+"||@annotation(com.example.constant.DbAnnotation)")
    public void dataSourcePointCut() {
    }

    @Around("dataSourcePointCut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        String dsKey = this.getDSAnnotation(joinPoint).value();
        DynamicDataSourceContextHolder.setContextKey(dsKey);
        try {
            return joinPoint.proceed();
        } catch (Exception ex) {
            throw ex;
        } finally {
            DynamicDataSourceContextHolder.removeContextKey();
        }
    }

    /**
     * 根据类或方法获取数据源注解
     */
    private DbAnnotation getDSAnnotation(ProceedingJoinPoint joinPoint) {
        //mybatis生成的代理类,所以获取它的接口来获取DbAnnotation注解信息
        Class<?> targetClass = joinPoint.getTarget().getClass().getInterfaces()[0];
        DbAnnotation dsAnnotation = targetClass.getAnnotation(DbAnnotation.class);
        // 先判断类的注解,再判断方法注解
        if (Objects.nonNull(dsAnnotation)) {
            return dsAnnotation;
        } else {
            MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
            DbAnnotation annotation = methodSignature.getMethod().getAnnotation(DbAnnotation.class);
            return annotation;
        }
    }
}

在mapper接口上添加@DbAnnotation注解,为slave数据源添加了个测试的mapper:

@Mapper
public interface OrUserMapper extends BaseMapper<OrUser> {
    @Select("select *from tb_user")
    @DbAnnotation(DataSourceConstants.SLAVE)
    List<OrUser> select();
}
@RequestMapping("/user/select")
public void test(){
    List<OrUser> select = orUserMapper.select();
    System.out.println(select.get(0));
}

然后如果想要在同一个函数里面调用不同的数据库的话,此时不能将注解定义在函数上面,不然mybatis-plus会报错,因为mybatis-plus 默认来说是运行期间就只支持一种数据源,初始化的时候就已经决定了,无法动态转换。

所以我们可以在一个方法里面需要调用不同数据库的地方的函数或者mapper接口那边定义使用的数据源即可

比如在mysql的mapper上面加上注解:

@Mapper
//可以加或者不加也可以
@DbAnnotation(DataSourceConstants.MASTER)
public interface UserMapper extends BaseMapper<User> {
}

其实加和不加都可以,因为不加的话使用的是默认的数据源, 默认的就是mysql

在使用oracle数据库的mapper里面

@Mapper
public interface OrUserMapper extends BaseMapper<OrUser> {
    @Select("select *from tb_user")
    @DbAnnotation(DataSourceConstants.SLAVE)
    List<OrUser> select();
}

测试:

public void select() {
    List<OrUser> select = orUserMapper.select();
    List<User> users = userMapper.selectList(null);
    System.out.println(select.get(0));
    System.out.println(users.get(0));
}

2.使用spring提供的一个依赖

 <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>

配置文件:

spring:
  datasource:
    dynamic:
      primary: master # 配置默认数据库
      datasource:
    #主库数据源
         master:
           driver-class-name: com.mysql.cj.jdbc.Driver
           url: jdbc:mysql://127.0.0.1:3306/数据库名
           username: root
           password: root
         slave:
           type: com.alibaba.druid.pool.DruidDataSource
           platform: oracle
           url: jdbc:oracle:thin:@localhost:1521:数据库名
           username: system
           password: system
           #指定数据源的全限定名
           driver-class-name: oracle.jdbc.driver.OracleDriver

然后在需要切换的地方使用@DS注解即可

 @DS("slave")
    public void test(){
        List<OrUser> select = userMapper.select();
        System.out.println(select.get(0).getUsername());
    }

参考链接:springboot 配置多数据源(Aop+注解实现)_mj_940620的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-728627.html

到了这里,关于springboot+mybatis实现mysql和oracle多数据源的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot结合MyBatis实现多数据源配置

    SpringBoot框架实现多数据源操作,首先需要搭建Mybatis的运行环境。 由于是多数据源,也就是要有多个数据库,所以,我们创建两个测试数据库,分别是:【sp-demo01】和【sp-demo02】,如下图所示: 具体SQL代码: 创建【sp-demo01】数据库。 创建【sp-demo02】数据库。 MyBatis框架中,

    2024年02月09日
    浏览(31)
  • 若依分离版——配置多数据源(mysql和oracle),实现一个方法操作多个数据源

    目录 一、若依平台配置           二、编写oracle数据库访问的各类文件  三.  一个方法操作多个数据源 一、若依平台配置 1、在ruoyi-admin的pom.xml添加oracle依赖 2、引入ojdbc6.jar包 在ruoyi-admin的resource下创建lib文件夹,将ojdbc6.jar包保存在此目录下 3.  刷新maven 刷新maven保证ruo

    2024年02月05日
    浏览(31)
  • springBoot-Mybatis-Plus 多数据源切换实现

    前言:本文主要通过AbstractRoutingDataSource,实现根据 http 访问携带的标识动态切换数据源; 1 AbstractRoutingDataSource 介绍: AbstractRoutingDataSource 是 Spring 框架中的一个抽象类,它可以用来实现动态数据源切换。在多数据源场景下,AbstractRoutingDataSource 可以根据不同的请求来动态地选

    2024年02月03日
    浏览(38)
  • 【万字长文】SpringBoot整合MyBatis搭建MySQL多数据源完整教程(提供Gitee源码)

    前言:在我往期的博客介绍了2种关于如何使用SpringBoot搭建多数据源操作,本期博客我参考的是目前主流的框架,把最后一种整合多数据源的方式以博客的形式讲解完,整合的过程比较传统和复杂,不过我依旧会把每个实体类的思路都给大家讲解清楚的,项目的最后我都会提

    2024年02月14日
    浏览(33)
  • SpringBoot 整合 Neo4j、MySQL 多数据源方案(Druid Mybatis DynamicDatasource)

    本文总结了Neo4j和Spring/SpringBoot、Alibaba Druid、Dynamic Datasource、Mybatis等整合方案,对相应配置做了详细说明。 添加Neo4j JDBC Driver依赖 添加application.yml配置 添加Neo4j JDBC Driver + Alibaba Druid依赖 添加application.yml配置 添加Neo4j JDBC Driver、Alibaba Druid、Dynamic DataSource依赖 添加application.y

    2023年04月08日
    浏览(41)
  • SpringBoot整合Mybatis-Plus+Druid实现多数据源

    🌺本文主要讲解 springboot +mybatisplus + druid 实现多数据源配置功能 🌺 主页传送门:📀 传送 Spring Boot:    Spring Boot是一个基于Spring框架的开源Java开发框架,旨在简化Spring应用程序的开发、配置和部署。它提供了一种快速、敏捷的方式来构建独立的、生产级别的Spring应用程

    2024年02月09日
    浏览(91)
  • Spring Boot + MyBatis-Plus 实现 MySQL 主从复制动态数据源切换

    MySQL 主从复制是一种常见的数据库架构,它可以提高数据库的性能和可用性。 动态数据源切换则可以根据业务需求,在不同场景下使用不同的数据源,比如在读多写少的场景下,可以通过切换到从库来分担主库的压力 。 在本文中,我们将介绍如何在 Spring Boot 中实现 MySQL 动

    2024年02月19日
    浏览(41)
  • SpringBoot整合mysql、postgres、sqlserver实现多数据源配置案例

            分享一下近期处理的一个小demo,关于配置多数据源实现不同服务之间的数据推送和数据治理。第一次接触到pg库和sqlserver一头雾水,选择了JDBC+mybatis-plus的方式去链接。 1、首先要引入以下依赖 2、demo的项目结构如下 3、yml配置文件 4、配置类 5、controller、dao、service以

    2024年02月06日
    浏览(33)
  • springboot+mybatis+pgsql多数据源配置

    jdk环境:1.8 配置了双数据源 pgsql+pgsql   第一个配置文件 :PrimaryDataSourceConfig 参数详情 :@Primary //指定你主要的数据源是哪一个 例如:我这里主要数据源是第一个配置文件 所以我的第二个配置文件并没有加这个注解 注意修改: @MapperScan里面的basePackages @ConfigurationProperties里面

    2024年02月03日
    浏览(94)
  • SpringBoot+mybatis+pgsql多个数据源配置

    jdk环境:1.8 配置了双数据源springboot+druid+pgsql,application.properties配置修改如下: 主数据库注入 从数据库Java代码:      这里就就不一一贴代码了,主要是接口对应mybatis xml配置文件。项目文件接口如下: 创建成以上目录就可以了,分别是dao接口、Java数据源配置、mybatis映射

    2024年02月11日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包