springboot + springdatajpa 多数据源配置(指定包的方式)

在实际的项目开发中,多数据源是比较常见的。
前几天在项目开发过程中,因项目需要配置多数据源,在网上拜读了许多大佬的文章,最终成功配置。
这里记录下,方便自己,也分享给大家,一起学习进步呀。 **如有不对的地方,希望各位大佬指点指点**。仅供参考。

示例项目包版本

  • Spring Boot 2.3.0.RELEASE
  • Spring Data Jpa 2.3.0.RELEASE

项目结构
在这里插入图片描述


开始配置

配置application.yml文件(注:.properties 配置一样,改为对应的配置风格即可)

# 端口
server:
  port: 9090

spring:
  profiles:
    # 指定使用 application-dev.yml 文件
    active: dev

  jpa:
    hibernate:
      ddl-auto: update

配置application-dev.yml文件(注:.properties 配置一样,改为对应的配置风格即可)

spring:
  datasource:
    # 第一个数据源
    primary:
      driver-class-name: com.mysql.cj.jdbc.Driver
      jdbcUrl: jdbc:mysql://localhost:3306/primary?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2b8
      username: root
      password: 123456
    # 第二数据源
    secondary:
      driver-class-name: com.mysql.cj.jdbc.Driver
      jdbcUrl: jdbc:mysql://localhost:3306/secondary?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2b8
      username: root
      password: 123456

上述两个.yml 文件的配置这里不作赘述,代码中已添加相应的注解。值得注意的是,在配置application-dev.yml时,为保持数据源的有效性,指定的数据源必须是你自己的数据源。
配置第一个数据源(主数据源)

package com.hy.multipledatasources.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.persistence.EntityManager;
import javax.sql.DataSource;
import java.util.Objects;

/***
 * @description 多数据源配置类。主数据源
 * @EnableJpaRepositories:  basePackages 指定到自己的repository。
 * @author hy
 * @date 2020/5/31 13:50
 **/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {"com.hy.multipledatasources.employee.repository"},
                       entityManagerFactoryRef = "primaryEntityManagerFactory",
                       transactionManagerRef = "primaryTransactionManager")
public class MultipleDataSourcesPrimaryConfig {

    /**
     * 配置数据源   @Primary . 标记为主数据源
     * @return 、
     */
    @Bean("primaryDataSource")
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    public DataSource primaryDataSource(){
        return DataSourceBuilder.create().build();
    }

    /**
     * 实体管理工厂的bean
     * @param builder \
     * @return \
     */
    @Bean(name = "primaryEntityManagerFactory")
    @Primary
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(primaryDataSource())
                //这个是指向你的domain, entity的路径。 实体类所在的包
                .packages("com.hy.multipledatasources.employee.entity")
                .persistenceUnit("primary")
                .build();
    }

    /**
     * 配置 实体管理器
     * @param builder 、
     * @return 、
     */
    @Bean(name = "primaryEntityManager")
    @Primary
    public EntityManager primaryEntityManager(EntityManagerFactoryBuilder builder){
        return  Objects.requireNonNull(entityManagerFactory(builder).getObject()).createEntityManager();
    }

    /**
     * 配置事务管理
     * @param builder 、
     * @return 、
     */
    @Bean(name = "primaryTransactionManager")
    @Primary
    public PlatformTransactionManager primaryTransactionManager(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(Objects.requireNonNull(entityManagerFactory(builder).getObject()));
    }
}

配置第二个数据源(次 数据源)

package com.hy.multipledatasources.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.persistence.EntityManager;
import javax.sql.DataSource;
import java.util.Objects;

/***
 * @description 多数据源配置类. 次数据源
 * @EnableJpaRepositories:  basePackages 指定到自己的repository。
 * @author hy
 * @date 2020/5/31 14:10
 **/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {"com.hy.multipledatasources.user.repository"},
                       entityManagerFactoryRef = "secondaryEntityManagerFactory",
                       transactionManagerRef = "secondaryTransactionManager")
public class MultipleDataSourcesSecondaryConfig {
    /**
     * 配置次 数据源
     * @return 、
     */
    @Bean("secondaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource secondaryDataSource(){
        return DataSourceBuilder.create().build();
    }

    /**
     * 实体管理工厂的bean
     * @param builder \
     * @return \
     */
    @Bean(name = "secondaryEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory(EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(secondaryDataSource())
                //这个是指向你的domain, entity的路径
                .packages("com.hy.multipledatasources.user.entity")
                .persistenceUnit("secondary")
                .build();
    }

    /**
     * 配置 实体管理器
     * @param builder 、
     * @return 、
     */
    @Bean(name = "secondaryEntityManager")
    public EntityManager secondaryEntityManager(EntityManagerFactoryBuilder builder){
        return  Objects.requireNonNull(secondaryEntityManagerFactory(builder).getObject()).createEntityManager();
    }

    /**
     * 配置事务管理
     * @param builder 、
     * @return 、
     */
    @Bean(name = "secondaryTransactionManager")
    public PlatformTransactionManager secondaryTransactionManager(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(Objects.requireNonNull(secondaryEntityManagerFactory(builder).getObject()));
    }
}


对于上述两个数据源的配置,代码中已添加相应的注解。
这里值得注意的是:MultipleDataSourcesPrimaryConfig (主数据源)中使用 @Primary 注解标记为主数据源。MultipleDataSourcesSecondaryConfig (次数据源) 中不需要添加 @Primary 注解。
两个数据的配置中,需要在 @EnableJpaRepositories 注解的参数 basePackages 中指定自己的repository。 在 实体管理工厂的bean 中添加自己的 domain、 entity (实体类所在包)。


上述便是 指定包方式 多数据源的。下面展示下测试效果:

1-1、添加用户:
在这里插入图片描述

1-2、查看对应数据库中对应的用户表:
在这里插入图片描述
OK, 成功插入一条用户信息。
1-3、查询用户信息:
在这里插入图片描述
查询成功。

2-1、新增员工:
在这里插入图片描述
2-2、查看对应数据库中对应的员工表:
在这里插入图片描述
2-3、查询插入的员工信息:
在这里插入图片描述
OK。配置完成并测试通过后给大家分享的 多数据源配置(指定包的方式) 就到这里了。 对于基于注解的 多数据源配置 这几天整理下,再分享给大家。。。。。

最后给大家附上本次分享的源码:

本文示例源代码

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个用于构建独立的、可执行的Spring应用程序的框架,简化了Spring应用程序的配置和部署。JPA(Java Persistence API)是一种用于管理Java对象和关系数据之间映射的规范。Druid是阿里巴巴开源的关系型数据连接池。 在Spring Boot配置多数据源需要以下几步: 1. 引入相关依赖:需要引入Spring BootSpring Data JPA和Druid的相关依赖。 2. 配置数据源:在application.properties或application.yml文件中配置多个数据源的连接信息,并指定每个数据源的名称和相关属性。 3. 配置数据源连接池:使用@ConfigurationProperties注解创建多个数据源的连接池对象,并指定数据源的名称以及相关属性。 4. 配置实体管理器工厂:为每个数据源配置对应的实体管理器工厂,用于处理JPA实体与数据之间的映射关系。 5. 配置事务管理器:为每个数据源配置对应的事务管理器,用于处理事务操作。 6. 配置数据源路由:创建动态数据源,根据传入的数据源名称选择对应的数据源进行操作。 7. 配置JPA的Repository:创建接口继承JpaRepository,用于定义数据访问方法。 通过以上步骤配置多数据源后,就可以在Spring Boot应用程序中使用多个数据源进行数据的操作。可以根据需要在Service或Controller中使用@PersistenceContext注解指定具体的数据源,或者使用@Primary注解指定默认的数据源。 总结:通过Spring Boot的自动配置和Druid的连接池,可以很方便地实现多数据源配置。使用JPA进行数据操作,能够有效地减少开发人员编写SQL语句的工作量,提高开发效率。通过合理的配置,可以根据需要选择不同的数据源进行操作,实现灵活的数据访问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值