在 Java 中配置多个数据库连接
在 Java 开发中,连接多个数据库的场景并不少见,特别是在微服务架构中,每个服务可能会使用不同的数据库。为了实现这一功能,通常我们会使用 Spring Boot 框架,这样可以通过配置文件(如 YML)来简化我们的代码。本文将详细讲述如何在 Spring Boot 项目中连接两个数据库,并给出具体的步骤、代码和结构图。
流程概述
下面是实现 Java 连接两个数据库的详细步骤:
步骤 | 说明 |
---|---|
1 | 创建 Spring Boot 项目 |
2 | 添加依赖 |
3 | 配置 application.yml 文件 |
4 | 创建数据源配置类 |
5 | 创建实体类 |
6 | 创建 Repository 接口 |
7 | 测试数据库连接 |
步骤详细说明
步骤 1: 创建 Spring Boot 项目
可以使用 Spring Initializr ( 创建一个新的 Spring Boot 项目。选择以下选项:
- 项目:Maven Project
- 语言:Java
- Spring Boot:2.x.x
- 依赖:Spring Web, Spring Data JPA, MySQL Driver
步骤 2: 添加依赖
在 pom.xml
文件中添加两个数据库所需的依赖(以 MySQL 为例):
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 其他依赖 -->
</dependencies>
步骤 3: 配置 application.yml 文件
在 src/main/resources
目录下创建 application.yml
配置文件,定义两个数据源的配置。
spring:
datasource:
first-db:
url: jdbc:mysql://localhost:3306/first_database
username: root
password: your_password
driver-class-name: com.mysql.cj.jdbc.Driver
second-db:
url: jdbc:mysql://localhost:3306/second_database
username: root
password: your_password
driver-class-name: com.mysql.cj.jdbc.Driver
步骤 4: 创建数据源配置类
接下来,我们需要创建两个配置类来管理数据库的连接。这些类会指定每个数据源的名称。
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
@Configuration
@EnableJpaRepositories(
basePackages = "com.example.repository.first", // 第一数据库的 Repository
entityManagerFactoryRef = "firstEntityManagerFactory",
transactionManagerRef = "firstTransactionManager"
)
public class FirstDatabaseConfig {
@Bean(name = "firstDataSource")
public DataSource firstDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "firstEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean firstEntityManagerFactory(
EntityManagerFactoryBuilder builder) {
return builder
.dataSource(firstDataSource())
.packages("com.example.model.first") // 第一数据库的实体类
.persistenceUnit("first")
.build();
}
@Bean(name = "firstTransactionManager")
public PlatformTransactionManager firstTransactionManager(
@Qualifier("firstEntityManagerFactory") EntityManagerFactory firstEntityManagerFactory) {
return new JpaTransactionManager(firstEntityManagerFactory);
}
}
同样,我们需要为第二个数据库创建一个类似的配置类:
@Configuration
@EnableJpaRepositories(
basePackages = "com.example.repository.second", // 第二数据库的 Repository
entityManagerFactoryRef = "secondEntityManagerFactory",
transactionManagerRef = "secondTransactionManager"
)
public class SecondDatabaseConfig {
@Bean(name = "secondDataSource")
public DataSource secondDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean secondEntityManagerFactory(
EntityManagerFactoryBuilder builder) {
return builder
.dataSource(secondDataSource())
.packages("com.example.model.second") // 第二数据库的实体类
.persistenceUnit("second")
.build();
}
@Bean(name = "secondTransactionManager")
public PlatformTransactionManager secondTransactionManager(
@Qualifier("secondEntityManagerFactory") EntityManagerFactory secondEntityManagerFactory) {
return new JpaTransactionManager(secondEntityManagerFactory);
}
}
步骤 5: 创建实体类
分别在两个不同的包中创建数据模型类(实体类)。
第一数据库实体类:
package com.example.model.first;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// getters and setters
}
第二数据库实体类:
package com.example.model.second;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String orderDetails;
// getters and setters
}
步骤 6: 创建 Repository 接口
为每个实体类创建 Repository 接口。
第一数据库 Repository:
package com.example.repository.first;
import com.example.model.first.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
}
第二数据库 Repository:
package com.example.repository.second;
import com.example.model.second.Order;
import org.springframework.data.jpa.repository.JpaRepository;
public interface OrderRepository extends JpaRepository<Order, Long> {
}
步骤 7: 测试数据库连接
可以创建一个简单的控制器,来测试两个数据库的连接。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@Autowired
private UserRepository userRepository;
@Autowired
private OrderRepository orderRepository;
@GetMapping("/test")
public String testDatabases() {
userRepository.save(new User("Alice"));
orderRepository.save(new Order("Order 1"));
return "Data saved in both databases!";
}
}
类图
以下是类图示例,描述项目的结构。
classDiagram
class User {
+ Long id
+ String name
+ getId()
+ getName()
+ setId(Long id)
+ setName(String name)
}
class Order {
+ Long id
+ String orderDetails
+ getId()
+ getOrderDetails()
+ setId(Long id)
+ setOrderDetails(String orderDetails)
}
class UserRepository {
+ List<User> findAll()
+ User save(User user)
}
class OrderRepository {
+ List<Order> findAll()
+ Order save(Order order)
}
User --> UserRepository
Order --> OrderRepository
流程图
以下是一个简单的流程图,展示连接两个数据库的步骤。
journey
title 连接两个数据库的流程
section 创建项目
通过 Spring Initializr 创建项目: 5: Project
section 添加依赖
在 pom.xml 中添加 MySQL 依赖: 3: Developer
section 配置 YML
在 application.yml 中配置两个数据库: 4: Developer
section 创建配置类
创建 FirstDatabaseConfig 和 SecondDatabaseConfig 类: 5: Developer
section 创建实体类
创建 User 和 Order 实体类: 5: Developer
section 创建 Repository
创建 UserRepository 和 OrderRepository 接口: 5: Developer
section 测试连接
通过控制器测试数据库连接: 4: Developer
结尾
通过以上步骤,我们实现了一个简单的 Java 应用程序,连接了两个不同的数据库。这种结构可以帮助我们在更复杂的应用中切换和扩展功能。希望这篇文章能帮助刚入行的小白们快速实现自己的需求,如果有任何问题,欢迎随时询问!