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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

web-app uniapp监测屏幕大小的变化对数组一行展示数据作相应处理

web-app uniapp监测屏幕大小的变化对数组一行展示数据作相应处理 1.uni.getSystemInfoSync().screenWidth; 获取屏幕宽度 2.uni.onWindowResize&#xff08;&#xff09; 实时监测屏幕宽度变化 3.根据宽度的大小拿到每行要展示的数量itemsPerRow 4.为了确保样式能够根据 items…

使用强化学习训练神经网络玩俄罗斯方块

一、说明 在 2024 年暑假假期期间&#xff0c;Tim学习并应用了Q-Learning &#xff08;一种强化学习形式&#xff09;来训练神经网络玩简化版的俄罗斯方块游戏。在本文中&#xff0c;我将详细介绍我是如何做到这一点的。我希望这对任何有兴趣将强化学习应用于新领域的人有所帮助…

计算机网络 (32)用户数据报协议UDP

前言 用户数据报协议&#xff08;UDP&#xff0c;User Datagram Protocol&#xff09;是计算机网络中的一种重要传输层协议&#xff0c;它提供了无连接的、不可靠的、面向报文的通信服务。 一、基本概念 UDP协议位于传输层&#xff0c;介于应用层和网络层之间。它不像TCP那样提…

如何将 DotNetFramework 项目打包成 NuGet 包并发布

如何将 DotNetFramework 项目打包成 NuGet 包并发布 在软件开发过程中&#xff0c;将项目打包成 NuGet 包并发布到 NuGet 库&#xff0c;可以让其他开发者方便地引用和使用你的项目成果。以下是将 WixWPFWizardBA 项目打包成 NuGet 包并发布的详细步骤&#xff1a; 1. 创建 .n…

解决GitHub上的README.md文件的图片内容不能正常显示问题

一、问题描述 我们将项目推送到GitHub上后&#xff0c;原本在本地编写配置好可展现的相对路径图片内容&#xff0c;到了GitHub上却不能够正常显示图片内容&#xff0c;我们希望能够在GitHub上正常显示图片&#xff0c;如下图所示&#xff1a; 二、问题分析 现状&#xff1a;REA…

如何解决 VS Code 调试时无法查看 std 中变量的问题

在使用 VS Code 调试 C 程序时&#xff0c;我们经常遇到查看 std 容器或字符串变量时只显示一串数字而看不到实际值的情况。这是由于调试器未启用 pretty-printing 功能导致的。为了解决这个问题&#xff0c;可以在 launch.json 中进行配置。 问题描述 在调试 C 程序时&…

安装MySQL的五种方法(Linux系统和Windows系统)

一.在Linux系统中安装MySQL 第一种方法:在线YUM仓库 首先打开MySQL官网首页 www.mysql.com 找到【DOWNLOADS】选项&#xff0c;点击 下拉&#xff0c;找到 【MySQL Community(GPL) Downloads】 在社区版下载页面中&#xff0c;【 MySQL Yum Repository 】链接为在线仓库安装…

基于mybatis-plus历史背景下的多租户平台改造

前言 别误会&#xff0c;本篇【并不是】 要用mybatis-plus自身的多租户方案&#xff1a;在表中加一个tenant_id字段来区分不同的租户数据。并不是的&#xff01; 而是在假设业务系统已经使用mybatis-plus多数据源的前提下&#xff0c;如何实现业务数据库隔开的多租户系统。 这…

RabbitMQ高级篇之MQ可靠性 数据持久化

文章目录 消息丢失的原因分析内存存储的缺陷如何确保 RabbitMQ 的消息可靠性&#xff1f;数据持久化的三个方面持久化对性能的影响持久化实验验证性能对比Spring AMQP 默认持久化总结 消息丢失的原因分析 RabbitMQ 默认使用内存存储消息&#xff0c;但这种方式带来了两个主要问…

Openssl1.1.1s rpm包构建与升级

rpmbuild入门知识 openssh/ssl二进制升级 文章目录 前言一、资源准备1.下载openssh、openssl二进制包2.安装rpmbuild工具3.拷贝源码包到SOURCES目录下4.系统开启telnet&#xff0c;防止意外导致shh无法连接5.编译工具安装6.补充说明 二、制作 OpenSSL RPM 包1.编写 SPEC 文件2.…

【Unity3D】apk加密(global-metadata.dat加密)

涉及&#xff1a;apk、aab、global-metadata.dat、jks密钥文件、APKTool、zipalign 使用7z打开apk文件观察发现有如下3个针对加密的文件。 xxx.apk\assets\bin\Data\Managed\Metadata\global-metadata.dat xxx.apk\lib\armeabi-v7a\libil2cpp.so xxx.apk\lib\arm64-v8a\libil…

[免费]微信小程序(高校就业)招聘系统(Springboot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序(高校就业)招聘系统(Springboot后端Vue管理端)&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序(高校就业)招聘系统(Springboot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项目介绍…

RNN心脏病预测-Pytorch版本

本文为为&#x1f517;365天深度学习训练营内部文章 原作者&#xff1a;K同学啊 一 导入数据 import numpy as np import pandas as pd import torch from torch import nn import torch.nn.functional as F import seaborn as sns from sklearn.preprocessing import Standard…

科普CMOS传感器的工作原理及特点

在当今数字化成像的时代&#xff0c;图像传感器无疑是幕后的关键 “功臣”&#xff0c;它宛如一位神奇的 “光影魔法师”&#xff0c;通过光电效应这一奇妙的物理现象&#xff0c;将光子巧妙地转换成电荷&#xff0c;为图像的诞生奠定基础。而在众多类型的图像传感器中&#xf…

Ubuntu 18.04 解决screen无法滚屏的问题

Ubuntu 18.04 解决screen无法滚屏的问题_ubuntu screen 无法上滑-CSDN博客文章浏览阅读2.7k次&#xff0c;点赞2次&#xff0c;收藏3次。在etc/screenrc中加入termcapinfo xterm* ti:te重新进入screen的sessionscreen -d -r XXX_ubuntu screen 无法上滑https://blog.csdn.net/w…

2025年01月09日Github流行趋势

1. 项目名称&#xff1a;khoj 项目地址url&#xff1a;https://github.com/khoj-ai/khoj项目语言&#xff1a;Python历史star数&#xff1a;22750今日star数&#xff1a;1272项目维护者&#xff1a;debanjum, sabaimran, MythicalCow, aam-at, eltociear项目简介&#xff1a;你…

Spring boot接入xxl-job

Spring boot接入xxl-job 导入maven包加入配置增加配置类创建执行器类&#xff08;写job的业务逻辑&#xff09;去控制台中配置job 导入maven包 <dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>…

Cglib动态代理中method.invoke与methodProxy.invokeSuper区别浅尝

前段时间看了黑马Spring教程中&#xff0c;有期视频讲解Cglib动态代理。 代码如下图&#xff1a; 可以看到调用目标对象的方法代码为&#xff1a; method.invoke(target,objects);在其他地方看到的此处代码是&#xff1a; methodProxy.invokeSuper(o,objects);注意&#xff…

【Linux 之一 】Linux常用命令汇总

Linux常用命令 ./catcd 命令chmodclearcphistoryhtoplnmkdirmvpwdrmtailunamewcwhoami 我从2021年4月份开始才开始真正意义上接触Linux&#xff0c;最初学习时是一脸蒙圈&#xff0c;啥也不会&#xff0c;啥也不懂&#xff0c;做了很多乱七八糟&#xff0c;没有条理的笔记。不知…

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

目录 &#x1f50d; 1. 对于非齐次线性模型 &#xff0c;试将其表示为齐次线性模型形式。 ​编辑 &#x1f50d; 2. 某汽车公司一年内各月份的广告投入与月销量数据如表3-28所示&#xff0c;试根据表中数据构造线性回归模型&#xff0c;并使用该模型预测月广告投入为20万元时…