Spring Data JDBC | AI生成和翻译
Spring Data JDBC 是一个强大的库,它通过提供轻量级、基于注解的方式来操作关系型数据库,从而简化 Spring 应用程序中的数据库交互。与 Spring Data JPA 相比,它的约束更少,专注于更简单、更明确的对象到数据库表的映射方式。下面我将逐步介绍它的基本使用方法。
1. 项目设置
首先,你需要在项目中引入 Spring Data JDBC。如果使用 Maven,请在 pom.xml 中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
同时需要添加对应数据库的 JDBC 驱动(例如 H2、MySQL、PostgreSQL)。以 H2 为例:
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
如果使用 Gradle,对应配置为:
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
runtimeOnly 'com.h2database:h2'
2. 数据库配置
在 application.properties 或 application.yml 中配置数据库连接。对于 H2 内存数据库,配置示例如下:
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.h2.console.enabled=true
如果是 PostgreSQL 等实际数据库,需相应调整 URL、用户名和密码。
3. 定义领域模型
创建实体类来映射数据库表。Spring Data JDBC 默认遵循类名映射表名(转为小写),字段映射列名的约定。
import org.springframework.data.annotation.Id;
public class Person {
@Id
private Long id;
private String firstName;
private String lastName;
// 默认构造函数(Spring Data JDBC 要求)
public Person() {}
public Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
// Getter 和 Setter 方法
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getFirstName() { return firstName; }
public void setFirstName(String firstName) { this.firstName = firstName; }
public String getLastName() { return lastName; }
public void setLastName(String lastName) { this.lastName = lastName; }
}
@Id标注主键字段- Spring Data JDBC 要求提供无参构造函数
- 默认表名为
person,可通过注解覆盖
4. 创建仓储接口
定义继承 CrudRepository 的接口来处理基础 CRUD 操作:
import org.springframework.data.repository.CrudRepository;
public interface PersonRepository extends CrudRepository<Person, Long> {
}
无需实现该接口——Spring Data JDBC 会在运行时自动生成实现。
5. 使用仓储
将仓储注入服务层或控制器层即可使用:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class PersonService {
private final PersonRepository repository;
@Autowired
public PersonService(PersonRepository repository) {
this.repository = repository;
}
public void savePerson() {
Person person = new Person("John", "Doe");
repository.save(person);
System.out.println("已保存人员,ID:" + person.getId());
}
public void listPeople() {
Iterable<Person> people = repository.findAll();
people.forEach(p -> System.out.println(p.getFirstName() + " " + p.getLastName()));
}
}
6. 运行应用程序
如果使用 Spring Boot,创建包含 @SpringBootApplication 的主类并运行:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Spring Boot 将自动配置数据源和 Spring Data JDBC。
7. 可选:自定义查询
如需自定义查询,可在仓储接口中添加带 @Query 注解的方法:
import org.springframework.data.jdbc.repository.query.Query;
import org.springframework.data.repository.CrudRepository;
public interface PersonRepository extends CrudRepository<Person, Long> {
@Query("SELECT * FROM person WHERE first_name = :name")
List<Person> findByFirstName(String name);
}
关键要点说明
- 无延迟加载:与 JPA 不同,Spring Data JDBC 不支持延迟加载。关联关系(如一对多)需要通过聚合根显式建模
- 聚合根:每个实体都是聚合的一部分,只有根实体可以直接保存或检索
- 模式创建:Spring Data JDBC 不会自动创建表,需通过
src/main/resources目录下的schema.sql提供建表语句:
CREATE TABLE person (
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
first_name VARCHAR(255),
last_name VARCHAR(255)
);
典型工作流程
- 启动应用程序
- 使用
repository.save()保存Person对象 - 通过
repository.findById()或findAll()进行检索
以上是基础使用指南。如果您想深入了解关联关系、自定义映射等特定内容,请告知具体需求,我将为您提供针对性解答。目前进展如何?