Day 22:数据库与 Spring Data JPA

news/2025/1/7 22:22:33/

理论知识

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;}@GetMappingpublic 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());}@PostMappingpublic 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.ppmy.cn/news/1561078.html

相关文章

3.Web安全——div,css基础

一、什么是CSS&#xff1f; 在网页开发中&#xff0c;HTML&#xff08;超文本标记语言&#xff09;主要负责构建网页的结构&#xff0c;例如定义段落、标题、列表等元素。然而&#xff0c;HTML 本身在样式呈现方面的功能比较有限。CSS 的出现就是为了弥补这一不足&#xff0c;它…

网站常用功能模块-鉴权

一&#xff1a;JWT是什么&#xff1f; 常用鉴权方式有很多种&#xff0c;今天主要介绍基于token的鉴权方式JWT&#xff08;Json JSON Web Token&#xff09;。因为这种方式实现起来方便快捷。整体实现逻辑如下 第一次登陆时&#xff0c;前端携带账号和密码请求登录接口。服务…

修改secure-file-priv参数-mysql5.7.26限制不允许导入或导出的解决方法

文章目录 前言secure_file_priv参数说明修改secure_file_priv参数的步骤 前言 本人是在sql注入的文件上传拿web shel 时所用到的写入文件权限遇到文件上传不成功的问题&#xff0c;记住修改后&#xff0c;重启mysql才生效&#xff0c;最后可以查看验证一下。 secure_file_priv…

中高级运维工程师运维面试题(九)之 Apache Pulsar

目录 往期回顾前言基础知识1. 什么是 Apache Pulsar&#xff1f;2. Pulsar 的架构是怎样的&#xff1f;3. Pulsar 中的 Topic 是如何组织的&#xff1f;4. Pulsar 如何保证消息的可靠性&#xff1f; 高级知识5. Pulsar 的分区如何工作&#xff1f;6. Pulsar 的订阅模式有哪些&a…

[CTF/网络安全] 攻防世界 Training-WWW-Robots 解题详析

[网络安全] 攻防世界 Training-WWW-Robots 解题详析 在这个小训练挑战中&#xff0c;你将学习 Robots_exclusion_standard&#xff08;机器人排除标准&#xff09;。 robots.txt 文件是由网络爬虫用来检查是否允许他们爬行和索引你的网站或仅部分内容。有时这些文件揭示目录结构…

33.时间函数相关 C#例子

这个代码获得系统时间&#xff0c;通过计算差值得到程序运行的时间。 然后通过加入延时和循环&#xff0c;可以监视每次循环经历的时间。最后得到整个代码运行时间。 用到了系统时间&#xff0c;毫秒和秒 以及延时函数 两种类型&#xff0c;扫描时间和系统时间 using Syste…

ip属地的信息准确吗?ip归属地不准确怎么办

在数字化时代&#xff0c;IP属地信息成为了我们日常生活中不可或缺的一部分。在各大社交媒体平台上&#xff0c;IP属地信息都扮演着重要的角色。然而&#xff0c;随着技术的不断进步和网络的复杂性增加&#xff0c;IP属地信息的准确性问题也日益凸显。那么&#xff0c;IP属地信…

CSP初赛知识学习计划(第二天)

高级语言与低级语言、递归编程知识详解 一、高级语言与低级语言的深度剖析 &#xff08;一&#xff09;编译运行方式 低级语言 汇编语言&#xff1a;作为一种低级语言&#xff0c;它与机器硬件紧密相关。汇编程序的编译过程相对直接&#xff0c;汇编器将汇编代码转换为机器…