后端项目操作数据库-中枢组件Service调用Mapper实现增删改查-实例

news2024/12/28 19:14:55

接上篇 使用MyBatis配置Mapper实现增删改查

1.Service的基本作用

Service在代码中的的作用是调用Mapper、被Controller调用。是后端项目中非常重要的组件。
用于设计业务流程、业务逻辑,以保障数据的完整性、有效性、安全性。

2. Service使用举例——“添加相册”

在项目的根包下创建pojo.dto.AlbumAddNewDTO类,用于封装业务方法所需的参数:

@Data
public class AlbumAddNewDTO implements Serializable {
    private String name;
    private String description;
    private Integer sort;
}

再在项目的根包下创建service.IAlbumService接口,并在接口添加“添加相册”的抽象方法:

public interface IAlbumService {
    void addNew(AlbumAddNewDTO albumAddNewDTO);
}

再在项目的根包下创建service.impl.AlbumServiceImpl类,实现以上接口,重写接口中声明的抽象方法,具体的实现,应该是:

package com.luoyang.small.service.impl;

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 org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 接口实现
 *
 * @author luoyang
 * @Date 2023/12/12
 */
// 添加在类上,标记当前类是业务逻辑组件类,用法同@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 RuntimeException();
        }

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

        //执行插入数据
        albumMapper.insert(album);
    }
}
以上实现中 不要忘记两个注解@Service @Autowired

@Service添加在类上,标记当前类是业务逻辑组件类

@Autowired 添加在属性上,使得Spring自动装配此属性的值; 添加在构造方法上,使得Spring自动调用此构造方法; 添加在Setter方法上,使得Spring自动调用此方法

以上实现中 countByName为计数——新增数据前检查是否数据已存在

在实现以上业务之前,需要在Mapper中补充功能,用于检查相册名称是否已经被占用,
这边以查看数据库中相册名是否存在为检查方式,需要执行的SQL语句大致是:

#查看当前相册名数量
select count(*) from pms_album where name=?

AlbumMapper.java接口中添加抽象方法:

/**
 * 根据相册名称统计相册数据的数量
 * @param name 相册名称
 * @return 匹配相册名称的相册数据的数量
 */
int countByName(String name);

并在AlbumMapper.xml中配置SQL语句:

<!-- int countByName(String name); -->
<select id="countByName" resultType="int">
	SELECT count(*) FROM pms_album WHERE name=#{name}
</select>

完成后,在AlbumMapperTests中编写并执行测试:

package com.luoyang.small;


import com.luoyang.small.mapper.AlbumMapper;
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;

/**
 * @author luoyang
 * @date 2023/11/28
 */
@Slf4j
@SpringBootTest
public class AlbumMapperTests {

    @Autowired
    AlbumMapper mapper;

    @Test
    void insert() {
        Album album = new Album();
        album.setName("测试名称001");
        album.setDescription("测试简介001l啦啦啦啦啦");
        album.setSort(100); // 注意:由于MySQL中表设计的限制,此值只能是[0,255]区间内的

        int rows = mapper.insert(album);
        System.out.println("插入数据完成,受影响的行数:" + rows);
    }

    @Test
    void countByName(){
        String name = "测试名称001";
        int count = mapper.countByName(name);
        log.debug("根据名称【{}】统计梳理完成,结果:{}",name,count);
    }

}

测试检查数据库已有名称的数量:1,表示数据已存在;
如果数据已存在还继续插入,我们这边直接报异常,不添加。
在这里插入图片描述

3.Service调用效果展示——编写测试类

完成后,在src/test/java的根包下创建service.AlbumServiceTests测试类*(其中新建service文件夹,相对于src/main/java就不需要导包了)*
在此类中编写并执行测试,如下:

package com.luoyang.small.service;

import com.luoyang.small.pojo.dto.AlbumAddNewDTO;
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;

/**
 * @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());
        }
    }
}

在这里插入图片描述
在这里插入图片描述

声明:部分代码来自有网络,文章只供学习参考
创造价值,乐哉分享!

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

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

相关文章

生物信息学分析领域领先的特制语言环境NGLess(Next Generation Less)介绍、安装配置和详细使用方法

介绍 NGLess&#xff08;Next Generation Less&#xff09;是一种用于生物信息学分析的领先的领域特定语言&#xff08;DSL&#xff09;。它旨在简化和加速NGS&#xff08;Next Generation Sequencing&#xff09;数据的分析过程。NGLess具有清晰的语法和功能&#xff0c;使用户…

宝塔面板快速搭建本地网站结合内网穿透实现远程访问【无需公网IP】

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 前言 宝塔面板作为简单好用的服务器运维管理面板&#xff0c;它支持Linux/Windows系统&#xff0c;我们可用它来一键配置LAMP/LNMP环境、网站、数据库、FTP等&…

OpenAI | GPT-4.5“泄露”,价格离谱!

OpenAI “泄露”了GPT-4.5&#x1f440; 最近&#xff0c;OpenAI “泄露”了备受期待的 GPT-4.5 这个最新的模型带来了跨语言、音频、视觉、视频和3D的多模态功能&#xff0c;开启了复杂推理和跨模态理解的新篇章。 新模型系列包括&#xff1a; GPT-4.5&#xff1a;标准版&…

LeetCode977有序数组的平方两种方法实现(java实现)

今天来分享的是LeetCode977有序数组的平方的实现方法&#xff0c;我们先来看下题目&#xff1a; 提示&#xff1a;我们在读题的时候一定要仔细&#xff0c;注意题目给定的条件是有序数组。 方法1&#xff1a;我们在看到题目的第一时间是无非是将数组每个元素进行平方&#xff…

防御升级!SMC2助力企业高效应对邮箱安全挑战

根据Coremail邮件安全人工智能实验室&#xff08;以下简称AI实验室&#xff09;的监测数据显示&#xff0c;2023年Q3全国企业级用户遭受无差别的暴力破解攻击次数虽相比2022年同期有所下降&#xff0c;但仍高达 24.2 亿次&#xff0c;且暴力破解攻击次数有明显回升趋势。 面对正…

关东升老师从小白到大牛系列丛书(由清华大学出版社出版)

助力技术成长&#xff0c;成就大牛之路 在这个科技日新月异的时代&#xff0c;掌握一门编程语言或专业技能已是必备&#xff0c;不再是奢侈。清华大学出版社出版的“从小白到大牛”的系列丛书&#xff0c;涵盖Python、Java、Kotlin、Android和SQL&#xff0c;助你快速在技术之…

Elasticsearch:相关性工作台 - BM25 及 ELSER 的相关性比较

我们知道 Elastics Learned Sparse EncoderR (ELSER) 可以被用来做语义搜索。它是一个 out-of-domain 的语义搜索模型。无需训练&#xff0c;我们就可以得到很好的相关性。有关 ELSER 的更多知识&#xff0c;请参考文章 “Elastic Learned Sparse Encoder 简介&#xff1a;Elas…

QuickLook 万能的 Windows 预览工具

QuickLook 是一款用于 Microsoft Windows 操作系统的轻量级文件预览工具。它提供了类似于 Mac OS X 上的"快速查看"功能的体验&#xff0c;允许用户在不打开文件的情况下快速预览文件内容。我们只需要按下键盘空格键就可以预览文件&#xff0c;当预览的是 docx 等文件…

安装NLTK Data

文章目录 NLTK离线安装1. 获取安装包2. 放置nltk_data文件3. Demo4. 参考链接 关注公众号&#xff1a;『AI学习星球』 算法学习、4对1辅导、论文辅导或核心期刊可以通过公众号或CSDN滴滴我 nltk库是python语言为自然语言处理提供的一个功能强大&#xff0c;简单易用的函数库&a…

大疆第九届篮球联赛举办的记忆

首先感谢各位大哥支持&#xff0c;我们自己举办了2023 DJI第九届篮球运动比赛&#xff0c;恭喜各位参赛队伍&#xff0c;收获了荣誉、进行了运动锻炼与交流。 队长们合影留念&#xff1a; 从左往右队长依次介绍为&#xff1a;养生队-大凤、疆来队 - 乔丹 、十二人队 - 腾哥、 J…

Python自动化测试(unittest框架)

一、什么是框架 框架是由大佬开发或者专业的研发团队研发的技术骨架&#xff0c;框架是一个半成品&#xff0c;框架是对常用的功能&#xff0c;基础的代码进行封装的一个工具&#xff0c;这个工具对外提供了一些API&#xff0c;其他的开发者只需要调用框架的接口即可&#xff…

Python学习开发mock接口

#1.测试为什么要开发接口&#xff1f; 1)在别的接口没有开发好的时候, mock接口(模拟接口) 2)查看数据, 避免直接操作数据库 #2.开发接口的顺序 1)安装flask flask是一个轻量级开发框架 pip install flask 2)开发一个接口 开发步骤&#xff1a; 1.实例化一个服务server:f…

访谈型软文写作方式,媒介盒子告诉你

访谈型软文一般用于维护企业形象&#xff0c;分享品牌故事。但是许多企业在写访谈型软文时经常容易跑偏或者写来写去没有逻辑&#xff0c;今天媒介盒子就来和大家分享访谈型软文的写作方式&#xff0c;看完这四点&#xff0c;小白也能写好访谈型软文&#xff01; 一、 访谈对象…

03鸿蒙ArkTS应用开发及ArkTS语言学习

目录 1、概述1.1、模型到底是什么&#xff1f;1.2、Stage和FA模型最大的区别到底是什么&#xff1f;1.3、ArkTs和JS开发语言该怎么选呢&#xff1f; 2、一张图认识ArkTS应用的工程目录3、ArkTS开发语言3.1、ArkTS语言从哪里来&#xff1f;3.2、ArkTS基本语法 4、开发一个登录界…

SCI期刊投稿的不同状态

投稿过程中的不同状态代表了稿件的不同处理阶段 1. Submitted to Journal 已提交至期刊 刚投稿成功&#xff0c;邮箱会收到确认信件&#xff0c;等待编辑处理稿件&#xff0c;这个状态自然形成&#xff0c;无需作者处理。 2. Awaiting admin processing 等待管理员处理 文…

面对同行恶意排挤,佳卫苗灭杀病毒HPV向市场发出灵魂五问

近期&#xff0c;抗HPV市场因为一款名叫“佳卫苗灭杀病毒HPV”的产品诞生而风起云涌。上市之初&#xff0c;产品方便表示&#xff0c;佳卫苗灭杀病毒HPV的诞生&#xff0c;不仅是为了造福患者&#xff0c;更是为了优化市场、刺激行业升级&#xff0c;以“机理更科学、材料更先进…

Windows进程机制

进程 进程要做任何事情&#xff0c;必须让一个线程在它的上下文运行。该线程负责执行进程地址空间包含的代码。每个进程至少要有一个线程来执行进程地址空间包含的代码。当系统创建一个进程的时候&#xff0c;会自动为进程创建第一个线程&#xff0c;这称为主线程&#xff08;…

MyBatis--07--启动过程分析、SqlSession安全问题、拦截器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 谈谈MyBatis的启动过程具体的操作过程如下&#xff1a;实现测试类,并测试SqlSessionFactorySqlSession SqlSession有数据安全问题?在MyBatis中&#xff0c;SqlSess…

可观测性是什么?新手入门指南!

如果您之前对可观测性重要性&#xff0c;益处&#xff0c;以及组成不甚了解&#xff0c;本文是一个合适的指南手册。 什么是可观测性&#xff1f; 可观测性被定义为根据系统产生的输出数据&#xff08;如日志&#xff0c;指标和链路追踪&#xff09;来衡量当前系统运行状态的…

Python虚拟环境指南:告别依赖地狱

一、背景 在SAAS&#xff08;软件即服务&#xff09;平台中&#xff0c;用户使用自行定制的Python脚本已经成为司空见惯的做法&#xff0c;然而&#xff0c;由于不同用户对Python三方库的需求各不相同&#xff0c;而底层服务器一般只安装了一个Python版本。举例来说&#xff0…