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

news2024/9/22 1:11:33

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

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 {

    /**
     * 不建议声明为具体的实现类,那样不利于代码“解耦”!
     */
    @Autowired
    private 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_album
        WHERE name = #{name}
    </select>


    <!-- int deleteByName(String name); -->
    <delete id="deleteByName">
        DELETE
        FROM pms_album
        WHERE 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, sort
        FROM 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自动调用此方法
     */
    @Autowired
    private AlbumMapper albumMapper;

    @Override
    public void addNew(AlbumAddNewDTO albumAddNewDTO) {
        //检查相册名称是否占用
        String name = albumAddNewDTO.getName();
        int countByName = albumMapper.countByName(name);
        //如果数据已存在还继续插入,我们这边直接报异常,不添加。
        if (countByName > 0) {
            throw new CustomServiceException("相册名称已经被占用,新增失败");
        }

        //创建Album对象
        Album album = new Album();
        //复制属性到album
        BeanUtils.copyProperties(albumAddNewDTO, album);

        //执行插入数据
        int insert = albumMapper.insert(album);
        log.debug("插入结果 {}", insert);
    }

    @Override
    public void deleteAlbum(String name) {
        int delete = albumMapper.deleteByName(name);
        log.debug("删除结果 {}", delete);
    }

    @Override
    public void updateAlbum(AlbumAddNewDTO albumAddNewDTO) {
        //检查相册名称是否占用
        String name = albumAddNewDTO.getName();
        int countByName = albumMapper.countByName(name);
        //如果数据已存在还继续插入,我们这边直接报异常,不添加。
        if (countByName <= 0) {
            throw new CustomServiceException("该相册不存在");
        }

        //创建Album对象
        Album album = new Album();
        //复制属性到album
        BeanUtils.copyProperties(albumAddNewDTO, album);
        int update = albumMapper.updateByName(album);
        log.debug("更新结果 {}", update);
    }

    @Override
    public 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 {
    //不建议声明为实现类型
    @Autowired
    IAlbumService iAlbumService;

    @Test
    void 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());
        }
    }

    @Test
    void deleteAlbum() {
        try {
            String name = "测试名称001";
            iAlbumService.deleteAlbum(name);
            log.debug("{} 相册删除成功!", name);
        } catch (Exception e) {
            log.debug("删除相册失败,{}", e.getMessage());
        }
    }


    @Test
    void 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());
        }
    }

    @Test
    void 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 {

    /**
     * 不建议声明为具体的实现类,那样不利于代码“解耦”!
     */
    @Autowired
    private 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.coloradmin.cn/o/1311533.html

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

相关文章

DB-GPT大模型私有化部署搭建

一、前言 随着大模型的发布迭代&#xff0c;大模型变得越来越智能&#xff0c;在使用大模型的过程当中&#xff0c;遇到极大的数据安全与隐私挑战。在利用大模型能力的过程中我们的私密数据跟环境需要掌握自己的手里&#xff0c;完全可控&#xff0c;避免任何的数据隐私泄露以及…

Java 基础学习(九)API概述、Object、String、正则表达式

1 API概述 1.1 API概述 1.1.1 什么是API API(Application Programming Interface)&#xff0c;意为&#xff1a;应用程序接口。API就是已经写好的的程序或功能&#xff0c;程序要需要时可以直接调用&#xff0c;无需再次编写。 API可以大致分为如下几类&#xff1a; 编程语…

语音识别功能测试:90%问题,可以通过技术解决

现在市面上的智能电子产品千千万&#xff0c;为了达到人们使用更加方便的目的&#xff0c;很多智能产品都开发了语音识别功能&#xff0c;用来语音唤醒进行交互&#xff1b;另外&#xff0c;各大公司也开发出来了各种智能语音机器人&#xff0c;比如小米公司的“小爱”&#xf…

微服务学习:Gateway服务网关

一&#xff0c;Gateway服务网关的作用&#xff1a; 路由请求&#xff1a;Gateway服务网关可以根据请求的URL或其他标识符将请求路由到特定的微服务。 负载均衡&#xff1a;Gateway服务网关可以通过负载均衡算法分配请求到多个实例中&#xff0c;从而平衡各个微服务的负载压力。…

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

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

了解如何在linux使用podman管理容器

本章主要介绍使用 podman 管理容器。 了解什么是容器&#xff0c;容器和镜像的关系 安装和配置podman 拉取和删除镜像 给镜像打标签 导出和导入镜像 创建和删除镜像 数据卷的使用 管理容器的命令 使用普通用户管理容器 使用普通用户管理容器 对于初学者来说&#xff0c;不太容…

如何在iPad Pro上实现SSH远程连接服务器并进行云端编程开发【内网穿透】

文章目录 前言1. 在iPad下载Code APP2.安装cpolar内网穿透2.1 cpolar 安装2.2 创建TCP隧道 3. iPad远程vscode4. 配置固定TCP端口地址4.1 保留固定TCP地址4.2 配置固定的TCP端口地址4.3 使用固定TCP地址远程vscode 前言 本文主要介绍开源iPad应用IDE如何下载安装&#xff0c;并…

C语言之文件操作(下)

C语言之文件操作&#xff08;下&#xff09; 文章目录 C语言之文件操作&#xff08;下&#xff09;1. 文件的顺序读写1.1 文件的顺序读写函数1.1.1 字符输入/输出函数&#xff08;fgetc/fputc&#xff09;1.1.2 ⽂本⾏输⼊/输出函数&#xff08;fgets/fputs&#xff09;1.1.3 格…

亿赛通电子文档安全管理系统 SQL注入漏洞复现

0x01 产品简介 亿赛通电子文档安全管理系统&#xff08;简称&#xff1a;CDG&#xff09;是一款电子文档安全加密软件&#xff0c;该系统利用驱动层透明加密技术&#xff0c;通过对电子文档的加密保护&#xff0c;防止内部员工泄密和外部人员非法窃取企业核心重要数据资产&…

【Jenkins】节点 node、凭据 credentials、任务 job

一、节点 node Jenkins在安装并初始化完成后&#xff0c;会有一个主节点&#xff08;Master Node&#xff09;&#xff0c;默认情况下主节点可以同时运行的任务数是2&#xff0c;可以在节点配置中修改&#xff08;系统管理/节点和云管理&#xff09;。 Jenkins中的节点&#…

美团、阿里、快手、百度 | NLP暑期算法实习复盘

面试锦囊之面经分享系列&#xff0c;持续更新中 后台回复『面试』加入讨论组交流噢 背景 211CS本港三DS硕&#xff0c;硕士research的方向是NLP&#xff0c;目标是找任何方向的算法实习。 本科做开发为主没有算法经验&#xff0c;没有top比赛&#xff0c;没有过算法实习&…

【docker】docker入门与安装

Docker 一、入门 Docker的主要目标是&#xff1a;Build, Ship and Run Any App, Anywhere&#xff0c;也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理&#xff0c;使用户的APP及其运行环境能做到一次镜像,处处运行。 Docker运行速度快的原因 Docker有比虚拟…

SpringBoot框架接口数据加密(base64)传输(前后分离版本)

技术采用FilterHttpServletRequestWrapperHttpServletResponseWrapperbase64 1、前端加解密 1.1 vue引入开源的base64 1、下载依赖 $ npm install --save js-base642、使用方法&#xff1a; import {Base64} from js-base64Base64.encode(hellow world); // 编码 aGVsbG93IF…

Pycharm2023安装

PyCharm是一种Python IDE&#xff08;集成开发环境&#xff09;&#xff0c;带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外&#xff0c;该IDE提供了一些高…

【SpringBoot篇】基于布隆过滤器,缓存空值,解决缓存穿透问题 (商铺查询时可用)

文章目录 &#x1f354;什么是缓存穿透&#x1f384;解决办法⭐缓存空值处理&#x1f388;优点&#x1f388;缺点&#x1f38d;代码实现 ⭐布隆过滤器&#x1f38d;代码实现 &#x1f354;什么是缓存穿透 缓存穿透是指在使用缓存机制时&#xff0c;大量的请求无法从缓存中获取…

Redis高级特性解析:持久化、主从复制与哨兵机制全面探讨

Redis持久化 RDB快照&#xff08;snapshot&#xff09; 在默认情况下&#xff0c; Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。 你可以对 Redis 进行设置&#xff0c; 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时&#xff0c; 自动保存…

bugkuctf web随记wp

常规思路&#xff1a; 1&#xff0c;源码2&#xff0c;抓包3&#xff0c;御剑dirsearch扫后台检查是否有git文件未删除4&#xff0c;参数 本地管理员&#xff1a;1&#xff0c;cu看源码&#xff0c;sci看源码有一串东西2&#xff0c;base64解码后是test123猜测是密码3&#x…

IDEA中显示方法、类注释信息

目录 一、IDEA测试版本及环境二、操作步骤2.1 鼠标悬停在某一个方法上&#xff0c;从而显示方法的注释信息2.2 调用方法时同步显示方法注释信息2.3 在new一个对象时&#xff0c;这个对象有很多重载的构造方法&#xff0c;想要重载的构造函数都显示出来 一、IDEA测试版本及环境 …

WPF仿网易云搭建笔记(6):Style进阶详解

文章目录 专栏和Gitee仓库前言Style简单使用样式字典全局样式局部全局样式全局样式穿透 专栏和Gitee仓库 WPF仿网易云 Gitee仓库 WPF仿网易云 CSDN博客专栏 前言 WPF想要批量设置样式属性&#xff0c;一共有3个方法 Style样式Template控件模板DataTemplate数据模板 WPF 零基础…

聚观早报 |iOS17.3引入设备被盗保护;iPhone16或调整设计

【聚观365】12月14日消息 iOS17.3引入设备被盗保护 iPhone16或调整设计 马斯克星链网络使用量飙升 华为鸿蒙智行App正式上线 特斯拉人形机器人Optimus二代上线 iOS17.3引入设备被盗保护 苹果向iPhone用户推送了iOS17.3开发者预览版Beta更新&#xff0c;本次更新距离上次发…