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{
    @Autowired
    CateRepository cateRepository;
    
    @Override
    public 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 {
    @Autowired
    ICateService cateService;
    @PostMapping
    public 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);
}

在这里插入图片描述

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

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

相关文章

doc、pdf转markdown

国外的一个网站可以&#xff1a; Convert A File Word, PDF, JPG Online 这个网站免费的&#xff0c;算是非常厚道了&#xff0c;但是大文件上传多了之后会扛不住 国内的一个网站也不错&#xff1a; TextIn-AI智能文档处理-图像处理技术-大模型加速器-在线免费体验 https://…

信号与系统初识---信号的分类

文章目录 0.引言1.介绍2.信号的分类3.关于周期大小的求解4.实信号和复信号5.奇信号和偶信号6.能量信号和功率信号 0.引言 学习这个自动控制原理一段时间了&#xff0c;但是只写了一篇博客&#xff0c;其实主要是因为最近在打这个华数杯&#xff0c;其次是因为在补这个数学知识…

Facebook 在新兴市场的发展策略:机遇与挑战并存

随着全球互联网的普及&#xff0c;新兴市场成为了全球科技公司关注的重点。这些地区的互联网用户数量快速增长&#xff0c;对于 Facebook&#xff08;现 Meta&#xff09;来说&#xff0c;这些市场不仅蕴藏着巨大的用户潜力&#xff0c;也带来了不少挑战。Facebook 在新兴市场的…

2006-2020年各省单位人口医疗卫生机构床位数数据

2006-2020年各省单位人口医疗卫生机构床位数数据2006-2020年各省单位人口医疗卫生机构床位数数据 1、时间&#xff1a;2006-2020年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区名称、年份、单位人口医疗卫生机构床位数 4、范围&#x…

【Hive】新增字段(column)后,旧分区无法更新数据问题

TOC 【一】问题描述 Hive修改数据表结构的需求&#xff0c;比如&#xff1a;增加一个新字段。 如果使用如下语句新增列&#xff0c;可以成功添加列col1。但如果数据表tb已经有旧的分区&#xff08;例如&#xff1a;dt20190101&#xff09;&#xff0c;则该旧分区中的col1将为…

vue3+elementPlus之后台管理系统(从0到1)(day1)

vue3官方文档&#xff1a;https://cn.vuejs.org/guide/introduction.html 1、项目创建 确保电脑已安装node 查看命令&#xff1a; node -v进入项目目录&#xff0c;创建项目 npm init vuelatest Need to install the following packages: create-vue3.13.0 Ok to procee…

添加计算机到AD域中

添加计算机到AD域中 一、确定计算机的DNS指向域中的DNS二、打开系统设置三、加域成功后 一、确定计算机的DNS指向域中的DNS 二、打开系统设置 输入域管理员的账密 三、加域成功后 这里有显示&#xff0c;就成功了。

hot100_240. 搜索二维矩阵 II

hot100_240. 搜索二维矩阵 II 直接遍历列减行增 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,4,7,1…

vim使用指南

&#x1f3dd;️专栏&#xff1a;计算机操作系统 &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 一、Vim 的基本概念 1.Vim 的主要模式&#xff1a; 1.1普通模式 (Normal Mode) 1.2插入…

Web开发(一)HTML5

Web开发&#xff08;一&#xff09;HTML5 写在前面 参考黑马程序员前端Web教程做的笔记&#xff0c;主要是想后面自己搭建网页玩。 这部分是前端HTML5CSS3移动web视频教程的HTML5部分。主要涉及到HTML的基础语法。 HTML基础 标签定义 HTML定义 HTML(HyperText Markup Lan…

软件设计大致步骤

由于近期在做软件架构设计&#xff0c;这里总结下大致的设计流程 软件设计流程 1 首先要先写系统架构图&#xff0c;将该功能在整个系统的位置以及和大致的内部模块划分 2 然后写内部的结构图&#xff0c;讲内部的各个子系统&#xff0c;模块&#xff0c;组件之间的关系和调用…

Hadoop3.x 万字解析,从入门到剖析源码

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…

UML系列之Rational Rose笔记九:组件图

一、新建组件图 二、组件图成品展示 三、工作台介绍 最主要的还是这个component组件&#xff1b; 然后还有这几个&#xff0c;正常是用不到的&#xff1b;基本的使用第四部分介绍一下&#xff1a; 四、基本使用示例 这些&#xff0c;主要是运用package还有package specifica…

RabbitMQ 高可用方案:原理、构建与运维全解析

文章目录 前言&#xff1a;1 集群方案的原理2 RabbitMQ高可用集群相关概念2.1 设计集群的目的2.2 集群配置方式2.3 节点类型 3 集群架构3.1 为什么使用集群3.2 集群的特点3.3 集群异常处理3.4 普通集群模式3.5 镜像集群模式 前言&#xff1a; 在实际生产中&#xff0c;RabbitM…

React Fiber框架中的Render渲染阶段——workLoop(performUnitOfWork【beginWork与completeWork】)

触发渲染过程——renderRoot renderRoot 是一个函数&#xff0c;用于触发渲染工作。它通常会调用并递归地执行一系列的渲染任务&#xff0c;直到完成整个更新过程。这个过程包括执行 Fiber 树中的 beginWork 和 completeWork&#xff0c;以及渲染新状态或 DOM。 function ren…

一体机cell服务器更换内存步骤

一体机cell服务器更换内存步骤&#xff1a; #1、确认grdidisk状态 cellcli -e list griddisk attribute name,asmmodestatus,asmdeactivationoutcome #2、offline griddisk cellcli -e alter griddisk all inactive #3、确认全部offline后进行关机操作 shutdown -h now #4、开…

uni-app编写微信小程序使用uni-popup搭配uni-popup-dialog组件在ios自动弹出键盘。

uni-popup-dialog 对话框 将 uni-popup 的type属性改为 dialog&#xff0c;并引入对应组件即可使用对话框 &#xff0c;该组件不支持单独使用 示例 <button click"open">打开弹窗</button> <uni-popup ref"popup" type"dialog"…

SYS_OP_MAP_NONNULL NULL的等值比较

无意在数据库中发现了这个操作SYS_OP_MAP_NONNULL。 SYS_OP_MAP_NONNULL应该不是数据库中的对象&#xff0c;因为在DBA_OBJECTS中根本找不到它&#xff0c;而在STANDARD和DBMS_STANDARD包中也找不到函数说明。 SQL> SELECT * 2 FROM DBA_OBJECTS 3 WHERE OBJECT_NAME…

基于Java的百度AOI数据解析与转换的实现方法

目录 前言 一、AOI数据结构简介 1、官网的实例接口 2、响应参数介绍 二、Java对AOI数据的解析 1、数据解析流程图 2、数据解析实现 3、AOI数据解析成果 三、总结 前言 在当今信息化社会&#xff0c;地理信息数据在城市规划、交通管理、商业选址等领域扮演着越来越重要的…

深度学习中的学习率调度器(scheduler)分析并作图查看各方法差异

文章目录 1. 指数衰减调度器&#xff08;Exponential Decay Scheduler&#xff09;工作原理适用场景实现示例 2. 余弦退火调度器&#xff08;Cosine Annealing Scheduler&#xff09;工作原理适用场景实现示例 3. 步长衰减调度器&#xff08;Step Decay Scheduler&#xff09;工…