SpringBoot 配置多數據源(Spring JPA版)

第一步:創建SpringBoot項目

最終項目目錄結構

在這裏插入圖片描述

Maven依賴

<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>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

application.yml

server:
  port: 80
  servlet:
    context-path: /mds
spring:
  datasource:
    test1:
      driverClassName: com.mysql.cj.jdbc.Driver
      # url必須使用jdbc-url的名稱
      jdbc-url: jdbc:mysql://localhost:3306/db_test?useSSL=false&serverTimezone=UTC&user=root&password=&useUnicode=true&characterEncoding=UTF8&autoReconnect=true&failOverReadOnly=false&allowPublicKeyRetrieval=true
      password: root
      username: root
    test2:
      driverClassName: com.mysql.cj.jdbc.Driver
      jdbc-url: jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC&user=root&password=&useUnicode=true&characterEncoding=UTF8&autoReconnect=true&failOverReadOnly=false&allowPublicKeyRetrieval=true
      password: root
      username: root
  jpa:
    hibernate:
      ddl-auto: update #如果再次運行,檢查表是否要更新
    properties:
      hibernate:
        enable_lazy_load_no_trans: true
    show-sql: true
    database: mysql
    open-in-view: false
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    generate-ddl: false

第二步:創建實體類

@Data
@Entity
@Table(name = "tb_dept")
public class Dept {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer deptno;
    @Column
    private String dname;
    @Column
    private String loc;
}

第三步:創建Dao

在com.hc.test1.dao包下創建DeptDao1.java

public interface DeptDao1 extends JpaRepository<Dept,Integer> {
}

在com.hc.test1.dao包下創建DeptDao2.java

public interface DeptDao2 extends JpaRepository<Dept,Integer> {
}

第四步:配置數據源

DataSourceConfig

@Configuration
public class DataSourceConfig {
    @Primary  //表示當某一個類存在多個實例時,優先使用哪個實例
    @Bean(name = "test1DataSource")
    @ConfigurationProperties(prefix="spring.datasource.test1")
    public DataSource test1DataSource() {
        return DataSourceBuilder.create().build();
    }
    @Bean(name = "test2DataSource")
    @ConfigurationProperties(prefix="spring.datasource.test2")
    public DataSource test2DataSource() {
        return DataSourceBuilder.create().build();
    }
}

Test1DataSourceConfig

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "test1EntityManagerFactory",//實體管理
        transactionManagerRef = "test1TransactionManager", //事務管理
        basePackages = "com.hc.test1.dao") //設置Repository所在位置
public class Test1DataSourceConfig {
    //數據源
    @Resource(name = "test1DataSource")
    private DataSource dataSource;
    // JPA其它參數設置,其數據在application.properties中配置
    @Resource
    private JpaProperties jpaProperties;
    //實體管理工廠builder
    @Resource
    private EntityManagerFactoryBuilder builder;
    //配置實體管理工廠的Bean
    @Primary
    @Bean(name = "test1EntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean test1EntityManagerFactoryBean() {
        return builder.dataSource(dataSource)
                //加入jpa的其他配置參數比如(ddl-auto: update等)
                .properties(jpaProperties.getProperties())
                //相當於給這個配置取一個別名
                .persistenceUnit("test1PersistenceUnit")
                //設置這個數據源對應的實體類所在位置
                .packages("com.hc.bean")
                .build();
    }
    // EntityManager不過解釋,用過jpa的應該都瞭解
    @Primary
    @Bean(name = "test1EntityManager")
    public EntityManager entityManager() {
        return test1EntityManagerFactoryBean().getObject().createEntityManager();
    }
    @Bean(name = "test1TransactionManager")
    public PlatformTransactionManager test1TransactionManager(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(test1EntityManagerFactoryBean().getObject());
    }
}

Test2DataSourceConfig

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "test2EntityManagerFactory",//實體管理
        transactionManagerRef = "test2TransactionManager", //事務管理
        basePackages = "com.hc.test2.dao") //設置Repository所在位置
public class Test2DataSourceConfig {
    //數據源
    @Resource(name = "test2DataSource")
    private DataSource dataSource;
    // JPA其它參數設置, 其數據在application.properties中配置
    @Resource
    private JpaProperties jpaProperties;
    //實體管理工廠builder
    @Resource
    private EntityManagerFactoryBuilder builder;
    //配置實體管理工廠的Bean
    @Bean(name = "test2EntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean test2EntityManagerFactoryBean() {
        return builder.dataSource(dataSource)
                //加入jpa的其他配置參數比如(ddl-auto: update等)
                .properties(jpaProperties.getProperties())
                //相當於給這個配置取一個別名
                .persistenceUnit("test2PersistenceUnit")
                //設置這個數據源對應的實體類所在位置
                .packages("com.hc.bean")
                .build();
    }
    // EntityManager不過解釋,用過jpa的應該都瞭解
    @Bean(name = "test2EntityManager")
    public EntityManager entityManager() {
        return test2EntityManagerFactoryBean().getObject().createEntityManager();
    }
    @Bean(name = "test2TransactionManager")
    public PlatformTransactionManager test2TransactionManager(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(test2EntityManagerFactoryBean().getObject());
    }
}

第五步:測試代碼

DeptDaoTest

@SpringBootTest
class DeptDao1Test {
    @Resource
    private DeptDao1 deptDao1;
    @Test
    public void fun(){
        List<Dept> depts = deptDao1.findAll();
        depts.forEach(System.out::println);
    }
}

DeptDao2Test

@SpringBootTest
class DeptDao2Test {
    @Resource
    private DeptDao2 deptDao2;
    @Test
    public void findAll(){
        deptDao2.findAll().forEach(System.out::println);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章