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

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 之上&#xff0c;包含 Spring 的所有功能。由于其快速的生产就绪环境&#xff0c;使开发人员能够直接专注于逻辑&#xff0c;而不必费力配置和设置&#xff0c;因此如今它正成为开发人员的最爱。Spring Boot 是…...

jenkins入门6 --拉取代码

Jenkins代码拉取 需要的插件&#xff0c;缺少的安装下 新建一个item,选择freestyle project 源码管理配置如下&#xff1a;需要添加git库地址&#xff0c;和登录git的用户密码 配置好后执行编译&#xff0c;成功后拉取的代码在工作空间里...

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热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

偃动访无穿戴动作捕捉系统:赋能多行业开启动作捕捉新篇章

在当今科技飞速发展的时代&#xff0c;动作捕捉技术正以前所未有的态势深入到社会发展的各个领域&#xff0c;成为众多行业不可或缺的重要助力。从早期的惯性动捕与光捕技术&#xff0c;到如今更为先进的无标记动捕技术&#xff0c;动作捕捉领域不断迎来革新与突破。 无标记动…...

mikro-orm 和typeorm 对比

以下是Mikro-ORM和TypeORM的详细对比&#xff1a; 设计理念与架构 Mikro-ORM&#xff1a;基于数据映射器、工作单元和身份映射模式。这种设计使得它在管理内存中实体状态方面表现优异&#xff0c;能够自动处理事务&#xff0c;当调用em.flush()时&#xff0c;所有计算出的更改…...

Docker入门之docker基本命令

Docker入门之docker基本命令 官方网站&#xff1a;https://www.docker.com/ 1. 拉取官方镜像并创建容器&#xff08;以redis为例&#xff09; 拉取官方镜像 docker pull redis# 如果不需要添加到自定义网络使用这个命令&#xff0c;如需要&#xff0c;直接看第二步 docker r…...

mysql的一些函数及其用法

mysql 1-来自于leetcode1517的题目 表: Users------------------------ | Column Name | Type | ------------------------ | user_id | int | | name | varchar | | mail | varchar | ------------------------已知一个表&#xff0c;它的…...

NO.3 《机器学习期末复习篇》以题(问答题)促习(人学习),满满干huo,大胆学大胆补!

目录 &#x1f50d; 1. 对于非齐次线性模型 &#xff0c;试将其表示为齐次线性模型形式。 ​编辑 &#x1f50d; 2. 某汽车公司一年内各月份的广告投入与月销量数据如表3-28所示&#xff0c;试根据表中数据构造线性回归模型&#xff0c;并使用该模型预测月广告投入为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 -音频变音(听不出说话的人是谁)

学习参考来源&#xff1a; https://zhuanlan.zhihu.com/p/634848804 https://developer.mozilla.org/zh-CN/docs/Web/API/Web_Audio_API 实际效果&#xff1a; http://www.qingkong.zone/laboratory?typeaudio-confusion 前言 本文内容可结合上面学习参考来源&#xff0c;结合…...

鸿蒙UI(ArkUI-方舟UI框架)

参考&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/arkts-layout-development-overview-V13 ArkUI简介 ArkUI&#xff08;方舟UI框架&#xff09;为应用的UI开发提供了完整的基础设施&#xff0c;包括简洁的UI语法、丰富的UI功能&#xff…...

常见的http状态码 + ResponseEntity

常见的http状态码 ResponseStatus(HttpStatus.CREATED) 是 Spring Framework 中的注解&#xff0c;用于指定 HTTP 响应状态码。 1. 基本说明 HttpStatus.CREATED 对应 HTTP 状态码 201表示请求成功且创建了新的资源通常用于 POST 请求的处理方法上 2. 使用场景和示例 基本…...

pikachu - Cross-Site Scripting(XSS)

pikachu - Cross-Site Scripting&#xff08;XSS&#xff09; 声明&#xff01; 笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人无关&#xff0c;切勿触碰法律底线&#xff0c;否则后果自负&#x…...

操作系统之文件系统的基本概念

目录 用户和磁盘视角的文件 文件控制块&#xff08;FCB&#xff09;和索引结点&#xff08;inode&#xff09; 文件的操作 创建文件&#xff08;create系统调用&#xff09; 写文件&#xff08;write系统调用&#xff09; 读文件&#xff08;read系统调用&#xff09; 重…...

深入探讨 Android 中的 AlarmManager:定时任务调度及优化实践

引言 在 Android 开发中&#xff0c;AlarmManager 是一个非常重要的系统服务&#xff0c;用于设置定时任务或者周期性任务。无论是设置一个闹钟&#xff0c;还是定时进行数据同步&#xff0c;AlarmManager 都是不可或缺的工具之一。然而&#xff0c;随着 Android 系统的不断演…...

西电-算法分析-研究生课程复习笔记

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

编译时找不到需要的库,如何在PyCharm中为你的项目添加需要的库

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

ip addr 命令给Linux网络接口配置多个IP地址值

问一下Chatgpt 怎么使用ip addr 命令给Linux网络接口配置多个IP地址值 根据Chatgpt的提示执行了命令&#xff0c;命令执行成功&#xff0c;看下执行结果。 ifconfig 命令查看接口IP地址 ip addr show 命令查看接口IP地址...

C#语言的数据库编程

C#语言的数据库编程 在现代软件开发中&#xff0c;数据库是不可或缺的一部分。无论是企业级应用还是个人项目&#xff0c;数据的存储与管理都是程序的核心功能之一。C#作为一种强类型、面向对象的编程语言&#xff0c;广泛应用于Windows平台的开发&#xff0c;尤其是在构建与数…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...