Spring Boot 3.3 【四】Spring Boot 整合JPA

news2024/11/24 9:12:50

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

一、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=UTC
    username: root
    password: root
  jpa:
    hibernate: 
      ddl-auto: update
    show-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;

    @Autowired
    public 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;

    @Autowired
    public BookController(BookService bookService) {
        this.bookService = bookService;
    }

    @GetMapping
    public List<Book> getAllBooks() {
        return bookService.findAll();
    }

    @PostMapping
    public 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 应用程序进行集成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2043817.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetCode - - - 栈和队列

目录 1.有效的括号&#xff08; LeetCode 20 &#xff09; 2.最小栈&#xff08; LeetCode 155 &#xff09; 3.接雨水&#xff08; LeetCode 42 &#xff09; 4.逆波兰表达式求值&#xff08;LeetCode 150&#xff09; 5.柱状图中最大的矩形&#xff08;LeetCode 84&…

SAP LE学习笔记02 - WM和库存管理(IM)之间的关系,保管Lot(Quant)

上一章学习了LE的基础知识。 1&#xff0c;LE的概述&#xff0c;LE里面包含下面3个大的模块 - LE-WM 仓库管理 / - LE-SHP 发货/ - LE-TRA 运输 2&#xff0c;仓库的结构 - 仓库番号 / -保管域Type(存储区域)/ - 保管区画(存储区)/ - 棚番&#xff08;Storage Bin 仓位&…

IDEA快捷键(Ctrl + tab)非常好用 切换最近使用的编辑器选项卡

文章目录 1、为什么要使用 ctrl tab 快捷键&#xff1f;2、使用 ctrl tab 快捷键 1、为什么要使用 ctrl tab 快捷键&#xff1f; 当我们点击 ctrl alt 鼠标左键点击 进入方法的实现时&#xff0c;这个时候我们会在这个实现类中不断的点击&#xff0c;查看源码&#xff0c…

【安全工具推荐-Search_Viewer资产测绘】

目录 一、工具介绍 二、工具配置 三、传送门 一、工具介绍 Search_Viewer&#xff0c;集Fofa、Hunter鹰图、Shodan、360 quake、Zoomeye 钟馗之眼、censys 为一体的空间测绘gui图形界面化工具&#xff0c;支持一键采集爬取和导出fofa、shodan等数据&#xff0c;方便快捷查看…

竞争与冒险/亚稳态/跨时钟域

竞争与冒险/亚稳态/跨时钟域 文章目录 竞争与冒险/亚稳态/跨时钟域1.亚稳态1.1 好文章1.2 什么是亚稳态1.3亚稳态的解决办法1.3.1 跨时钟域的亚稳态——采用同步机制1.3.1.1 单比特(脉冲和单比特流)的跨时钟域同步1.3.1.1.1 单比特流的跨时钟域同步1.3.1.1.2 脉冲的跨时钟域同步…

.NET辅助角色服务入门简介

在日常开发中&#xff0c;并不是所有的功能都是用户可见的&#xff0c;还在一些背后默默支持的程序&#xff0c;这些程序通常以服务的形式出现&#xff0c;统称为辅助角色服务。今天以一个简单的小例子&#xff0c;简述基于.NET开发辅助角色服务的相关内容&#xff0c;仅供学习…

旅行商问题变体:欧几里德平面中线段最小连接算法

问题描述 假设在欧几里德平面上有有限多条线段&#xff0c;如何将它们连接起来&#xff0c;形成一条最小长度的线段链&#xff1f; 首先&#xff0c;自然可以穷举所有情况&#xff0c;找到最优解。还可以采用动态规划、贪心算法找到局部最优解。 另外&#xff0c;则将其作为T…

定时器延时us(hal库)

目录 定时器延时us 配置cubemx ​编辑​编辑新建模块 代码实现 测试代码 定时器延时us 复制工程模板 配置cubemx 新建模块 新建文件HardWare 添加文件HardWare 添加文件路径 添加HardWare 或者直接输入/HardWare 添加.c和.h文件 .h文件 添加防重复定义代码 #ifnd…

麒麟v10(ky10.x86_64)升级——openssl-3.2.2、openssh-9.8p1

系统版本: ky10.x86_64 下载安装包并上传 openssh下载地址 https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable openssl下载地址 https://openssl-library.org/source/index.html zlib下载地址 https://zlib.net/fossils/ 上传安装包 备份配置文件 cp -r /etc/ssh /et…

DePT: Decoupled Prompt Tuning

当前的问题:Base-New Tradeoff(BNT)困境 现有的提示调优方法通常无法摆脱Base-New Tradeoff(BNT)困境&#xff0c;即调优/调整的模型对基本任务的泛化效果越好&#xff0c;对新任务的泛化效果就越差(包含不可见的类)&#xff0c;反之新任务的泛化效果越好&#xff0c;所需要的…

北京城市图书馆-非遗文献馆:OLED透明拼接屏的璀璨应用

在数字化与传统文化深度融合的今天&#xff0c;北京城市图书馆的非遗文献馆以一场前所未有的视觉盛宴&#xff0c;向世人展示了OLED透明拼接屏的非凡魅力与无限可能。这座集阅读、展示、体验于一体的非遗文献馆&#xff0c;通过2*7布局的OLED透明拼接屏&#xff0c;不仅为传统非…

2024.8.15(python管理mysql、Mycat实现读写分离)

一、python管理mysql 1、搭建主mysql [rootmysql57 ~]# tar -xf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz [rootmysql57 ~]# cp -r mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysql [rootmysql57 ~]# rm -rf /etc/my.cnf [rootmysql57 ~]# mkdir /usr/local/mysql…

高数3.4 函数单调性和曲线的凹凸性

目录 1. 定义 2. 判断方法 3. 证明 4. 例子 1. 定义 2. 判断方法 3. 证明 4. 例子

高频焊机系统介绍及工作原理

一、高频焊机生产的工艺流程 将带钢卷成圆筒形&#xff0c;然后将接缝焊接起来这就形成了焊管。近些年来&#xff0c;随着焊接技术的进步以及社会工业化进程的加快&#xff0c;钢管的焊管技术也得到了较快的发展。其中直缝高频焊机应用广泛&#xff0c;其原理是利用高频电流的邻…

基于Java+SpringBoot+Vue的网上点餐系统

基于JavaSpringBootVue的网上点餐系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 哈喽…

大模型学习方法之——大模型技术学习路线

“ 技术学习无非涵盖三个方面&#xff0c;理论&#xff0c;实践和应用**”** 大模型技术爆火至今已经有两年的时间了&#xff0c;而且大模型技术的发展潜力也不言而喻。因此&#xff0c;很多人打算学习大模型&#xff0c;但又不知道该怎么入手&#xff0c;因此今天就来了解一下…

【探索Linux】P.48(高级IO —— I/O多路转接之 poll )

阅读导航 引言一、poll简介二、poll函数接口⭕参数说明 三、pollfd结构体⭕events和revents的取值 四、返回值五、工作原理六、优缺点✅优点✅缺点 七、 使用示例&#x1f6a8;注意事项 总结温馨提示 引言 在上一篇探讨了I/O多路转接之select方法的基础上&#xff0c;本文将深…

第131天:内网安全-横向移动Kerberos 攻击SPN扫描WinRMWinRSRDP

案例一&#xff1a;域横向移动-RDP-明文&NTLM RDP利用的三种方式 1.直接在当前被控主机上进行远程连接 2.建立节点进行连接 3.端口转发&#xff0c;&#xff08;访问当前主机的2222端口等于访问目标的3389&#xff09; 第一种方式(动静太大) 直接利用被控主机进行远程连接…

uniapp left right 的左右模态框

标题 这是组件 <template><div class"content-wrapper"><divv-for"(vla, i) in products":key"i":class"[content-page, getPageClass(i)]"><slot :data"vla"><!-- 用户自定义的内容 --><…

VUE2学习日记 路由

安装路由 路由安装命令&#xff1a; npm install --save vue-router3 创建router文件夹 在src下创建router文件夹 创建index.js 文件 在router文件夹下创建index.js 文件夹 .vue文件的创建 在components文件夹下创建.vue文件 实现 在router文件夹下的index.js中 导入Vu…