后端接口开发-web前台请求接口对后台数据库增删改查-实例

一、后端接口开发的逻辑是:

1.Application项目启动
2.前台接口Url请求后台
3.Controller控制拿到前台请求参数,传递给中间组件Service
4.Service调用Mapper.java
5. mapper.java映射到mapper.xml中的mybatis语句,类似Sql语句操作数据库
6.其中项目通过Mybatis连接数据库中的数据表
7.数据表数据增删改查

本文接上文:中枢组件Service调用Mapper实现增删改查

二、使用Controller控制器接收并处理“添加相册”的请求

在项目的根包下创建controller.AlbumController类,在类上添加@RestController注解,在类中自动装配IAlbumService的对象,并且,自定义方法处理“添加相册”的请求:

@Slf4j
@RequestMapping("/album")
@RestController
public class AlbumController {/*** 不建议声明为具体的实现类,那样不利于代码“解耦”!*/@Autowiredprivate IAlbumService albumService;//直接网络请求添加//http://localhost:8080/album/add?name=TestAlbum001&description=TestDescription001&sort=88@RequestMapping(value = "/add", method = RequestMethod.GET)public String addNewAlbum(AlbumAddNewDTO albumAddNewDTO) {try {albumService.addNew(albumAddNewDTO);return "添加相册成功Ya!";} catch (CustomServiceException e) {String message = e.getMessage();log.error("addNewAlbum Exception {}", message);return message;}}
}

启动项目,可以通过http://localhost:8080/album/add?name=TestAlbum001&description=TestDescription001&sort=88测试访问,当成功添加相册数据时,在浏览器中可以看到添加相册成功Ya!的字样,如下:
在这里插入图片描述
在这里插入图片描述

如果相册名称被占用,可以看到报错的自定义异常 新增失败 的字样,如下:

三、接口调用全局代码展示

接前文:2.中枢组件Service调用Mapper实现增删改查
在这里插入图片描述

1.定义数据库增删改查 -mapper.java
package com.luoyang.small.mapper;import com.luoyang.small.pojo.entity.Album;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;import java.util.List;/*** @author luoyang* @date 2023/11/28*/
//标记当前类是数据访问组件类
@Repository
public interface AlbumMapper {/*** 插入相册数据** @param album 相册数据* @return 受影响的行数*/int insert(Album album);/*** 根据相册名称统计数据的数量** @param name 相册名称* @return 匹配名称的相册数据的数量*/int countByName(String name);/*** 根据相册名删除** @param name 相册名称* @return 受影响的行数*/int deleteByName(String name);/*** 根据相册名删除** @param album 相册信息* @return 受影响的行数*/int updateByName(Album album);/*** 根据相册名删除** @return 受影响的行数*/List<Album> selectAll();}
2.xml编写类似Sql语句 -mapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.luoyang.small.mapper.AlbumMapper"><!-- int insert(Album album); --><insert id="insert" useGeneratedKeys="true" keyProperty="id">INSERT INTO pms_album (name, description, sort)VALUES (#{name}, #{description}, #{sort})</insert><!-- int countByName(String name); --><select id="countByName" resultType="int">SELECT count(*)FROM pms_albumWHERE name = #{name}</select><!-- int deleteByName(String name); --><delete id="deleteByName">DELETEFROM pms_albumWHERE name = #{name}</delete><!-- int update(Album album); --><update id="updateByName" parameterType="com.luoyang.small.pojo.entity.Album">UPDATE pms_album<set><if test="name != null">name=#{name},</if><if test="description != null">description=#{description},</if><if test="sort != null">sort=#{sort},</if></set>WHERE name=#{name}</update><select id="selectAll" resultType="com.luoyang.small.pojo.entity.Album">SELECT id, name, description, sortFROM pms_album</select></mapper>
3.定义service增删改查抽象方法
package com.luoyang.small.service;import com.luoyang.small.pojo.dto.AlbumAddNewDTO;
import com.luoyang.small.pojo.entity.Album;import java.util.List;/*** 添加相册接口** @author luoyang* @Date 2023/12/12*/
public interface IAlbumService {void addNew(AlbumAddNewDTO albumAddNewDTO);void deleteAlbum(String name);void updateAlbum(AlbumAddNewDTO albumAddNewDTO);List<Album> selectAllAlbum();
}
4.实现service增删改查抽象方法
package com.luoyang.small.service.impl;import com.luoyang.small.ex.CustomServiceException;
import com.luoyang.small.mapper.AlbumMapper;
import com.luoyang.small.pojo.dto.AlbumAddNewDTO;
import com.luoyang.small.pojo.entity.Album;
import com.luoyang.small.service.IAlbumService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;/*** 接口实现** @author luoyang* @Date 2023/12/12*/
@Slf4j
// 添加在类上,标记当前类是业务逻辑组件类,用法同@Component
@Service
public class IAlbumServiceImpl implements IAlbumService {/*** 添加在属性上,使得Spring自动装配此属性的值* 添加在构造方法上,使得Spring自动调用此构造方法* 添加在Setter方法上,使得Spring自动调用此方法*/@Autowiredprivate AlbumMapper albumMapper;@Overridepublic void addNew(AlbumAddNewDTO albumAddNewDTO) {//检查相册名称是否占用String name = albumAddNewDTO.getName();int countByName = albumMapper.countByName(name);//如果数据已存在还继续插入,我们这边直接报异常,不添加。if (countByName > 0) {throw new CustomServiceException("相册名称已经被占用,新增失败");}//创建Album对象Album album = new Album();//复制属性到albumBeanUtils.copyProperties(albumAddNewDTO, album);//执行插入数据int insert = albumMapper.insert(album);log.debug("插入结果 {}", insert);}@Overridepublic void deleteAlbum(String name) {int delete = albumMapper.deleteByName(name);log.debug("删除结果 {}", delete);}@Overridepublic void updateAlbum(AlbumAddNewDTO albumAddNewDTO) {//检查相册名称是否占用String name = albumAddNewDTO.getName();int countByName = albumMapper.countByName(name);//如果数据已存在还继续插入,我们这边直接报异常,不添加。if (countByName <= 0) {throw new CustomServiceException("该相册不存在");}//创建Album对象Album album = new Album();//复制属性到albumBeanUtils.copyProperties(albumAddNewDTO, album);int update = albumMapper.updateByName(album);log.debug("更新结果 {}", update);}@Overridepublic List<Album> selectAllAlbum() {List<Album> listAlbum = albumMapper.selectAll();log.debug("查询结果 {}", listAlbum.toString());return listAlbum;}
}
5.测试service增删改查调用方法
package com.luoyang.small.service;import com.luoyang.small.pojo.dto.AlbumAddNewDTO;
import com.luoyang.small.pojo.entity.Album;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;/*** @author luoyang* @Date 2023/12/12*/
@Slf4j
@SpringBootTest
public class AlbumServiceTests {//不建议声明为实现类型@AutowiredIAlbumService iAlbumService;@Testvoid addNew() {AlbumAddNewDTO albumAddNewDTO = new AlbumAddNewDTO();albumAddNewDTO.setName("测试名称004");albumAddNewDTO.setDescription("测试简介004啦啦啦啦啦");albumAddNewDTO.setSort(100); // 注意:由于MySQL中表设计的限制,此值只能是[0,255]区间内的try {iAlbumService.addNew(albumAddNewDTO);log.debug("添加相册成功!");} catch (Exception e) {log.debug("添加相册失败,{}", e.getMessage());}}@Testvoid deleteAlbum() {try {String name = "测试名称001";iAlbumService.deleteAlbum(name);log.debug("{} 相册删除成功!", name);} catch (Exception e) {log.debug("删除相册失败,{}", e.getMessage());}}@Testvoid updateAlbum() {AlbumAddNewDTO albumAddNewDTO = new AlbumAddNewDTO();albumAddNewDTO.setName("测试名称004");albumAddNewDTO.setDescription("测试简介004更新哈哈哈");albumAddNewDTO.setSort(101); // 注意:由于MySQL中表设计的限制,此值只能是[0,255]区间内的try {iAlbumService.updateAlbum(albumAddNewDTO);log.debug("更新相册成功!");} catch (Exception e) {log.debug("更新相册失败,{}", e.getMessage());}}@Testvoid selectAll() {try {List<Album> albumList = iAlbumService.selectAllAlbum();log.debug("查询所有相册成功!{}", albumList.toString());} catch (Exception e) {log.debug("查询所有相册成功,{}", e.getMessage());}}}
6.Web请求调用Controller接口-正式调用
package com.luoyang.small.controller;import com.luoyang.small.ex.CustomServiceException;
import com.luoyang.small.pojo.dto.AlbumAddNewDTO;
import com.luoyang.small.pojo.entity.Album;
import com.luoyang.small.service.IAlbumService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** 相册web控制器** @author luoyang* @Date 2023/12/13*/
@Slf4j
@RequestMapping("/album")
@RestController
public class AlbumController {/*** 不建议声明为具体的实现类,那样不利于代码“解耦”!*/@Autowiredprivate IAlbumService albumService;//直接网络请求添加//http://localhost:8080/album/add?name=TestAlbum001&description=TestDescription001&sort=88@RequestMapping(value = "/add", method = RequestMethod.GET)public String addNewAlbum(AlbumAddNewDTO albumAddNewDTO) {try {albumService.addNew(albumAddNewDTO);return "添加相册成功Ya!";} catch (CustomServiceException e) {String message = e.getMessage();log.error("addNewAlbum Exception {}", message);return message;}}//直接网络请求删除//http://localhost:8080/album/delete?name=TestAlbum001&description=TestDescription001&sort=88@RequestMapping(value = "/delete", method = RequestMethod.GET)public String deleteAlbum(AlbumAddNewDTO albumAddNewDTO) {if (albumAddNewDTO == null) {return "删除对象为空";}String name = albumAddNewDTO.getName();if (name == null || name.isEmpty()) {return "删除相册的名称为空";}try {albumService.deleteAlbum(name);return name + "相册,删除成功Ya!";} catch (Exception e) {String message = e.getMessage();log.error("deleteAlbum Exception {}", message);return message;}}//直接网络请求更新//http://localhost:8080/album/update?name=TestAlbum001&description=TestDescription001&sort=88@RequestMapping(value = "update", method = RequestMethod.GET)public String updateAlbum(AlbumAddNewDTO albumAddNewDTO) {if (albumAddNewDTO == null) {return "更新对象为空";}String name = albumAddNewDTO.getName();if (name == null || name.isEmpty()) {return "更新相册的名称为空";}try {albumService.updateAlbum(albumAddNewDTO);return name + "相册,更新成功Ya!";} catch (Exception e) {String message = e.getMessage();log.error("updateAlbum Exception {}", message);return message;}}//直接网络请求更新//http://localhost:8080/album/selectAll@RequestMapping(value = {"selectAll","fd"}, method = RequestMethod.GET)public List<Album> selectAllAlbum() {List<Album> albumList = null;try {albumList = albumService.selectAllAlbum();
//            return "查询全部成功Ya! 所有相册:"+albumList.toString();} catch (Exception e) {String message = e.getMessage();log.error("selectAllAlbum Exception {}", message);
//            return message;}return albumList;}}
7.接口调用效果-举例

查询全部:
在这里插入图片描述
创造价值,乐哉分享!
一起入门后端 204146007

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

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

相关文章

携程英语测评(已offer)

携程英语测评大概有这么几种题型&#xff1a;读出屏幕上的句子&#xff0c;读出他说过一遍的句子&#xff0c;长对话听力&#xff0c;给题目临场说一段小作文&#xff0c;语法语义判断。大概就是这五个部分吧&#xff0c;我这里主要介绍一下临场作文题 临场作文我搜集了下网上…

GDPU 数据结构 天码行空14

实验十四 查找算法的实现 一、【实验目的】 1、掌握顺序排序&#xff0c;二叉排序树的基本概念 2、掌握顺序排序&#xff0c;二叉排序树的基本算法&#xff08;查找算法、插入算法、删除算法&#xff09; 3、理解并掌握二叉排序数查找的平均查找长度。 二、【实验内容】 …

群晖(Synology)云备份的方案是什么

群晖云备份方案就是在本地的 NAS 如果出现问题&#xff0c;或者必须需要重做整列的时候&#xff0c;保证数据不丢失。 当然&#xff0c;这些是针对有价值的数据&#xff0c;如果只是电影或者不是自己的拍摄素材文件&#xff0c;其实可以不使用云备份方案&#xff0c;因为毕竟云…

Ubuntu如何安装KVM

环境&#xff1a; 联想E14笔记本 Ubuntu20.04 问题描述&#xff1a; Ubuntu如何安装KVM 解决方案&#xff1a; 1.验证CPU是否支持硬件虚拟化 rootst-ThinkPad-E14:~# grep -Eoc (vmx|svm) /proc/cpuinfo 162.检查 VT 是否在 BIOS 中启用 安装 apt install cpu-checker …

PHP中的依赖注入是怎样的?

依赖注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;是一种设计模式&#xff0c;它用于解耦组件之间的依赖关系&#xff0c;提高代码的可维护性、可测试性和灵活性。在 PHP 中&#xff0c;依赖注入通常通过构造函数注入、方法注入或属性注入来实现。 以下是依…

微服务组件Sentinel的学习(1)

Sentinel学习笔记&#xff08;1&#xff09; Sentinel基本概念Sentinel功能和设计理念流量控制熔断降级系统负载保护 Sentinel基本概念 资源 资源是Sentinel的关键概念。它可以是 ava应用程序中的任何内容&#xff0c;例如&#xff0c;由应用程序提供的服务&#xff0c;或由应…

stm32F407-GPIO的使用——点亮LED并且讲解各个寄存器

stm32F407-GPIO的使用——点亮LED并且讲解各个寄存器 本文为stm32GPIO的介绍与使用&#xff0c;例子是简单的LED点亮。 一、 GPIO GPIO&#xff08;General Purpose I/O Ports&#xff09;意思为通用输入/输出端口&#xff0c;通俗地说&#xff0c; 就是一些引脚&#xff0c;可…

Elasticsearch 8.10之前同义词最佳实践

1、同义词在搜索引擎领域用途 同义词在搜索引擎领域的用途可概括如下: 增强搜索的准确性——当用户输入一个关键词时,可能与他们实际意图相关的文档使用了一个不同的关键词或短语。同义词允许搜索引擎理解和识别这些情况,返回更准确的结果。如:“遥遥领先”和“华为Meta60…

QT学习(20):QTcpSocket和QAbstractSocket

目录 QAbstractSocket建立连接的函数和信号阻塞功能QTcpSocket QAbstractSocketPrivateQAbstractSocketEngine和QNativeSocketEngine QAbstractSocket QAbstractSocket 是QTcpSocket和QUdpSocket的基类&#xff0c;并且包含这两个类的所有通用功能。如果需要套接字&#xff0c…

WT588F02B-8S语音芯片:灵活应用的语音播放利器,实现多重优势

在智能语音交互领域&#xff0c;唯创知音WT588F02B-8S可重复擦写&#xff08;Flash型&#xff09;语音芯片声音播放提示IC凭借其出色的特性&#xff0c;为用户提供了更灵活、高效的语音解决方案。本文将聚焦于该芯片的应用优势&#xff0c;包括实现用户自主更新语音文件、节约打…

WTN6xxx系列OTP语音芯片:智能语音解决方案的可靠之选

在智能语音交互领域&#xff0c;唯创知音的WTN6xxx系列OTP语音芯片以其独特的特性成为声音播放提示IC的可靠之选。本文将深入探讨WTN6xxx系列OTP语音芯片的应用优势&#xff0c;展示其在各个方面的卓越性能。 一、低成本、高性能 1.经济实惠&#xff1a; WTN6xxx系列OTP语音芯…

AGI魔盒,会放出冥王PLUTO还是阿童木?

人机共生&#xff0c;是科幻作品永恒的主题。其中&#xff0c;《冥王PLUTO》可能是最早探讨人类与机器人如何在冲突中共存的漫画作品。 如果说阿童木是人机共生的“和平使者”&#xff0c;启蒙了几代人对机器人的信任和热爱,那么冥王PLUTO就是阿童木的反面&#xff0c;一个心怀…

基于ssm网络安全宣传网站设计论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本网络安全宣传网站就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

2023-12-14 使用Qt画一条曲线(AI辅助)

点击 <C 语言编程核心突破> 快速C语言入门 使用Qt画一条曲线 前言一、Qchart简介二、代码总结 前言 要解决问题: 有一个函数, 生成一些点, 想画一条曲线. 想到的思路: 这个用Qchart比较简单. 其它的补充: 需要稍许配置 一、Qchart简介 QChart是Qt中的一个图表控件&a…

记录 | mac打开终端时报错:login: /opt/homebrew/bin/zsh: No such file or directory [进程已完成]

mac打开终端时报错&#xff1a;login: /opt/homebrew/bin/zsh: No such file or directory [进程已完成]&#xff0c;导致终端没有办法使用的情况 说明 zsh 没有安装或者是安装路径不对 可以看看 /bin 下有没有 zsh&#xff0c;若没有&#xff0c;肯定是有 bash 那就把终端默…

三层交换机原理与配置

文章目录 三层交换机原理与配置一、三层交换技术概述二、传统的 MLS三、基于CEF 的MLS1、转发信息库&#xff08;FIB&#xff09;2、邻接关系表3、工作原理&#xff1a; 四、三层交换机的配置1、三层交换机配置命令2、三层交换机配置步骤 三层交换机原理与配置 一、三层交换技…

【Hadoop】

Hadoop是一个开源的分布式离线数据处理框架&#xff0c;底层是用Java语言编写的&#xff0c;包含了HDFS、MapReduce、Yarn三大部分。 组件配置文件启动进程备注Hadoop HDFS需修改需启动 NameNode(NN)作为主节点 DataNode(DN)作为从节点 SecondaryNameNode(SNN)主节点辅助分…

如何学习Kubernetes,学习K8S入门教程

学习 Kubernetes&#xff08;K8s&#xff09;确实不容易 你的硬件资源有限时&#xff0c;不过别担心&#xff0c;我帮你理清思路&#xff0c;让你在学习 K8s 的路上更加从容。 1、资源限制下的学习方法 当硬件资源有限时&#xff0c;一个好的选择是使用云服务提供的免费层或者…

✺ch2——OpenGL图像管线

目录 基于C图形应用&#xff06;管线概览OpenGL类型第一个C/OpenGL应用程序◍API (1) GLSL类型着色器——画一个点的程序◍API (2)◍API (3) 栅格化像素操作——Z-buffer算法检测 OpenGL 和 GLSL 错误◍API (4) 从顶点来构建一个三角形场景动画◍API (5) OpenGL某些方面的数值—…

C语言第四十九弹----模拟使用strcpy函数

使用C语言模拟使用strcpy函数 定义&#xff1a;strcpy 函数是 C 标准库中用于字符串复制的函数。它接受两个参数&#xff0c;第一个参数 dest 是目标字符串的指针&#xff0c;第二个参数 src 是源字符串的指针&#xff0c;函数的功能是将源字符串复制到目标字符串中&#xff0…