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 数据库如下图所示

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

概率论与数理统计--期末

概率论占比更多&#xff0c;三分之二左右 数理统计会少一些 事件之间的概率 ab互斥&#xff0c;不是ab独立 古典概型吃高中基础&#xff0c;考的不会很多 条件概率公式&#xff0c;要记 公式不要全记&#xff0c;很多有名称的公式是通过基础公式转换而来的 目的在于解决一…

大数据高级ACP学习笔记(2)

钻取&#xff1a;变换维度的层次&#xff0c;改变粒度的大小 星型模型 雪花模型 MaxCompute DataHub

标准IO

student.c用链表完成 #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct student {char name[10];int chinese;int math;int English;int physics;int chemistry;int biology; }stu,*stuptr; typedef struct node {union{stu dat…

Ollama + FastGPT搭建本地私有企业级AI知识库 (Linux)

一、为何搭建本地企业级AI知识库&#xff1f; 首先我们分析下搭建本地企业级AI知识库的核心要点&#xff1a; 1.数据安全性&#xff1a;本地部署可以更好地保护企业敏感数据&#xff0c;避免数据泄露的风险。 2.定制化&#xff1a;根据企业特定需求进行定制&#xff0c;提供更…

基于SMT32U575RIT单片机-中断练习

练习要求&#xff1a; 1、通过扩展板按键key1&#xff0c;开/关元器件&#xff1b; 2、通过串口选择模式&#xff08;通过中断实现&#xff09;&#xff1a; LED&#xff1a; 切换只控制LED&#xff1b; FAN&#xff1a; 切换只控制FAN&#xff1b; BEE&#xff1a; 切换只控制…

人工智能的发展领域之GPU加速计算的应用概述、架构介绍与教学过程

文章目录 一、架构介绍GPU算力平台概述优势与特点 二、注册与登录账号注册流程GPU服务器类型配置选择指南内存和存储容量网络带宽CPU配置 三、创建实例实例创建步骤镜像选择与设置 四、连接实例SSH连接方法远程桌面配置 一、架构介绍 GPU算力平台概述 一个专注于GPU加速计算的…

w~自动驾驶~合集16

我自己的原文哦~ https://blog.51cto.com/whaosoft/12765612 #SIMPL 用于自动驾驶的简单高效的多智能体运动预测基准 原标题&#xff1a;SIMPL: A Simple and Efficient Multi-agent Motion Prediction Baseline for Autonomous Driving 论文链接&#xff1a;https://ar…

数据结构与算法之二叉树: LeetCode 107. 二叉树的层序遍历 II (Ts版)

二叉树的层序遍历 II https://leetcode.cn/problems/binary-tree-level-order-traversal-ii/description/ 描述 给你二叉树的根节点 root &#xff0c;返回其节点值 自底向上的层序遍历 。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&a…

NOVA:AutoRegressive Video Generation Without Vector Quantization——自回归视频生成无需向量量化

这篇文章介绍了一种名为NOVA的新型自回归模型&#xff0c;用于高效的文本到图像和文本到视频生成。以下是文章的主要内容总结&#xff1a; 1. 研究背景与问题 自回归大语言模型&#xff08;LLMs&#xff09;在自然语言处理&#xff08;NLP&#xff09;中表现出色&#xff0c;但…

外驱功率管电流型PWM控制芯片CRE6281B1

CRE6281B1 是一款外驱功率管的高度集成的电流型PWM 控制 IC&#xff0c;为高性能、低待机功率、低成本、高效率的隔离型反激式开关电源控制器。在满载时&#xff0c;CRE6281B1工作在固定频率(65kHz)模式。在负载较低时&#xff0c;CRE6281B1采用节能模式&#xff0c;实现较高的…

C4D2025 win版本安装完无法打开,提示请将你的maxon App更新至最新版本,如何解决

最近安装C4D2025 win版本时&#xff0c;明明按步骤安装完成&#xff0c;结果打开提示提示请将你的maxon App更新至最新版本&#xff1f;遇到这种情况该如何解决呢。 一开始我的思路以为是旧版本没有删除干净&#xff0c;所以将电脑里有关maxon的软件插件都卸载了&#xff0c;重…

open61499符合新型工业控制测试要求吗

工业互联网产业联盟发起了一项新型工业控制产品测试活动&#xff0c;从官网上摘录了部分测试要求&#xff08;联盟动态-工业互联网产业联盟&#xff09;如下&#xff1a; 新型工业控制是通过有线无线混合组网、软硬件分层解耦和模块化功能调用、多层级算力通用底座&#xff0c…

119.使用AI Agent解决问题:Jenkins build Pipeline时,提示npm ERR! errno FETCH_ERROR

目录 1.Jenkins Build时的错误 2.百度文心快码AI智能体帮我解决 提问1&#xff1a;jenkins中如何配置npm的源 提问2&#xff1a;jenkins pipeline 类型为pipeline script from SCM时&#xff0c;如何配置npm源 3.最终解决方法-Jenkinsfile的修改 4.感触 1.Jenkins Build时…

Python学习笔记:显示进度条

文章目录 1. 安装progress包2. 编写程序,实现功能3. 运行程序,查看结果4. 实战小结1. 安装progress包 在Anaconda Prompt里执行命令:pip install progress -i https://pypi.tuna.tsinghua.edu.cn/simple 2. 编写程序,实现功能 创建显示进度条.py程序 """ 功…

搭建企业AI助理的创新应用与案例分析

在大健康零售行业&#xff0c;企业面临着日益增长的市场需求和复杂的供应链管理挑战。AI助理的应用不仅能够提升客户服务效率&#xff0c;还能优化供应链管理&#xff0c;降低运营成本。 一、AI助理在大健康零售行业的创新应用 个性化健康咨询 AI助理可以通过分析客户的健康…

poi-tl+kkviewfile实现生成pdf业务报告

需求背景&#xff0c;需要把ai生成的一些业务数据&#xff0c;生成一份pdf报告 需求分析 简单来说&#xff0c;就是json生成pdf的方案。 直接生成pdf。适合一些pdf样式简单的场景&#xff0c;一般就是纯文本按序渲染&#xff0c;或者是纯表格。如果需要一些复杂的排布&#x…

重温设计模式--13、策略模式

策略模式介绍 文章目录 策略模式介绍C 代码示例 策略模式是一种行为设计模式&#xff0c;它允许在运行时选择算法的行为。该模式将算法的定义和使用分离开来&#xff0c;使得算法可以独立于使用它的客户端而变化&#xff0c;提高了代码的灵活性和可维护性。 其主要包含以下几个…

nginx http反向代理

系统&#xff1a;Ubuntu_24.0.4 1、安装nginx sudo apt-get update sudo apt-get install nginx sudo systemctl start nginx 2、配置nginx.conf文件 /etc/nginx/nginx.conf&#xff0c;但可以在 /etc/nginx/sites-available/ 目录下创建一个新的配置文件&#xff0c;并在…

Sam Altman发布博客,回顾OpenAI九年历程,直言目标已瞄准ASI超级人工智能

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

简单的jmeter数据请求学习

简单的jmeter数据请求学习 1.需求 我们的流程服务由原来的workflow-server调用wfms进行了优化&#xff0c;将wfms服务操作并入了workflow-server中&#xff0c;去除了原来的webservice服务调用形式&#xff0c;增加了并发处理&#xff0c;现在想测试模拟一下&#xff0c;在一…