当前位置: 首页 > article >正文

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 实现,大大提高了开发效率。


http://www.kler.cn/a/469046.html

相关文章:

  • 旷视科技C++面试题及参考答案
  • SpringMVC的消息转换器
  • 深入理解 JavaScript 立即执行函数表达式(IIFE)
  • 【强化学习】演员评论家Actor-Critic算法(万字长文、附代码)
  • AngularJS HTML DOM
  • 华为 Sensor 省电策略调研
  • Unity3D仿星露谷物语开发17之空库存栏UI
  • vue3如何实现防抖?
  • atrust异常导致ERR_NETWORK_CHANGED
  • 2025-01-04 Unity插件 YodaSheet2 —— 基础用法
  • vscode中设置默认格式化工具pretter
  • 【图像处理】数据集合集!
  • 【软考网工笔记】计算机基础理论与安全——网络安全
  • 借助提示词工程,解锁高效应用开发之道
  • 计算机网络--UDP和TCP课后习题
  • 限时特惠,香港服务器,低至53元/年
  • 数据结构漫游记:初识栈(stack)
  • 探秘 AI Agent 之 Coze 智能体:从简介到搭建全攻略(4/30)
  • 超大规模分类(二):InfoNCE
  • ffmpeg之yuv格式转h264
  • 人工智能-Python网络编程-TCP
  • 数据库基础:SQL 与 NoSQL 的区别与应用场景
  • BERT的中文问答系统61
  • 桌面开发 的设计模式(Design Patterns)核心知识
  • Qt实现使用TCP与RS485串口设备通信————附带详细实践方法
  • KCP技术原理