SpringBoot入门实现简单增删改查

本例子的依赖

在这里插入图片描述

要实现的内容

在这里插入图片描述
通过getpostputdelete接口,对数据库中的trade.categories表进行增删改查操作。

目录结构

com.test/
│
├── controller/
│   ├── CateController.java
│
├── pojo/
│   ├── dto/
│   │   └── CategoryDto.java
│   ├── Category.java
│	└── ResponseMessage.java
│
├── repository/
│  	└── CateRepository.java
│
└── service/├── CateRepository.java└── ICateRepository.java

各目录文件之间的关系(仅限于本文章)

在这里插入图片描述

添加配置

/* application.properties */
spring.datasource.url=jdbc:mysql://localhost:3306/trade
spring.datasource.username=root
#spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.hibernate.ddl-auto=update

spring.jpa.show-sql=true
当设置为 true 时,Hibernate 会在控制台中打印所有执行的 SQL 语句,方便调试和查看 SQL 查询。

spring.jpa.properties.hibernate.format_sql=true
当设置为 true 时,Hibernate 会将 SQL 语句格式化成更具可读性的形式便于阅读。

spring.jpa.hibernate.ddl-auto=update

作用
update如不存在表则创建新表,已有表会尝试修改
create启动时先删除表,再重新创建表
create-drop应用停止时会删除表
none不会对数据库结构进行任何操作

映射categories表

/* Category.java */
@Table(name = "categories")
@Entity
public class Category {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "category_id")private Integer categoryID;@Column(name = "category_name")private String categoryName;@Column(name = "description")private String description;
}
/* ...省略 get set方法 */

@Table(name = “categories”)
Category 类将与数据库中名为 categories 的表进行映射。

@Entity
注解标记该类为一个 JPA 实体,即一个可以映射到数据库表的类。JPA 会在运行时使用该类与数据库进行交互。

@Id
标识该字段是实体的主键。

@GeneratedValue
注解表示主键值是自动生成的。strategy = GenerationType.IDENTITY 表示数据库会为该字段生成唯一的自增值。也就是说,每次插入一条新记录时,categoryID 会自动递增

@Column
注解用来指定该字段映射到数据库表中的哪一列。

dto传输类

/* CategoryDto.java */
public class CategoryDto {private  Integer categoryID;@NotBlank(message = "分类名称不能为空")private String categoryName;@NotBlank(message = "分类描述不能为空")private String description;
}
/* ...省略 get set方法 */

由于主键id是自动生成的,所以插入值时只用到两个列。

API响应数据类

/* ResponseMessage.java */
public class ResponseMessage<T> {private Integer code;private String message;private T data;public ResponseMessage(Integer code, String message, T data) {this.code = code;this.message = message;this.data = data;}public static <T> ResponseMessage<T> success(T data){return new ResponseMessage<>(HttpStatus.OK.value(),"success!",data);}/* ...省略 get set方法 */
}

定义了一个泛型类 ,用于封装统一格式的响应消息,里面有一个静态泛型方法,成功响应返回状态码、字符串和对象内容。

统一类型返回

/* GlobalExceptionHandlerAdvice.java */
@RestControllerAdvice
public class GlobalExceptionHandlerAdvice {Logger log = LoggerFactory.getLogger(GlobalExceptionHandlerAdvice.class);@ExceptionHandler({Exception.class})public ResponseMessage handlerException(Exception e, HttpServletRequest request, HttpServletResponse response){log.error("统一异常:",e);return new ResponseMessage(500,"error",null);}
}

这个类用来处理全局范围内的异常,响应报异常返回统一的消息。

@RestControllerAdvice
通过该注解,可以捕获所有控制器中的异常,并返回统一格式的 JSON 响应。

@ExceptionHandler
声明该方法用于处理指定的异常类型,{Exception.class}:捕获所有 Exception 类型的异常,包括其子类。

POST

CateRepository 继承了 Spring Data JPA 提供的 CrudRepository 接口,可以获得基本的CRUD 操作(如增、删、改、查)。

/* CateRepository.java */
@Repository
public interface CateRepository extends CrudRepository<Category,Integer> {
}

在服务类添加add方法,插入请求body里的内容。

/* ICateService.java 服务接口 */
public interface ICateService {/*** 插入分类* @param categoryDto*/Category add(CategoryDto categoryDto);
}
/* CateService.java 实现服务接口 */
@Service
public class CateService implements ICateService{@AutowiredCateRepository cateRepository;@Overridepublic Category add(CategoryDto categoryDto) {Category category = new Category();BeanUtils.copyProperties(categoryDto,category);return cateRepository.save(category);}
}

@Service
表示该类是一个专门用于 Service 层的注解,用于处理业务逻辑,Spring 会自动检测并注册 CateService 为一个 Spring Bean,因此可以被其他类注入和使用。

@Autowired
Spring 提供的依赖注入注解,它用于自动注入依赖的对象。Spring 容器会自动将 CateRepository 的实例注入到 CateService 类中,cateRepository 便可以用来执行数据库操作,如保存、查询、删除类别等。

BeanUtils.copyProperties(first,second)
此方法会自动匹配相同名字的字段和兼容的类型,将 first对象中的数据赋值到second对象中。

接下来写Controller 对象的里的内容,完成post处理接口。

/* Controller.java */
@RestController
@RequestMapping("/cate")
public class CateController {@AutowiredICateService cateService;@PostMappingpublic ResponseMessage<Category> add(@Validated @RequestBody CategoryDto categoryDto){Category cateNew = cateService.add(categoryDto);return ResponseMessage.success(cateNew);}
}

@RestController
该注解使得 CateController 类成为一个 RESTful风格的控制器,可以处理 HTTP 请求,并返回 JSON 数据。

@RequestMapping(“/cate”)
该注解用于定义该控制器处理的请求 URL 路径前缀。

@PostMapping
当收到 POST 请求时,该方法会被调用。add 方法接收前端提交的 CategoryDto 数据,并通过 cateService 保存数据。返回的结果是一个封装了状态、消息和数据的统一响应对象 ResponseMessage,以 JSON 格式返回给客户端。
在这里插入图片描述
在这里插入图片描述

GET 通过id查询分类

/* Controller.java */
@GetMapping("/{id}")
public ResponseMessage<Category> get(@PathVariable Integer id){return ResponseMessage.success(cateService.getCate(id));
}
/* ICateService.java 服务接口 */
/*** 查询分类* @param id*/
Category getCate(Integer id);
/* CateService.java 实现服务接口 */
@Override
public Category getCate(Integer id) {return cateRepository.findById(id).orElseThrow(()-> new IllegalArgumentException("分类不存在"));
}

在这里插入图片描述

PUT 通过id修改分类

/* Controller.java */
@PutMapping
public ResponseMessage<Category> update(@Validated @RequestBody CategoryDto categoryDto){Category cateNew = cateService.cateEdit(categoryDto);return ResponseMessage.success(cateNew);
}
/* ICateService.java 服务接口 */
/*** 编辑分类* @param categoryDto*/
Category cateEdit(CategoryDto categoryDto);
/* CateService.java 实现服务接口 */
@Override
public Category cateEdit(CategoryDto categoryDto) {Category category = new Category();BeanUtils.copyProperties(categoryDto,category);return cateRepository.save(category);
}

在这里插入图片描述

Delete 通过id删除数据

/* Controller.java */
@DeleteMapping("/{id}")
public ResponseMessage<Category> delete(@PathVariable Integer id){cateService.cateDelete(id);return ResponseMessage.success(null);
}
/* ICateService.java 服务接口 */
/*** 删除分类** @param id*/
void cateDelete(Integer id);
/* CateService.java 实现服务接口 */
@Override
public void cateDelete(Integer id) {cateRepository.deleteById(id);
}

在这里插入图片描述

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

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

相关文章

electron 如何申请 Mac 系统权限

对于一些使用 Electron开发的app, 需要获取一些系统权限,比如录屏权限, 获取摄像头权限,麦克风等等,类似于以下界面: 那么Electron App 应该如何申请呢? 首先我们明确一下macOS中基础权限的分类,可以分为以下几种: 隐私权限(Private Permissions) : <!-- entitlements.ma…

浅谈云计算02 | 云计算模式的演进

云计算计算模式的演进 一、云计算计算模式的起源追溯1.2 个人计算机与桌面计算 二、云计算计算模式的发展阶段2.1 效用计算的出现2.2 客户机/服务器模式2.3 集群计算2.4 服务计算2.5 分布式计算2.6 网格计算 三、云计算计算模式的成熟与多元化3.1 主流云计算服务模式的确立3.1.…

An FPGA-based SoC System——RISC-V On PYNQ项目复现

本文参考&#xff1a; &#x1f449; 1️⃣ 原始工程 &#x1f449; 2️⃣ 原始工程复现教程 &#x1f449; 3️⃣ RISCV工具链安装教程 1.准备工作 &#x1f447;下面以LOCATION代表本地源存储库的安装目录&#xff0c;以home/xilinx代表在PYNQ-Z2开发板上的目录 ❗ 下载Vivad…

AI智能体实战|使用扣子Coze搭建AI智能体,看这一篇就够了(新手必读)

有朋友看到我使用Coze搭建的AI智能体蛮实用的&#xff0c;也想自己尝试一下。那今天我就分享一下如何使用Coze&#xff08;扣子&#xff09;搭建AI智能体&#xff0c;手把手教学&#xff0c;流程超级详细&#xff0c;学会了的话&#xff0c;欢迎分享转发&#xff01; 一、搭建A…

.NET8.0多线程编码结合异步编码示例

1、创建一个.NET8.0控制台项目来演示多线程的应用 2、快速创建一个线程 3、多次运行程序&#xff0c;可以得到输出结果 这就是多线程的特点 - 当多个线程并行执行时&#xff0c;它们的具体执行顺序是不确定的&#xff0c;除非我们使用同步机制&#xff08;如 lock、信号量等&am…

nginx 实现 正向代理、反向代理 、SSL(证书配置)、负载均衡 、虚拟域名 ,使用其他中间件监控

我们可以详细地配置 Nginx 来实现正向代理、反向代理、SSL、负载均衡和虚拟域名。同时&#xff0c;我会介绍如何使用一些中间件来监控 Nginx 的状态和性能。 1. 安装 Nginx 如果你还没有安装 Nginx&#xff0c;可以通过以下命令进行安装&#xff08;以 Ubuntu 为例&#xff0…

《数据思维》之数据可视化_读书笔记

文章目录 系列文章目录前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 数据之道&#xff0c;路漫漫其修远兮&#xff0c;吾将上下而求索。 一、数据可视化 最基础的数据可视化方法就是统计图。一个好的统计图应该满足四个标准&#xff1a;准确、有…

Linux之进程

Linux之进程 一.进程进程之形ps命令进程状态特殊进程孤儿进程守护进程 进程创建之创建子进程进程特性优先级进程切换&#xff08;分时操作系统&#xff09; 二.环境变量三.进程地址空间四.进程终止&进程等待五.进程替换六.自定义shell 本篇博客希望简略的介绍进程&#xff…

漫话架构师|什么是系统架构设计师(开篇)

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 关注犬余&#xff0c;共同进步 技术从此不孤单

在AI智能中有几种重要的神经网络类型?6种重要的神经网络类型分享!

神经网络今天已经变得非常流行&#xff0c;但仍然缺乏对它们的了解。一方面&#xff0c;我们已经看到很多人无法识别各种类型的神经网络及其解决的问题&#xff0c;更不用说区分它们中的每一个了。其次&#xff0c;在某种程度上更糟糕的是&#xff0c;当人们在谈论任何神经网络…

业务幂等性技术架构体系之消息幂等深入剖析

在系统中当使用消息队列时&#xff0c;无论做哪种技术选型&#xff0c;有很多问题是无论如何也不能忽视的&#xff0c;如&#xff1a;消息必达、消息幂等等。本文以典型的RabbitMQ为例&#xff0c;讲解如何保证消息幂等的可实施解决方案&#xff0c;其他MQ选型均可参考。 一、…

【C语言】线程----同步、互斥、条件变量

目录 3. 同步 3.1 概念 3.2 同步机制 3.3 函数接口 1. 同步 1.1 概念 同步(synchronization)指的是多个任务(线程)按照约定的顺序相互配合完成一件事情 1.2 同步机制 通过信号量实现线程间的同步 信号量&#xff1a;通过信号量实现同步操作&#xff1b;由信号量来决定…

Linux内核的启动

一、需求 Linux系统中内核处于硬件和应用层之间。整个系统启动和初始化的过程&#xff0c;Linux内核是在主处理器启动之后才会执行。不同的处理器启动流程并不相同&#xff0c;这就要求内核能支持各种处理器的初始化操作。Liux内核各个模块&#xff0c;大部分设计时做到了体系…

[手机Linux] ubuntu 错误解决

Ubuntu: 1,ttyname failed: Inappropriate ioctl for device 将 /root/.profile 文件中的 mesg n || true 改为如下内容。 vim /root/.profile tty -s && mesg n || true 2,Errors were encountered while processing: XXX XXXX sudo apt-get --purge remove xxx…

Docker的入门

一、安装Docker 本教程参考官网文档&#xff0c;链接如下: CentOS | Docker Docs 这个教程是基于你的虚拟机已经弄好了&#xff08;虚拟机用的CentOS&#xff09;&#xff0c;并且有SecureCRT或者MobaXterm等等任意一个工具 1.1 卸载旧版 如果系统中存在旧版本的Docker&a…

Onedrive精神分裂怎么办(有变更却不同步)

Onedrive有时候会分裂&#xff0c;你在本地删除文件&#xff0c;并没有同步到云端&#xff0c;但是本地却显示同步成功。 比如删掉了一个目录&#xff0c;在本地看已经删掉&#xff0c;onedrive显示已同步&#xff0c;但是别的电脑并不会同步到这个删除操作&#xff0c;在网页版…

机器学习06-正则化

机器学习06-正则化 文章目录 机器学习06-正则化0-核心逻辑脉络1-参考网址3-大模型训练中的正则化1.正则化的定义与作用2.常见的正则化方法及其应用场景2.1 L1正则化&#xff08;Lasso&#xff09;2.2 L2正则化&#xff08;Ridge&#xff09;2.3 弹性网络正则化&#xff08;Elas…

windows 极速安装 Linux (Ubuntu)-- 无需虚拟机

1. 安装 WSL 和 Ubuntu 打开命令行&#xff0c;执行 WSL --install -d ubuntu若报错&#xff0c;则先执行 WSL --update2. 重启电脑 因安装了子系统&#xff0c;需重启电脑才生效 3. 配置 Ubuntu 的账号密码 打开 Ubuntu 的命令行 按提示&#xff0c;输入账号&#xff0c;密…

微信小程序实现个人中心页面

文章目录 1. 官方文档教程2. 编写静态页面3. 关于作者其它项目视频教程介绍 1. 官方文档教程 https://developers.weixin.qq.com/miniprogram/dev/framework/ 2. 编写静态页面 mine.wxml布局文件 <!--index.wxml--> <navigation-bar title"个人中心" ba…

Qt/C++进程间通信:QSharedMemory 使用详解(附演示Demo)

在开发跨进程应用程序时&#xff0c;进程间通信&#xff08;IPC&#xff09;是一个关键问题。Qt 框架提供了多种 IPC 技术&#xff0c;其中 QSharedMemory 是一种高效的共享内存方式&#xff0c;可以实现多个进程之间快速交换数据。本文将详细讲解 QSharedMemory 的概念、用法及…