Spring Data Jpa 配置多数据源

1.配置数据库连接信息

spring:
  datasource:
    db1:  # 1.0 Datasource
      url: jdbc:mysql://127.0.0.1:3306/test1?useSSL=false&serverTimezone=GMT%2b8&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&cachePrepStmts=true&useServerPrepStmts=true
      username: root
      password: 123456
      driverClassName: com.mysql.cj.jdbc.Driver
    db2:  # 2.0 Datasource
      url: jdbc:mysql://127.0.0.1:3306/test2?useSSL=false&serverTimezone=GMT%2b8&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&cachePrepStmts=true&useServerPrepStmts=true
      username: root
      password: 123456

2.编写数据源配置类

@ConfigurationProperties(prefix = "spring.datasource.db1")
@Component
@Data
public class Db1Properties {
    private String url;
    private String username;
    private String password;
    private String driverClassName;
}
@ConfigurationProperties(prefix = "spring.datasource.db2")
@Component
@Data
public class Db2Properties {
    private String url;
    private String username;
    private String password;
    private String driverClassName;
}

@Configuration
@Slf4j
public class DataSourceConfig {

    @Autowired
    private Db1Properties db1Properties;

    @Autowired
    private Db2Properties db2Properties;

    @Bean(name = "db1DataSource")
    @Qualifier("db1DataSource")
    @Primary
    public DataSource db1DataSource() {
        log.info("db1DataSource 初始化 .....");
        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setJdbcUrl(db1Properties.getUrl());
        dataSource.setUsername(db1Properties.getUsername());
        dataSource.setPassword(db1Properties.getPassword());
        dataSource.setDriverClassName(db1Properties.getDriverClassName());
        return dataSource;
    }

    @Bean(name = "db2DataSource")
    @Qualifier("db2DataSource")
    public DataSource db2DataSource() {
        log.info("db2DataSource 初始化 .....");
        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setJdbcUrl(db2Properties.getUrl());
        dataSource.setUsername(db2Properties.getUsername());
        dataSource.setPassword(db2Properties.getPassword());
        dataSource.setDriverClassName(db2Properties.getDriverClassName());
        return dataSource;
    }


}

3.编写数据库配置

以下两个是需要修改的配置信息

  • 设置@EnableJpaRepositories注解里的basePackages属性配置jpa持久化类的包路径
  • 设置db1EntityManagerFactory方法中的packages方法设置实体类所在的包路径
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "db1EntityManagerFactory",
        transactionManagerRef = "db1TransactionManager",
        basePackages = {"com.ljm.db1todb2.db1.repository"})    // 指定该数据源操作的DAO接口包
public class Db1Config {

    @Autowired
    @Qualifier("db1DataSource")
    private DataSource db1DataSource;


    @Primary
    @Bean(name = "db1EntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean db1EntityManagerFactory(EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(db1DataSource)
                .packages("com.ljm.db1todb2.db1.model")         //设置实体类所在位置
                .persistenceUnit("db1PersistenceUnit")
                .build();
    }

    @Bean(name = "db1TransactionManager")
    public PlatformTransactionManager db1TransactionManager(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(db1EntityManagerFactory(builder).getObject());
    }

}

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "db2EntityManagerFactory",
        transactionManagerRef = "db2TransactionManager",
        // 指定该数据源操作的DAO接口包
        basePackages = {"com.ljm.db1todb2.db2.repository"})
public class Db2Config {

    @Autowired
    @Qualifier("db2DataSource")
    private DataSource db2DataSource;

    @Bean(name = "db2EntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean db2EntityManagerFactory(EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(db2DataSource)
                //设置实体类所在位置
                .packages("com.ljm.db1todb2.db2.model")
                .persistenceUnit("db2PersistenceUnit")
                .build();
    }


    @Bean(name = "db2TransactionManager")
    public PlatformTransactionManager db2TransactionManager(EntityManagerFactoryBuilder builder) {
        return new JpaTransactionManager(db2EntityManagerFactory(builder).getObject());
    }
}

4.目录结构

在这里插入图片描述

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是一个简单的 Spring Data JPA 多数据源的实例: 1. 首先,需要在 pom.xml 文件中引入 Spring Data JPA 的依赖: ```xml <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>2.4.2</version> </dependency> ``` 2. 在 application.yml 文件中配置多个数据源: ```yml spring: datasource: primary: url: jdbc:mysql://localhost:3306/primary_db username: root password: root secondary: url: jdbc:mysql://localhost:3306/secondary_db username: root password: root ``` 3. 创建两个 DataSource Bean: ```java @Configuration public class DataSourceConfig { @Primary @Bean(name = "primaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.primary") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "secondaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.secondary") public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); } } ``` 4. 创建 JPA EntityManagerFactory Bean: ```java @Configuration @EnableJpaRepositories( basePackages = "com.example.primary.repository", entityManagerFactoryRef = "primaryEntityManagerFactory", transactionManagerRef = "primaryTransactionManager" ) public class PrimaryDataSourceConfig { @Autowired @Qualifier("primaryDataSource") private DataSource primaryDataSource; @Bean(name = "primaryEntityManagerFactory") public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(EntityManagerFactoryBuilder builder) { return builder .dataSource(primaryDataSource) .packages("com.example.primary.entity") .persistenceUnit("primary") .build(); } @Bean(name = "primaryTransactionManager") public PlatformTransactionManager primaryTransactionManager( @Qualifier("primaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) { return new JpaTransactionManager(entityManagerFactory); } } ``` 5. 创建第二个 JPA EntityManagerFactory Bean: ```java @Configuration @EnableJpaRepositories( basePackages = "com.example.secondary.repository", entityManagerFactoryRef = "secondaryEntityManagerFactory", transactionManagerRef = "secondaryTransactionManager" ) public class SecondaryDataSourceConfig { @Autowired @Qualifier("secondaryDataSource") private DataSource secondaryDataSource; @Bean(name = "secondaryEntityManagerFactory") public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory(EntityManagerFactoryBuilder builder) { return builder .dataSource(secondaryDataSource) .packages("com.example.secondary.entity") .persistenceUnit("secondary") .build(); } @Bean(name = "secondaryTransactionManager") public PlatformTransactionManager secondaryTransactionManager( @Qualifier("secondaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) { return new JpaTransactionManager(entityManagerFactory); } } ``` 6. 创建两个 Repository: ```java @Repository public interface PrimaryRepository extends JpaRepository<PrimaryEntity, Long> { } @Repository public interface SecondaryRepository extends JpaRepository<SecondaryEntity, Long> { } ``` 这样,就完成了 Spring Data JPA 多数据源配置。在使用时,只需要在 Repository 上指定对应的数据源即可。例如: ```java @Service public class MyService { @Autowired private PrimaryRepository primaryRepository; @Autowired private SecondaryRepository secondaryRepository; public void doSomething() { // 使用 primary 数据源 List<PrimaryEntity> primaryEntities = primaryRepository.findAll(); // 使用 secondary 数据源 List<SecondaryEntity> secondaryEntities = secondaryRepository.findAll(); } } ``` 以上就是一个简单的 Spring Data JPA 多数据源的实例,希望能够帮助到你。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皓亮君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值