Day 22:数据库与 Spring Data JPA
理论知识
1. 什么是 JPA?
Java Persistence API (JPA) 是 Java EE 的规范,用于对象关系映射(ORM)。JPA 将数据库中的表映射为 Java 对象,简化了数据库操作。
- 优点:
- 提高开发效率,减少手动 SQL 编写。
- 提供一致的 API 操作不同数据库。
- 支持事务和缓存等高级功能。
2. Spring Data JPA 的核心接口
Spring Data JPA 是基于 JPA 的框架,进一步简化了数据库操作。
- JpaRepository:扩展了 CrudRepository,提供更多功能。
- 常用方法:
save(T entity)
:保存或更新实体。findById(ID id)
:根据主键查询。findAll()
:查询所有记录。deleteById(ID id)
:根据主键删除。
- 常用方法:
3. 常用注解
- @Entity:将类标记为 JPA 实体。
- @Table:定义数据库表名(可选)。
- @Id:指定主键。
- @GeneratedValue:主键生成策略。
- @Column:定义字段的列名和属性。
4. 查询方法的定义
- 命名查询:Spring Data JPA 自动解析方法名生成 SQL。
- 示例:
findByName(String name)
自动生成SELECT * FROM table WHERE name = ?
- 示例:
- 自定义查询:使用 @Query 注解。
- 示例:
@Query("SELECT u FROM User u WHERE u.email = :email")
- 示例:
实践操作:Spring Data JPA 的简单应用
1. 项目结构
src/main/java/com/example/jpaexample/
├── entity/User.java
├── repository/UserRepository.java
├── service/UserService.java
├── controller/UserController.java
2. 配置数据源
使用 H2 数据库(内存数据库,适合测试)。
在 application.properties
中添加:
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=update
spring.h2.console.enabled=true
3. 定义实体类
package com.example.jpaexample.entity;
import jakarta.persistence.*;
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(unique = true, nullable = false)
private String email;
// Getters and Setters
}
4. 定义 Repository
package com.example.jpaexample.repository;
import com.example.jpaexample.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.Optional;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email);
}
5. 编写 Service 层
package com.example.jpaexample.service;
import com.example.jpaexample.entity.User;
import com.example.jpaexample.repository.UserRepository;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;
@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public List<User> getAllUsers() {
return userRepository.findAll();
}
public Optional<User> getUserById(Long id) {
return userRepository.findById(id);
}
public User createUser(User user) {
return userRepository.save(user);
}
public boolean deleteUser(Long id) {
if (userRepository.existsById(id)) {
userRepository.deleteById(id);
return true;
}
return false;
}
}
6. 编写 Controller 层
package com.example.jpaexample.controller;
import com.example.jpaexample.entity.User;
import com.example.jpaexample.service.UserService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping
public ResponseEntity<List<User>> getAllUsers() {
return ResponseEntity.ok(userService.getAllUsers());
}
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
return userService.getUserById(id)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}
@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
return ResponseEntity.status(201).body(userService.createUser(user));
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
if (userService.deleteUser(id)) {
return ResponseEntity.noContent().build();
}
return ResponseEntity.notFound().build();
}
}
测试请求示例
请求:GET /users
请求:POST /users
请求:DELETE /users/1
总结
Spring Data JPA 是一种高效的数据库操作方式,通过定义实体类和 Repository 接口,开发者可以快速实现增删改查功能。结合 Spring Boot,开发者能够专注于业务逻辑而无需关注底层 SQL 实现,大大提高了开发效率。