Java SpringBoot 连接多个数据源

简介

在开发过程中,我们经常会遇到需要连接多个数据源的情况。比如,我们的应用程序可能需要连接不同的数据库,或者使用不同的数据源进行读写操作。在 Java SpringBoot 中,我们可以利用 Spring Data JPA 和 Spring Boot 的多数据源支持来实现这个需求。

本文将介绍如何使用 Java SpringBoot 连接多个数据源,并提供一些示例代码帮助读者理解和实践。

准备工作

在开始之前,我们需要准备以下环境:

  • Java JDK 1.8 或以上
  • Maven 3.2 或以上
  • SpringBoot 2.4.1 或以上
  • IDE(如 IntelliJ IDEA 或 Eclipse)

添加依赖

首先,在你的 SpringBoot 项目中,我们需要添加以下依赖:

<dependencies>
    <!-- Spring Data JPA -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    
    <!-- H2 Database -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
    
    <!-- MySQL Connector -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>

上述依赖中,我们引入了 Spring Data JPA、H2 数据库和 MySQL 连接器的依赖。

配置数据源

接下来,我们需要在 application.propertiesapplication.yml 文件中配置数据源信息。假设我们需要连接两个数据源,一个是 H2 数据库,另一个是 MySQL 数据库。我们可以按照以下方式进行配置:

# H2 数据源配置
spring.datasource.h2.url=jdbc:h2:mem:testdb
spring.datasource.h2.username=sa
spring.datasource.h2.password=

# MySQL 数据源配置
spring.datasource.mysql.url=jdbc:mysql://localhost:3306/mydatabase
spring.datasource.mysql.username=root
spring.datasource.mysql.password=123456
spring.datasource.mysql.driver-class-name=com.mysql.jdbc.Driver

在上述配置中,我们使用 spring.datasource 前缀来为每个数据源分别配置属性。

创建实体类和仓库

接下来,我们将创建两个实体类和两个仓库接口,分别对应 H2 数据库和 MySQL 数据库。

首先,我们创建一个名为 User 的实体类,用于表示用户信息。代码如下所示:

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    // 省略 getter 和 setter 方法
}

然后,我们创建一个名为 UserRepository 的接口,用于对用户信息进行 CRUD 操作。代码如下所示:

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}

类似地,我们再创建一个名为 Product 的实体类和一个名为 ProductRepository 的接口,用于对产品信息进行操作。

@Entity
@Table(name = "products")
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    // 省略 getter 和 setter 方法
}

@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
}

配置数据源和事务

接下来,我们需要配置多个数据源和事务管理器。

首先,我们创建一个名为 H2DataSourceConfig 的配置类,用于配置 H2 数据源和事务管理器。代码如下所示:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        basePackages = "com.example.demo.h2.repository",
        entityManagerFactoryRef = "h2EntityManagerFactory",
        transactionManagerRef = "h2TransactionManager"
)
public class H2DataSourceConfig {
    @Primary
    @Bean(name = "h2DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.h2")
    public DataSource h2DataSource() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "h2EntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean h2EntityManagerFactory(
            EntityManagerFactoryBuilder builder, @Qualifier("h2DataSource") DataSource dataSource) {
        return builder
                .dataSource(dataSource)
                .packages("com.example.demo.h2.entity")
                .build();
    }

    @Primary