1 介绍

  • 使用JPA的配置两个数据库,配置不同的数据库。

    2 示例

    2.1 依赖引入

    1. <parent>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-parent</artifactId>
    4. <version>2.1.3.RELEASE</version>
    5. <relativePath/> <!-- lookup parent from repository -->
    6. </parent>
    7. <dependencies>
    8. <dependency>
    9. <groupId>org.springframework.boot</groupId>
    10. <artifactId>spring-boot-starter-web</artifactId>
    11. </dependency>
    12. <dependency>
    13. <groupId>org.springframework.boot</groupId>
    14. <artifactId>spring-boot-starter-data-jpa</artifactId>
    15. </dependency>
    16. <dependency>
    17. <groupId>org.springframework.boot</groupId>
    18. <artifactId>spring-boot-starter-actuator</artifactId>
    19. </dependency>
    20. <dependency>
    21. <groupId>mysql</groupId>
    22. <artifactId>mysql-connector-java</artifactId>
    23. </dependency>
    24. <dependency>
    25. <groupId>org.projectlombok</groupId>
    26. <artifactId>lombok</artifactId>
    27. <scope>provided</scope>
    28. </dependency>
    29. <dependency>
    30. <groupId>org.springframework.boot</groupId>
    31. <artifactId>spring-boot-starter-test</artifactId>
    32. <scope>test</scope>
    33. </dependency>
    34. </dependencies>

    2.2 自定义配置两个数据库

    ``` spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/primary?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT&allowPublicKeyRetrieval=true spring.datasource.primary.username=root spring.datasource.primary.password=123456 spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.second.jdbc-url=jdbc:mysql://localhost:3306/second?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT&allowPublicKeyRetrieval=true spring.datasource.second.username=root spring.datasource.second.password=123456 spring.datasource.second.driver-class-name=com.mysql.cj.jdbc.Driver

日志打印执行的SQL

spring.jpa.show-sql=true

Hibernate的DDL策略

spring.jpa.hibernate.ddl-auto=update spring.jpa.hibernate.format_sql=true spring.jpa.hibernate.primary-dialect=org.hibernate.dialect.MySQL55Dialect spring.jpa.hibernate.second-dialect=org.hibernate.dialect.MySQL55Dialect

  1. <a name="lL4ZT"></a>
  2. ## 2.3 配置默认的数据库源
  3. ```java
  4. package com.hikktn.config;
  5. import org.springframework.beans.factory.annotation.Qualifier;
  6. import org.springframework.boot.context.properties.ConfigurationProperties;
  7. import org.springframework.boot.jdbc.DataSourceBuilder;
  8. import org.springframework.context.annotation.Bean;
  9. import org.springframework.context.annotation.Configuration;
  10. import org.springframework.context.annotation.Primary;
  11. import org.springframework.stereotype.Component;
  12. import javax.sql.DataSource;
  13. @Configuration
  14. @Component
  15. public class DataSourceConfig {
  16. /**
  17. * 主数据连接,默认优先级最高
  18. * @return
  19. */
  20. @Bean(name = "primaryDataSource")
  21. @Qualifier("primaryDataSource")
  22. @ConfigurationProperties(prefix="spring.datasource.primary")
  23. public DataSource PrimaryDataSource() {
  24. return DataSourceBuilder.create().build();
  25. }
  26. /**
  27. * 从数据源
  28. * @return
  29. */
  30. @Primary
  31. @Bean(name = "secondDataSource")
  32. @Qualifier("secondDataSource")
  33. @ConfigurationProperties(prefix="spring.datasource.second")
  34. public DataSource secondaryDataSource() {
  35. return DataSourceBuilder.create().build();
  36. }
  37. }

2.4 JPA配置主数据库

  1. package com.hikktn.config;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.beans.factory.annotation.Qualifier;
  4. import org.springframework.boot.autoconfigure.domain.EntityScan;
  5. import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties;
  6. import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;
  7. import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
  8. import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
  9. import org.springframework.context.annotation.Bean;
  10. import org.springframework.context.annotation.Configuration;
  11. import org.springframework.context.annotation.Primary;
  12. import org.springframework.core.env.Environment;
  13. import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
  14. import org.springframework.orm.jpa.JpaTransactionManager;
  15. import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
  16. import org.springframework.transaction.PlatformTransactionManager;
  17. import org.springframework.transaction.annotation.EnableTransactionManagement;
  18. import javax.persistence.EntityManager;
  19. import javax.sql.DataSource;
  20. import java.util.Map;
  21. @Configuration
  22. @EnableTransactionManagement
  23. @EntityScan(basePackages = "com.hikktn.domain.primary")
  24. @EnableJpaRepositories(
  25. entityManagerFactoryRef = "entityManagerFactoryPrimary",
  26. transactionManagerRef = "transactionManagerPrimary",
  27. basePackages = {"com.hikktn.dao.primary"})
  28. public class PrimaryConfig {
  29. @Autowired
  30. @Qualifier("primaryDataSource")
  31. private DataSource primaryDataSource;
  32. @Autowired
  33. private JpaProperties jpaProperties;
  34. @Autowired
  35. private HibernateProperties hibernateProperties;
  36. private Map<String, Object> getVendorProperties() {
  37. return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings());
  38. }
  39. @Primary
  40. @Bean(name = "entityManagerPrimary")
  41. public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
  42. return entityManagerFactoryPrimary(builder).getObject().createEntityManager();
  43. }
  44. @Primary
  45. @Bean(name = "entityManagerFactoryPrimary")
  46. public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(EntityManagerFactoryBuilder builder) {
  47. return builder
  48. .dataSource(primaryDataSource)
  49. .properties(getVendorProperties())
  50. .packages("com.hikktn.domain.primary")
  51. .persistenceUnit("primaryPersistenceUnit")
  52. .build();
  53. }
  54. @Primary
  55. @Bean(name = "transactionManagerPrimary")
  56. public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
  57. return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
  58. }
  59. }

2.5 JPA配置副数据库

  1. package com.hikktn.config;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.beans.factory.annotation.Qualifier;
  4. import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties;
  5. import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;
  6. import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. import org.springframework.core.env.Environment;
  10. import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
  11. import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
  12. import org.springframework.orm.jpa.JpaTransactionManager;
  13. import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
  14. import org.springframework.transaction.PlatformTransactionManager;
  15. import org.springframework.transaction.annotation.EnableTransactionManagement;
  16. import javax.annotation.Resource;
  17. import javax.persistence.EntityManager;
  18. import javax.sql.DataSource;
  19. import java.util.HashMap;
  20. import java.util.Map;
  21. @Configuration
  22. @EnableTransactionManagement
  23. @EnableJpaRepositories(
  24. //实体管理
  25. entityManagerFactoryRef="entityManagerFactorySecond",
  26. //事务管理
  27. transactionManagerRef="transactionManagerSecond",
  28. //实体扫描,设置Repository所在位置
  29. basePackages= { "com.hikktn.dao.second" })
  30. public class SecondConfig {
  31. @Autowired
  32. @Qualifier("secondDataSource")
  33. private DataSource secondDataSource;
  34. @Autowired
  35. private JpaProperties jpaProperties;
  36. @Autowired
  37. private HibernateProperties hibernateProperties;
  38. private Map<String, Object> getVendorProperties() {
  39. return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings());
  40. }
  41. @Bean(name = "entityManagerSecond")
  42. public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
  43. return entityManagerFactorySecond(builder).getObject().createEntityManager();
  44. }
  45. @Bean(name = "entityManagerFactorySecond")
  46. public LocalContainerEntityManagerFactoryBean entityManagerFactorySecond (EntityManagerFactoryBuilder builder) {
  47. return builder
  48. .dataSource(secondDataSource)
  49. .properties(getVendorProperties())
  50. .packages("com.hikktn.domain.second")
  51. .persistenceUnit("secondPersistenceUnit")
  52. .build();
  53. }
  54. @Bean(name = "transactionManagerSecond")
  55. PlatformTransactionManager transactionManagerSecond(EntityManagerFactoryBuilder builder) {
  56. return new JpaTransactionManager(entityManagerFactorySecond(builder).getObject());
  57. }
  58. }

2.6 主数据库Bean

  1. package com.hikktn.domain.primary;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import javax.persistence.*;
  6. import java.io.Serializable;
  7. @Data
  8. @Entity
  9. @NoArgsConstructor
  10. @AllArgsConstructor
  11. @Table(name = "t_user")
  12. public class UserPrimaryEntity implements Serializable {
  13. @Id
  14. @GeneratedValue(strategy = GenerationType.IDENTITY)
  15. Long id;
  16. /**
  17. * 名称
  18. */
  19. String name;
  20. /**
  21. * 性别
  22. */
  23. String sex;
  24. }

2.7 副数据库Bean

  1. package com.hikktn.domain.second;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. import javax.persistence.*;
  6. import java.io.Serializable;
  7. @Data
  8. @Entity
  9. @NoArgsConstructor
  10. @AllArgsConstructor
  11. @Table(name = "t_user")
  12. public class UserSecondEntity implements Serializable {
  13. @Id
  14. @GeneratedValue(strategy = GenerationType.IDENTITY)
  15. Long id;
  16. /**
  17. * 名称
  18. */
  19. String name;
  20. /**
  21. * 性别
  22. */
  23. String sex;
  24. }

2.8 DAO层

  1. package com.hikktn.dao.primary;
  2. import com.hikktn.domain.primary.UserPrimaryEntity;
  3. import org.springframework.data.jpa.repository.JpaRepository;
  4. import org.springframework.stereotype.Repository;
  5. @Repository
  6. public interface UserPrimaryRepository extends JpaRepository<UserPrimaryEntity, Long> {
  7. }
  1. package com.hikktn.dao.second;
  2. import com.hikktn.domain.second.UserSecondEntity;
  3. import org.springframework.data.jpa.repository.JpaRepository;
  4. import org.springframework.stereotype.Repository;
  5. @Repository
  6. public interface UserSecondRepository extends JpaRepository<UserSecondEntity, Long> {
  7. }

2.9 启动类

  1. package com.hikktn;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class Application {
  6. public static void main(String[] args) {
  7. SpringApplication.run(Application.class, args);
  8. }
  9. }

2.10 测试

  1. import com.hikktn.Application;
  2. import com.hikktn.dao.primary.UserPrimaryRepository;
  3. import com.hikktn.dao.second.UserSecondRepository;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.test.context.SpringBootTest;
  6. import org.junit.Test;
  7. import org.junit.runner.RunWith;
  8. import org.springframework.test.context.junit4.SpringRunner;
  9. @RunWith(SpringRunner.class)
  10. @SpringBootTest(classes = Application.class)
  11. public class SpringbootJapDatasourceApplicationTests {
  12. @Autowired
  13. private UserPrimaryRepository userPrimaryRepository;
  14. @Autowired
  15. private UserSecondRepository userSecondRepository;
  16. @Test
  17. public void contextLoads() {
  18. System.out.println(userPrimaryRepository.findAll());
  19. System.out.println(userSecondRepository.findAll());
  20. }
  21. }
  • 数据库里的数据

image.png

  • 结果
    1. Hibernate: select userprimar0_.id as id1_0_, userprimar0_.name as name2_0_, userprimar0_.sex as sex3_0_ from t_user userprimar0_
    2. [UserPrimaryEntity(id=1, name=zhansan, sex=男), UserPrimaryEntity(id=2, name=tom, sex=男)]
    3. 2021-08-31 00:48:12.156 INFO 22556 --- [ main] o.h.h.i.QueryTranslatorFactoryInitiator : HHH000397: Using ASTQueryTranslatorFactory
    4. Hibernate: select usersecond0_.id as id1_0_, usersecond0_.name as name2_0_, usersecond0_.sex as sex3_0_ from t_user usersecond0_
    5. [UserSecondEntity(id=1, name=kitty, sex=女)]