前言

很多业务场景都需要使用到多数据库,本文介绍springboot对多数据源的使用。

pom.xml文件

和整合JPA的配置文件一样。

 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

配置文件application.yml

server:port: 8080
spring:datasource:#主数据源primary:url: jdbc:mysql://localhost:3306/test?serverTimezone=GMTusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Drivertype: com.zaxxer.hikari.HikariDataSource#次数据源secondary:url: jdbc:mysql://localhost:3306/test2?serverTimezone=GMTusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverjpa:#主jpa配置primary:show-sql: trueproperties:hibernate:hbm2ddl:auto: updatedialect: org.hibernate.dialect.MySQL5InnoDBDialect#次jpa配置secondary:show-sql: trueproperties:hibernate:hbm2ddl:auto: updatedialect: org.hibernate.dialect.MySQL5InnoDBDialect

配置数据源和JPA

主数据源配置

主数据源

  1. @Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常。
  2. @Qualifier:一般@Autowired和@Qualifier一起用,通过name取多个实例中的一个。
  3. @ConfigurationProperties:根据配置文件中设置的属性,批量注入属性值。
@Configuration
public class PrimaryDataSourceConfig {/*** 扫描spring.datasource.primary开头的配置信息** @return 数据源配置信息*/@Primary@Bean(name = "primaryDataSourceProperties")@ConfigurationProperties(prefix = "spring.datasource.primary")public DataSourceProperties dataSourceProperties() {return new DataSourceProperties();}/*** 取主库数据源对象** @param dataSourceProperties 注入名为primaryDataSourceProperties的bean* @return 数据源对象*/@Primary@Bean(name = "primaryDataSource")public DataSource dataSource(@Qualifier("primaryDataSourceProperties") DataSourceProperties dataSourceProperties) {return dataSourceProperties.initializeDataSourceBuilder().build();}/*** 该方法仅在需要使用JdbcTemplate对象时选用** @param dataSource 注入名为primaryDataSource的bean* @return 数据源JdbcTemplate对象*/@Primary@Bean(name = "primaryJdbcTemplate")public JdbcTemplate jdbcTemplate(@Qualifier("primaryDataSource") DataSource dataSource) {return new JdbcTemplate(dataSource);}
}

主Jpa配置

  1. @EnableTransactionManagement:使用注解@EnableTransactionManagement开启事务支持后,可以在访问数据库的Service方法上添加注解 @Transactional 使用事务。
  2. @EnableJpaRepositories:用于Srping JPA的代码配置(详细介绍)
属性 功能
basePackage 用于配置扫描Repositories所在的package及子package。
entityManagerFactoryRef 实体管理工厂引用名称,对应到@Bean注解对应的方法。
transactionManagerRef 事务管理工厂引用名称,对应到@Bean注解对应的方法
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = PrimaryJpaConfig.REPOSITORY_PACKAGE,entityManagerFactoryRef = "primaryEntityManagerFactory",transactionManagerRef = "primaryTransactionManager"
)
public class PrimaryJpaConfig {static final String REPOSITORY_PACKAGE = "com.huzh.springbootjpamulidatasource.repository.primary";private static final String ENTITY_PACKAGE = "com.huzh.springbootjpamulidatasource.entity.primary";/*** 扫描spring.jpa.primary开头的配置信息** @return jpa配置信息*/@Primary@Bean(name = "primaryJpaProperties")@ConfigurationProperties(prefix = "spring.jpa.primary")public JpaProperties jpaProperties() {return new JpaProperties();}/*** 获取主库实体管理工厂对象** @param primaryDataSource 注入名为primaryDataSource的数据源* @param jpaProperties     注入名为primaryJpaProperties的jpa配置信息* @param builder           注入EntityManagerFactoryBuilder* @return 实体管理工厂对象*/@Primary@Bean(name = "primaryEntityManagerFactory")public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(@Qualifier("primaryDataSource") DataSource primaryDataSource,@Qualifier("primaryJpaProperties") JpaProperties jpaProperties,EntityManagerFactoryBuilder builder) {return builder// 设置数据源.dataSource(primaryDataSource)// 设置jpa配置.properties(jpaProperties.getProperties())// 设置实体包名.packages(ENTITY_PACKAGE)// 设置持久化单元名,用于@PersistenceContext注解获取EntityManager时指定数据源.persistenceUnit("primaryPersistenceUnit").build();}/*** 获取实体管理对象** @param factory 注入名为primaryEntityManagerFactory的bean* @return 实体管理对象*/@Primary@Bean(name = "primaryEntityManager")public EntityManager entityManager(@Qualifier("primaryEntityManagerFactory") EntityManagerFactory factory) {return factory.createEntityManager();}/*** 获取主库事务管理对象** @param factory 注入名为primaryEntityManagerFactory的bean* @return 事务管理对象*/@Primary@Bean(name = "primaryTransactionManager")public PlatformTransactionManager transactionManager(@Qualifier("primaryEntityManagerFactory") EntityManagerFactory factory) {return new JpaTransactionManager(factory);}
}

次数据源配置

次数据源

@Configuration
public class SecondaryDataSourceConfig {/*** 扫描spring.datasource.secondary开头的配置信息** @return 数据源配置信息*/@Bean(name = "secondaryDataSourceProperties")@ConfigurationProperties(prefix = "spring.datasource.secondary")public DataSourceProperties dataSourceProperties() {return new DataSourceProperties();}/*** 获取次数据源对象** @param dataSourceProperties 注入名为secondaryDataSourceProperties的bean* @return 数据源对象*/@Bean("secondaryDataSource")public DataSource dataSource(@Qualifier("secondaryDataSourceProperties") DataSourceProperties dataSourceProperties) {return dataSourceProperties.initializeDataSourceBuilder().build();}/*** 该方法仅在需要使用JdbcTemplate对象时选用** @param dataSource 注入名为secondaryDataSource的bean* @return 数据源JdbcTemplate对象*/@Bean(name = "secondaryJdbcTemplate")public JdbcTemplate jdbcTemplate(@Qualifier("secondaryDataSource") DataSource dataSource) {return new JdbcTemplate(dataSource);}
}

从Jpa配置

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = SecondaryJpaConfig.REPOSITORY_PACKAGE,entityManagerFactoryRef = "secondaryEntityManagerFactory",transactionManagerRef = "secondaryTransactionManager"
)
public class SecondaryJpaConfig {static final String REPOSITORY_PACKAGE = "com.huzh.springbootjpamulidatasource.repository.secondary";private static final String ENTITY_PACKAGE = "com.huzh.springbootjpamulidatasource.entity.secondary";/*** 扫描spring.jpa.secondary** @return jpa配置信息*/@Bean(name = "secondaryJpaProperties")@ConfigurationProperties(prefix = "spring.jpa.secondary")public JpaProperties jpaProperties() {return new JpaProperties();}/*** 获取次库实体管理工厂对象** @param secondaryDataSource 注入名为secondaryDataSource的数据源* @param jpaProperties       注入名为secondaryJpaProperties的jpa配置信息* @param builder             注入EntityManagerFactoryBuilder* @return 实体管理工厂对象*/@Bean(name = "secondaryEntityManagerFactory")public LocalContainerEntityManagerFactoryBean entityManagerFactory(@Qualifier("secondaryDataSource") DataSource secondaryDataSource,@Qualifier("secondaryJpaProperties") JpaProperties jpaProperties,EntityManagerFactoryBuilder builder) {return builder// 设置数据源.dataSource(secondaryDataSource)// 设置jpa配置.properties(jpaProperties.getProperties())// 设置实体包名.packages(ENTITY_PACKAGE)// 设置持久化单元名,用于@PersistenceContext注解获取EntityManager时指定数据源.persistenceUnit("secondaryPersistenceUnit").build();}/*** 获取实体管理对象** @param factory 注入名为secondaryEntityManagerFactory的bean* @return 实体管理对象*/@Bean(name = "secondaryEntityManager")public EntityManager entityManager(@Qualifier("secondaryEntityManagerFactory") EntityManagerFactory factory) {return factory.createEntityManager();}/*** 获取主库事务管理对象** @param factory 注入名为secondaryEntityManagerFactory的bean* @return 事务管理对象*/@Bean(name = "secondaryTransactionManager")public PlatformTransactionManager transactionManager(@Qualifier("secondaryEntityManagerFactory") EntityManagerFactory factory) {return new JpaTransactionManager(factory);}
}

实体类

主库实体类

@Entity
@Table(name="city")
public class City {@Id@GeneratedValue(strategy=GenerationType.AUTO)private int cityId;private String cityName;private String cityIntroduce;public City(int cityId, String cityName, String cityIntroduce) {this.cityId = cityId;this.cityName = cityName;this.cityIntroduce = cityIntroduce;}public City(String cityName, String cityIntroduce) {this.cityName = cityName;this.cityIntroduce = cityIntroduce;}public City() {}public int getCityId() {return cityId;}public void setCityId(int cityId) {this.cityId = cityId;}public String getCityName() {return cityName;}public void setCityName(String cityName) {this.cityName = cityName;}public String getCityIntroduce() {return cityIntroduce;}public void setCityIntroduce(String cityIntroduce) {this.cityIntroduce = cityIntroduce;}
}

从库实体类

@Entity
@Table(name = "house")
public class House {@Id@GeneratedValue(strategy = GenerationType.AUTO)private int houseId;private String houseName;private String houseIntroduce;public int getHouseId() {return houseId;}public void setHouseId(int houseId) {this.houseId = houseId;}public String getHouseName() {return houseName;}public void setHouseName(String houseName) {this.houseName = houseName;}public String getHouseIntroduce() {return houseIntroduce;}public void setHouseIntroduce(String houseIntroduce) {this.houseIntroduce = houseIntroduce;}public House(String houseName, String houseIntroduce) {this.houseName = houseName;this.houseIntroduce = houseIntroduce;}
}

Repository类

主库类

public interface CityRepository extends JpaRepository<City,Integer> {}

从库类

public interface HouseRepository extends JpaRepository<House, Integer> {}

Controller类

@RestController
public class TestController {@AutowiredCityRepository cityRepository;@AutowiredHouseRepository houseRepository;@GetMapping("/testDataSource")public String testDataSource() {City city = new City("北京", "中国首都");cityRepository.save(city);return "success";}@GetMapping("/testDataSource2")public String testDataSource2() {House house = new House("豪宅", "特别大的豪宅");houseRepository.save(house);return "success";}}

SpringBoot-JPA多数据源相关推荐

  1. springboot+jpa+mybatis 多数据源支持

    springboot+jpa+mybatis 多数据源支持 配置dataSource import org.springframework.beans.factory.annotation.Quali ...

  2. Springboot整合JPA多数据源(Oracle+Mysql)

    Springboot整合JPA多数据源 1. Maven 2. 基本配置 2.1 DataSource 3. 多数据源配置 3.1 JpaConfigOracle 3.2 JpaConfigMysql ...

  3. SpringBoot集成Spring Data JPA多数据源(二)

    目录 1.引入依赖 2.application.yml配置文件 3.AtomikosJtaPlatform 4.事务管理器JPAAtomikosTransactionConfig 5.主数据源配置 6 ...

  4. springboot+jpa配置多数据源(Oracle+SqlServer)

    本贴主要讲解配置多数据源 springboot+jpa的整合需要自行准备好 1.maven中要导入Oracle和SqlServer的jar包 <dependency><groupId ...

  5. springboot jpa 配置多数据源

    jpa 多数据源配置 多个 mysql 数据库配置 springboot jpa 配置多数据源其实也并不难,只需要在 properties 或者 yml中简单配置并在项目中引入配置即可. 下面以 ym ...

  6. springboot jpa 配置多数据源报错解决 Consider defining a bean named ‘entityManagerFactory‘

    版本 springboot 2.6.x 现象 jpa配置多数据源后启动报错 Consider defining a bean named 'entityManagerFactory' 解决 方法1:将 ...

  7. springboot+jpa 实现不同数据库的多数据源配置(坑整理)

    在搭建springboot+jpa 实现不同数据库的多数据源配置过程中会遇到很多坑, SpringBoot引入mysql源的pom.xml等的配置:https://www.jianshu.com/p/ ...

  8. springboot jpa sql打印_SpringBoot集成Spring Data JPA以及读写分离

    相关代码:github OSCchina JPA是什么 JPA(Java Persistence API)是Sun官方提出的Java持久化规范,它为Java开发人员提供了一种对象/关联映射工具 来管理 ...

  9. 补习系列(19)-springboot JPA + PostGreSQL

    目录 SpringBoot 整合 PostGreSQL 一.PostGreSQL简介 二.关于 SpringDataJPA 三.整合 PostGreSQL A. 依赖包 B. 配置文件 C. 模型定义 ...

  10. SpringBoot2.0 jpa多数据源配置

    随着Springboot升级到2.0,原来1.5.x的Jpa多数据源配置不能用了.现在总结一下Springboot2.0的jpa多数据源配置 连接池还是用druid,但是不能用druid的starte ...

最新文章

  1. 自动驾驶中图像与点云融合的深度学习研究进展综述
  2. git cherry-pick 详解 —— Git 学习笔记 18
  3. 3层b+树索引访问磁盘次数_【112期】面试官:为什么选择B+树作为数据库索引结构?谈谈你的理解
  4. 疯子的算法总结(四)贪心算法
  5. 输入语句 readline 1006 c#
  6. UVALive3905 流星
  7. python基础作业_017--python基础作业
  8. 管理感悟:图省事就是把别人当白痴
  9. 【光环PMP远程】管理分享——如何与各职能部门沟通
  10. 磁碟机病毒(VcingT)越来越变态——最新分析报告发布
  11. 使用lombok时,get/set方法冒红问题
  12. Rhythmbox中mp3中文乱码问题
  13. Leetcode 每日一题——860. 柠檬水找零
  14. 【跟我做】简单两部使用laravel-easy-WeChat包快速实现微信企业付款到用户零钱包功能...
  15. 安徽师范大学898专硕复习讲义
  16. 虚幻引擎的像素流技术:边缘计算与RTC架构的设计思路
  17. 38、EST序列拼接流程
  18. pta 7-34 a+aa+aaa+.. (10 分)
  19. Java8 Stream的用法
  20. android 粒子动画,使用animator实现粒子动画效果

热门文章

  1. ffplay使用dxva2实现硬解渲染
  2. Python数据分析入门—安装环境
  3. ECharts 根据不同的X轴区域,设置不同区域的背景色
  4. pytorch torch.sort()的用法以及例子
  5. android 设置静态ip,Android下用代码设置静态IP地址的方法(完美支持Android2.X,Android3.X,Android4.X)...
  6. springboot毕设项目餐饮结算系统v20h7(java+VUE+Mybatis+Maven+Mysql)
  7. v7000更换电池步骤_IBM V系列存储维护
  8. 三层交换与路由器通信
  9. mysql 主从同步恢复处理
  10. R语言绘制指数分布,并为指数分布着不同色