后端接口开发-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.hqwc.cn/news/284246.html

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

相关文章

Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)

目录 一、前言 二、基于注解配置Bean 1.基本介绍 : 2.应用实例 : 3.注意事项 : 三、手动实现Spring 注解配置机制 1.需求 : 2.思路 : 3.实现 : 3.1 自定义注解类 3.2 自定义配置类 3.3 自定义容器类 3.4 在测试类中进行测试 四、自动装配 0.总述 : 1.AutoWired自动装…

Python 爬虫开发完整环境部署,爬虫核心框架安装

Python 爬虫开发完整环境部署 前言&#xff1a; ​ 关于本篇笔记&#xff0c;参考书籍为 《Python 爬虫开发实战3 》 笔记做出来的一方原因是为了自己对 Python 爬虫加深认知&#xff0c;一方面也想为大家解决在爬虫技术区的一些问题&#xff0c;本篇文章所使用的环境为&#x…

音视频:Ubuntu下安装 FFmpeg 5.0.X

1.安装相关依赖 首可选一&#xff1a; sudo apt-get update sudo apt-get install build-essential autoconf automake libtool pkg-config \libavcodec-dev libavformat-dev libavutil-dev \libswscale-dev libresample-dev libavdevice-dev \libopus-dev libvpx-dev libx2…

思码逸企业版 4.0 特性之一:支持 DevOps 全工具链数据分析

《研发效能实践指南》中有一句话“数据驱动不是万能的&#xff0c;没有数据驱动是万万不能的”&#xff0c;数据对于研发效能管理的重要性可见一斑。所以很多团队在做研发效能度量时都在利用各种工具收集、分析着各种数据。 作为一站式研发效能度量平台&#xff0c;思码逸优先…

【Unity动画】综合案例完结-控制角色动作播放+声音配套

这个案例实现的动作并不复杂&#xff0c;主要包含一个 跳跃动作、攻击动作、还有一个包含三个动画状态的动画混合树。然后设置三个参数来控制切换。 状态机结构如下&#xff1a; 完整代码 using System.Collections; using System.Collections.Generic; using UnityEngine;pu…

Leetcode—1523.在区间范围内统计奇数数目【简单】

2023每日刷题&#xff08;六十三&#xff09; Leetcode—1523.在区间范围内统计奇数数目 实现代码 class Solution { public:int countOdds(int low, int high) {int cnt 0;int l low, r high;while(l < r) {if(l % 2) {break;}l;}while(r > low) {if(r % 2) {break…

【算法Hot100系列】盛最多水的容器

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

基于JAVA+SpringBoot+Vue的前后端分离的大学健康档案管理系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着社会的发展和科技…

低代码开发如何快速构建AI应用

随着人工智能&#xff08;AI&#xff09;的快速发展&#xff0c;越来越多的企业和开发者开始意识到AI在业务和应用中的重要性。然而&#xff0c;AI应用的开发通常被认为是复杂和耗时的过程&#xff0c;需要大量的编码和数据科学知识。为了解决这个问题&#xff0c;低代码开发平…

中通快递单号查询入口,删除不需要的单号

批量查询中通快递单号的物流信息&#xff0c;并删除不需要的单号。 所需工具&#xff1a; 一个【快递批量查询高手】软件 中通快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的伙伴记得先注册&#xff0c;然后登录…

【数据结构】八大排序之堆排序算法

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 一.堆排序简介及思路 二.堆排序的代码实现 三.堆排序的时间复杂度分析 结语 一.堆排序简介及思路 堆排序(Heap Sort)是一种效率较高的选择排序算法. 它是指利用堆积树…

Java接收并解析HL7协议数据

一、前言 HL7协议相信医疗行业的IT人员都不陌生&#xff0c;笔者由于接触时间比较短&#xff0c;乍一听“协议”还是比较懵&#xff0c;不自觉就把它和“HTTP”、"SOAP”之类的网络协议挂上关联&#xff0c;可事实上这个HL7只是一种数据格式&#xff0c;传输方式也可以使用…