Spring Boot教程之五十一:Spring Boot – CrudRepository 示例
Spring Boot – CrudRepository 示例
Spring Boot 建立在 Spring 之上,包含 Spring 的所有功能。由于其快速的生产就绪环境,使开发人员能够直接专注于逻辑,而不必费力配置和设置,因此如今它正成为开发人员的最爱。Spring Boot 是一个基于微服务的框架,在其中创建生产就绪的应用程序只需很少的时间。以下是 Spring Boot 的一些功能:
- 它可以避免 Spring 中繁重的 XML 配置
- 它可以轻松维护和创建 REST 端点
- 它包括嵌入式 Tomcat 服务器
- 部署非常容易,war和jar文件可以轻松部署在tomcat服务器中
Crud存储
Spring Boot 的 CrudRepository 是 Spring Data JPA 框架的一部分,它提供了对关系数据库中的实体执行CRUD(创建、读取、更新、删除)操作的便捷方法。CrudRepository 是一个接口,它扩展了基本的 Repository 接口并向其添加了通用的 CRUD 方法。它在包org.springframework.data.repository中定义,它扩展了 Spring Data Repository接口。如果有人想在 Spring Boot 应用程序中使用 CrudRepository,他/她必须创建一个接口并扩展 CrudRepository 接口。
句法:
public interface CrudRepository<T, ID> extends Repository<T, ID>
这里:
- T:存储库管理的域类型(通常是实体/模型类名)
- ID:存储库管理的实体的 id 类型(通常是在实体/模型类中创建的 @Id 的包装类)
示例:
public interface DepartmentRepository extends CrudRepository<Department, Long> {}
现在让我们讨论一下 CrudRepository 内部可用的一些最重要的方法,如下所示:
方法 1:save():
保存给定的实体。使用返回的实例进行进一步的操作,因为保存操作可能已经完全改变了实体实例。
句法:
<S extends T> S save(S entity)
- 参数:实体 - 不能为空。
- 返回:已保存的实体;永远不会为空。
- 抛出:IllegalArgumentException – 如果给定的实体为空。
方法 2: findById():
通过 id 检索实体。
句法:
Optional<T> findById(ID id)
- 参数:id – 不能为空。
- 返回:具有给定 id 的实体,如果未找到则返回 Optional#empty()。
- 抛出异常:如果“id”为空,则会抛出IllegalArgumentException。
方法3:findAll():
返回该类型的所有实例。
句法:
Iterable<T> findAll()
返回类型:所有实体
方法 4: count():
返回可用实体的数量。
句法:
long count()
返回类型:实体的数量。
方法 5: deleteById():
删除具有给定 id 的实体。
句法:
void deleteById(ID id)
参数:Id(不能为空)
抛出异常:如果给定的 id 为空,则抛出 IllegalArgumentException 。
例子
以下 Spring Boot 应用程序使用 CrudRepository 管理 Department 实体。数据保存在 H2 数据库中。我们使用 RESTful 控制器。
步骤1:
参考这篇文章如何使用IntelliJ IDEA创建Spring Boot项目并创建一个Spring Boot项目。
第 2 步:添加以下依赖项
- Spring Web
- H2 Database
- Lombok
- Spring Data JPA
以下是pom.xml文件的完整代码。请检查是否有遗漏。
- XML
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.5</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.amiya</groupId> <artifactId>Spring-Boot-Demo-Project</artifactId> <version>1.0.0-SNAPSHOT</version> <name>Spring-Boot-Demo-Project</name> <description>Demo project for Spring Boot</description> <properties> <java.version>11</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>
</dependencies>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build>
</project> |
步骤 3:创建 4 个包,并在这些包中创建一些类和接口,如下图所示
- entity
- repository
- service
- controller
笔记:
- 绿色圆形图标“I”按钮是界面
- 蓝色圆形图标“C”按钮属于类
步骤 4:实体包内部
在 Department.java 文件中创建一个简单的POJO 类。以下是Department.java文件的代码
- Java
package com.amiya.springbootdemoproject.entity;
import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor;
import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id;
@Entity @Data @NoArgsConstructor @AllArgsConstructor @Builder public class Department {
@Id @GeneratedValue(strategy = GenerationType.AUTO) private Long departmentId; private String departmentName; private String departmentAddress; private String departmentCode; } |
步骤 5:存储库包内部
创建一个简单的接口,并将该接口命名为 DepartmentRepository。正如我们上面讨论的那样, 这个接口将扩展 CrudRepository 。
- Java
// Java Program to Illustrate DepartmentRepository.java File
// Importing package module to this code package com.amiya.springbootdemoproject.repository; // Importing required classes import com.amiya.springbootdemoproject.entity.Department; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository;
// Annotation @Repository
// Class public interface DepartmentRepository extends CrudRepository<Department, Long> { } |
步骤 6:服务包内
在包内创建一个名为DepartmentService 的接口和一个名为DepartmentServiceImpl的类。以下是DepartmentService.java文件的代码。
示例 1-A
- Java
package com.amiya.springbootdemoproject.service;
import com.amiya.springbootdemoproject.entity.Department;
import java.util.List;
public interface DepartmentService { // save operation Department saveDepartment(Department department);
// read operation List<Department> fetchDepartmentList();
// update operation Department updateDepartment(Department department, Long departmentId);
// delete operation void deleteDepartmentById(Long departmentId); } |
示例 1-B
- Java
// Below is the code for the DepartmentServiceImpl.java file. package com.amiya.springbootdemoproject.service;
import com.amiya.springbootdemoproject.entity.Department; import com.amiya.springbootdemoproject.repository.DepartmentRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;
import java.util.List; import java.util.Objects;
@Service public class DepartmentServiceImpl implements DepartmentService{
@Autowired private DepartmentRepository departmentRepository;
// save operation @Override public Department saveDepartment(Department department) { return departmentRepository.save(department); }
// read operation @Override public List<Department> fetchDepartmentList() { return (List<Department>) departmentRepository.findAll(); }
// update operation @Override public Department updateDepartment(Department department, Long departmentId) { Department depDB = departmentRepository.findById(departmentId).get();
if (Objects.nonNull(department.getDepartmentName()) && !"".equalsIgnoreCase(department.getDepartmentName())) { depDB.setDepartmentName(department.getDepartmentName()); }
if (Objects.nonNull(department.getDepartmentAddress()) && !"".equalsIgnoreCase(department.getDepartmentAddress())) { depDB.setDepartmentAddress(department.getDepartmentAddress()); }
if (Objects.nonNull(department.getDepartmentCode()) && !"".equalsIgnoreCase(department.getDepartmentCode())) { depDB.setDepartmentCode(department.getDepartmentCode()); }
return departmentRepository.save(depDB); }
// delete operation @Override public void deleteDepartmentById(Long departmentId) { departmentRepository.deleteById(departmentId); }
} |
步骤 7:控制器包装内部
在包内创建一个名为DepartmentController 的类。
- Java
// Java Program to Illustrate DepartmentController File
// Importing package module package com.amiya.springbootdemoproject.controller; // Importing required classes import com.amiya.springbootdemoproject.entity.Department; import com.amiya.springbootdemoproject.service.DepartmentService; import java.util.List; import javax.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*;
// Annotation @RestController
// Class public class DepartmentController {
// Annotation @Autowired private DepartmentService departmentService;
// Save operation @PostMapping("/departments") public Department saveDepartment( @Valid @RequestBody Department department) {
return departmentService.saveDepartment(department); }
// Read operation @GetMapping("/departments") public List<Department> fetchDepartmentList() {
return departmentService.fetchDepartmentList(); }
// Update operation @PutMapping("/departments/{id}") public Department updateDepartment(@RequestBody Department department, @PathVariable("id") Long departmentId) {
return departmentService.updateDepartment( department, departmentId); }
// Delete operation @DeleteMapping("/departments/{id}") public String deleteDepartmentById(@PathVariable("id") Long departmentId) {
departmentService.deleteDepartmentById( departmentId); return "Deleted Successfully"; } } |
步骤 8:下面是 application.properties 文件的代码
server.port = 8082# H2 Database spring.h2.console.enabled=true spring.datasource.url=jdbc:h2:mem:dcbapp spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password=password spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
在 Postman 中测试端点
端点 1: POST – http://localhost:8082/departments/
端点 2: GET – http://localhost:8082/departments/
端点 3: PUT – http://localhost:8082/departments/1
端点 4:删除 – http://localhost:8082/departments/1
H2 数据库如下图所示
相关文章:

Spring Boot教程之五十一:Spring Boot – CrudRepository 示例
Spring Boot – CrudRepository 示例 Spring Boot 建立在 Spring 之上,包含 Spring 的所有功能。由于其快速的生产就绪环境,使开发人员能够直接专注于逻辑,而不必费力配置和设置,因此如今它正成为开发人员的最爱。Spring Boot 是…...

jenkins入门6 --拉取代码
Jenkins代码拉取 需要的插件,缺少的安装下 新建一个item,选择freestyle project 源码管理配置如下:需要添加git库地址,和登录git的用户密码 配置好后执行编译,成功后拉取的代码在工作空间里...
CAPL概述与环境搭建
CAPL概述与环境搭建 目录 CAPL概述与环境搭建1. CAPL简介与应用领域1.1 CAPL简介1.2 CAPL的应用领域 2. CANoe/CANalyzer 安装与配置2.1 CANoe/CANalyzer 简介2.2 安装CANoe/CANalyzer2.2.1 系统要求2.2.2 安装步骤 2.3 配置CANoe/CANalyzer2.3.1 配置CAN通道2.3.2 配置CAPL节点…...

Virgo:增强慢思考推理能力的多模态大语言模型
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

偃动访无穿戴动作捕捉系统:赋能多行业开启动作捕捉新篇章
在当今科技飞速发展的时代,动作捕捉技术正以前所未有的态势深入到社会发展的各个领域,成为众多行业不可或缺的重要助力。从早期的惯性动捕与光捕技术,到如今更为先进的无标记动捕技术,动作捕捉领域不断迎来革新与突破。 无标记动…...
mikro-orm 和typeorm 对比
以下是Mikro-ORM和TypeORM的详细对比: 设计理念与架构 Mikro-ORM:基于数据映射器、工作单元和身份映射模式。这种设计使得它在管理内存中实体状态方面表现优异,能够自动处理事务,当调用em.flush()时,所有计算出的更改…...

Docker入门之docker基本命令
Docker入门之docker基本命令 官方网站:https://www.docker.com/ 1. 拉取官方镜像并创建容器(以redis为例) 拉取官方镜像 docker pull redis# 如果不需要添加到自定义网络使用这个命令,如需要,直接看第二步 docker r…...
mysql的一些函数及其用法
mysql 1-来自于leetcode1517的题目 表: Users------------------------ | Column Name | Type | ------------------------ | user_id | int | | name | varchar | | mail | varchar | ------------------------已知一个表,它的…...

NO.3 《机器学习期末复习篇》以题(问答题)促习(人学习),满满干huo,大胆学大胆补!
目录 🔍 1. 对于非齐次线性模型 ,试将其表示为齐次线性模型形式。 编辑 🔍 2. 某汽车公司一年内各月份的广告投入与月销量数据如表3-28所示,试根据表中数据构造线性回归模型,并使用该模型预测月广告投入为20万元时…...

黑马跟学.苍穹外卖.Day03
黑马跟学.苍穹外卖.Day03 苍穹外卖-day03课程内容1. 公共字段自动填充1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3 步骤三 1.4 功能测试1.5 代码提交 2. 新增菜品2.1 需求分析与设计2.1.1 产品原型2.1.2 接口设计2.1.3 表设计 2.2 代码开发2.2.1 文件上…...
js -音频变音(听不出说话的人是谁)
学习参考来源: https://zhuanlan.zhihu.com/p/634848804 https://developer.mozilla.org/zh-CN/docs/Web/API/Web_Audio_API 实际效果: http://www.qingkong.zone/laboratory?typeaudio-confusion 前言 本文内容可结合上面学习参考来源,结合…...

鸿蒙UI(ArkUI-方舟UI框架)
参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/arkts-layout-development-overview-V13 ArkUI简介 ArkUI(方舟UI框架)为应用的UI开发提供了完整的基础设施,包括简洁的UI语法、丰富的UI功能ÿ…...
常见的http状态码 + ResponseEntity
常见的http状态码 ResponseStatus(HttpStatus.CREATED) 是 Spring Framework 中的注解,用于指定 HTTP 响应状态码。 1. 基本说明 HttpStatus.CREATED 对应 HTTP 状态码 201表示请求成功且创建了新的资源通常用于 POST 请求的处理方法上 2. 使用场景和示例 基本…...

pikachu - Cross-Site Scripting(XSS)
pikachu - Cross-Site Scripting(XSS) 声明! 笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人无关,切勿触碰法律底线,否则后果自负&#x…...
操作系统之文件系统的基本概念
目录 用户和磁盘视角的文件 文件控制块(FCB)和索引结点(inode) 文件的操作 创建文件(create系统调用) 写文件(write系统调用) 读文件(read系统调用) 重…...

深入探讨 Android 中的 AlarmManager:定时任务调度及优化实践
引言 在 Android 开发中,AlarmManager 是一个非常重要的系统服务,用于设置定时任务或者周期性任务。无论是设置一个闹钟,还是定时进行数据同步,AlarmManager 都是不可或缺的工具之一。然而,随着 Android 系统的不断演…...

西电-算法分析-研究生课程复习笔记
24年秋的应该是张老师最后一次用卷面考试,他说以后这节课的期末考试都是在OJ上刷题了张老师上课还挺有意思的,上完之后能学会独立地思考算法设计问题了。整节课都在强调规模压缩这个概念,考试也是考个人对这些的理解,还挺好玩的哈…...

编译时找不到需要的库,如何在PyCharm中为你的项目添加需要的库
丰富的库支持是 Python 语言的一大特点,但是在使用 PyCharm 进行Python 代码编译的时候,遇到一些需要使用到的库提示不能解析时,该如何添加呢? 比如下图所示的代码,可以看到需要使用 selenium、b4、jieba 这些库&…...

ip addr 命令给Linux网络接口配置多个IP地址值
问一下Chatgpt 怎么使用ip addr 命令给Linux网络接口配置多个IP地址值 根据Chatgpt的提示执行了命令,命令执行成功,看下执行结果。 ifconfig 命令查看接口IP地址 ip addr show 命令查看接口IP地址...
C#语言的数据库编程
C#语言的数据库编程 在现代软件开发中,数据库是不可或缺的一部分。无论是企业级应用还是个人项目,数据的存储与管理都是程序的核心功能之一。C#作为一种强类型、面向对象的编程语言,广泛应用于Windows平台的开发,尤其是在构建与数…...

完美搭建appium自动化环境
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 桌面版appium提供可视化操作appium主要功能的使用方式,对于初学者非常适用。 如何在windows平台安装appium桌面版呢,大体分两个步骤&…...

Reactor和Proactor
reactor的重要组件包括:Event事件、Reactor反应堆、Demultiplex事件分发器、Eventhandler事件处理器。...

学习设计模式《十二》——命令模式
一、基础概念 命令模式的本质是【封装请求】命令模式的关键是把请求封装成为命令对象,然后就可以对这个命令对象进行一系列的处理(如:参数化配置、可撤销操作、宏命令、队列请求、日志请求等)。 命令模式的定义:将一个…...

技巧小结:外部总线访问FPGA寄存器
概述 需求:stm32的fsmc总线挂载fpga,stm32需要访问fpga内部寄存器 1、分散加载文件将变量存放到指定地址即FPGA寄存器地址 sct文件指定变量存储地址,从而可以直接访问外设,(28335也可以,不过用的是cmd文件…...
VBA清空数据
列数转字母 Function CNtoW(ByVal num As Long) As String CNtoW Replace(Cells(1, num).Address(False, False), "1", "") End Function 字母转列数 Function CWtoN(ByVal AB As String) As Long CWtoN Range("a1:" & AB & &…...

Python爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
【机试题解法笔记】寻找最大价值的矿堆
题目 给你一个由 0(空地)、1(银矿)、2(金矿) 组成的的地图,矿堆只能由上下左右相邻的金矿或银矿连接形成。超出地图范围可以认为是空地。 假设银矿价值 1,金矿价值 2,请你找出地图中最大价值的矿堆并输出该矿堆的价值。 输入描述 地图元素信…...

vue2 , el-select 多选树结构,可重名
人家antd都支持,elementplus 也支持,vue2的没有,很烦。 网上其实可以搜到各种的,不过大部分不支持重名,在删除的时候可能会删错,比如树结构1F的1楼啊,2F的1楼啊这种同时勾选的情况。。 可以全…...
C++11实现TCP网络通讯服务端处理逻辑简化版
以下是使用C11实现的TCP服务端处理逻辑,包含循环读取数据、帧头检测(AABBCC)及4376字节数据包处理: cpp #include <iostream>#include <vector>#include <cstring>#include <unistd.h>#include <arp…...
【Pytorch学习笔记】模型模块08——AlexNet模型详解
AlexNet模型详解:结构、算法与PyTorch实现 一、AlexNet模型结构 AlexNet是2012年ImageNet竞赛冠军模型,由Alex Krizhevsky等人提出,标志着深度学习在计算机视觉领域的突破。 网络结构(5卷积层 3全连接层)ÿ…...