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

Spring Boot 3.3 【四】Spring Boot 整合JPA

🌟 技术人聊管理 请关注 【技术管理修行】

一、JPA 简介

Spring Data JPA 是 Spring Data 项目的一部分,它为使用 Java Persistence API (JPA) 进行数据库访问提供了一种非常简便的方式。Spring Data JPA 的主要目的是简化基于 JPA 的数据访问层的开发工作,开发者可以更加专注于业务逻辑而不是繁琐的数据访问代码。

二、JPA 的主要作用和特点:

1. 自动化的 CRUD 操作:

  • 当定义了一个继承自 JpaRepository 的接口时,Spring Data JPA 会自动为该接口生成实现类,提供基本的 CRUD 操作(如 save, findById, findAll, deleteById 等)。
  • 这些方法的实现完全由 Spring Data JPA 自动生成,开发者无需编写任何代码。

2. 灵活的查询方法:

  • Spring Data JPA 支持通过方法名来定义查询,这意味着开发者可以通过简单的方法命名规则来定义复杂的查询逻辑,而不需要编写 JPQL 或 Criteria 查询。
  • 例如,方法 findByName(String name) 会自动映射到一个名为 name 的属性,并执行相应的查询。

3. 分页和排序支持:

  • Spring Data JPA 提供了内置的分页和排序支持,可以通过传递 PageableSort 对象来实现。
  • 这使开发者可以很容易地实现分页查询和排序功能。

4. 事务管理:

  • Spring Data JPA 自动处理事务管理,无需显式声明事务边界。
  • 通过注解 @Transactional 或者配置方式,可以很容易地控制事务的行为。

三、示例代码

1. 准备环境

  • Java 17 或更高版本
  • Maven 3.8 或更高版本
  • Spring Boot 3.3
  • MySQL 8.0 或更高版本

2. 添加依赖

<dependencies>  <dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-thymeleaf</artifactId>  <version>3.3.1</version></dependency>  <dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-web</artifactId>  <version>3.3.1</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId><version>3.3.1</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope><version>8.0.33</version></dependency>
</dependencies>
  • spring-boot-starter-thymeleaf 用于集成 Thymeleaf 模板引擎;
  • spring-boot-starter-web 提供 Spring MVCTomcat 等web开发所需依赖;
  • spring-boot-starter-data-jpa 用于集成 JPA 进行数据持久化;
  • mysql-connector-javaMySQL 数据库的 JDBC 驱动,用于连接 MySQL 数据库。

3. 配置数据库连接和JPA

编辑 application.yml 文件,添加以下内容:

server:port:8080
spring:datasource:url: jdbc:mysql://localhost:3306/spring_boot_jpa?useSSL=false&serverTimezone=UTCusername: rootpassword: rootjpa:hibernate: ddl-auto: updateshow-sql: true

4. 创建实体类

package com.jsglxx.demo.entity;import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;@Entity
public class Book {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String title;private String author;// 构造函数、getter 和 setter 省略}
  • @Entity:这个注解标记在类上,表示该类是一个JPA实体类,它会映射到数据库中的一个表。JPA会管理这个类的实例,并将它们持久化到数据库中。
  • @Id:这个注解标记在类的属性上,表示该属性是实体的主键。在这个例子中,id 属性被标记为主键,意味着在数据库中对应的表也会有一个名为 id 的列作为主键。
  • @GeneratedValue:这个注解用于指定主键的生成策略。在这个例子中,strategy = GenerationType.IDENTITY 表示主键的值将由数据库自动生成(通常是自增的)。这意味着当你插入一个新的实体到数据库时,数据库会自动为这个实体的 id 属性分配一个唯一的值。

5. 创建 Repository 接口

创建一个 BookRepository 接口继承自 JpaRepository

package com.jsglxx.demo.repository;import org.springframework.data.jpa.repository.JpaRepository;
import com.jsglxx.entity.Book;public interface BookRepository extends JpaRepository<Book, Long>{}

6. 创建 Service 层

创建一个 BookService 类:

package com.jsglxx.demo.service;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import com.jsglxx.entity.Book;
import com.jsglxx.repository.BookRepository;@Service
public class BookService {private final BookRepository bookRepository;@Autowiredpublic BookService(BookRepository bookRepository) {this.bookRepository = bookRepository;}//查询所有图书public List<Book> findAll() {return bookRepository.findAll();}//查询单个图书public Book findById(Long id) {return bookRepository.findById(id).orElse(null);}//保存单个图书public Book save(Book book) {return bookRepository.save(book);}//删除单个图书public void deleteById(Long id) {bookRepository.deleteById(id);}
}

7. 创建 REST 控制器

创建一个 BookController 类:

package com.jsglxx.demo.controller;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import com.jsglxx.entity.Book;
import com.jsglxx.service.BookService;@RestController
@RequestMapping("/api/books")
public class BookController {private final BookService bookService;@Autowiredpublic BookController(BookService bookService) {this.bookService = bookService;}@GetMappingpublic List<Book> getAllBooks() {return bookService.findAll();}@PostMappingpublic Book createBook(@RequestBody Book book) {return bookService.save(book);}@GetMapping("/{id}")public Book getBookById(@PathVariable Long id) {return bookService.findById(id);}@DeleteMapping("/{id}")public void deleteBook(@PathVariable Long id) {bookService.deleteById(id);}
}

四、运行测试

运行主类 DemoApplication.java,启动应用并测试 API。

1. Book实体类对应的表和列自动生成

在这里插入图片描述

2. 打开postman测试接口

1)创建图书:

在这里插入图片描述

2)查询所有图书

在这里插入图片描述

3)查询单个图书

在这里插入图片描述

五、总结

Spring Data JPA 通过提供一套高度抽象的接口和约定,极大地简化了基于 JPA 的数据访问层的开发工作。它不仅减少了样板代码的数量,还提高了开发效率,使得开发者可以更加专注于业务逻辑的实现。通过上述示例,我们可以看到如何使用 Spring Data JPA 来快速构建数据访问层,并与 Spring Boot 应用程序进行集成。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C++ 对C的扩展
  • 西瓜书学习笔记三 归纳偏好
  • python(6) : 读取pdf的文本, 读取pdf每一页为文件
  • 详细介绍pytorch重要的API
  • 靠谱是性价比最高的社交名片:一个靠谱的人往往有这4种品质!
  • 算法的学习笔记—二叉树的镜像(牛客JZ27)
  • Spring 中ConfigurableBeanFactory
  • Redis的热key以及Big(大)key是什么?如何解决Redis的热key以及Big(大)key问题?
  • arcgis打开不同tif格式编码的栅格数据
  • 【卡码网Python基础课 21.图形的面积】
  • 高速信号的眼图、加重、均衡
  • Spire.PDF for .NET【文档操作】演示:检测 PDF 文件是否为 Portfolio
  • Airtest 的使用
  • 对比state和props的区别?
  • C语言——操作符详解
  • 【翻译】babel对TC39装饰器草案的实现
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Angular 响应式表单之下拉框
  • Angular4 模板式表单用法以及验证
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Logstash 参考指南(目录)
  • Odoo domain写法及运用
  • React-redux的原理以及使用
  • Vue2 SSR 的优化之旅
  • 给Prometheus造假数据的方法
  • 模型微调
  • 前端攻城师
  • 前端临床手札——文件上传
  • 区块链将重新定义世界
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 世界上最简单的无等待算法(getAndIncrement)
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • kubernetes资源对象--ingress
  • Mac 上flink的安装与启动
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​低代码平台的核心价值与优势
  • ​第20课 在Android Native开发中加入新的C++类
  • #QT(一种朴素的计算器实现方法)
  • (¥1011)-(一千零一拾一元整)输出
  • (Forward) Music Player: From UI Proposal to Code
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (十一)图像的罗伯特梯度锐化
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .bat批处理(一):@echo off
  • .net framework profiles /.net framework 配置
  • .Net7 环境安装配置