《程序猿入职必会(10) · SpringBoot3 整合 MyBatis-Plus》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗
🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,欢迎多多交流。👍

文章目录

    • 写在前面的话
    • MyBatis-Plus
      • 技术简介
      • 整合步骤
      • 功能改造
      • 过程复盘
      • LambdaQueryWrapper
    • 总结陈词

CSDN.gif

写在前面的话

本系列博文已连载到第10篇,在前几篇文章基础上,我们已经得到了一个完整的前后端项目,并且后端已经接入了MyBatis 完成了教师表的 CURD 操作,本篇文章在此基础上,整合MyBatis-Plus,从而进一步强化功能。

关联文章:
《程序猿入职必会(1) · 搭建拥有数据交互的 SpringBoot 》
《程序猿入职必会(2) · 搭建具备前端展示效果的 Vue》
《程序猿入职必会(3) · SpringBoot 各层功能完善 》
《程序猿入职必会(4) · Vue 完成 CURD 案例 》
《程序猿入职必会(5) · CURD 页面细节规范 》
《程序猿入职必会(6) · 返回结果统一封装》
《程序猿入职必会(7) · 前端请求工具封装》
《程序猿入职必会(8) · 整合 Knife4j 接口文档》
《程序猿入职必会(9) · 用代码生成器快速开发》


MyBatis-Plus

技术简介

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
更详细的内容介绍,建议直接看官网,这边不展开赘述,直接上实操,下文简称为“MP”。


整合步骤

引言:这边是基于之前的 SpringBoot3 后端项目,并且已经整合 MyBatis 的基础上介绍,之前内容可以参考 《程序猿入职必会(1) · 搭建拥有数据交互的 SpringBoot 》和《程序猿入职必会(3) · SpringBoot 各层功能完善 》。

**Step1、引入依赖 **

<!-- 整合MyBatis-Plus -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.5</version>
</dependency><!-- 整合MyBatis -->
<!--<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version>
</dependency>-->

引入MyBatis-Plus相关依赖,这里有两个注意事项:
1、这里要引入适配SpringBoot3的版本,而不是mybatis-plus-boot-starter。这里的 mybatis-plus-spring-boot3-starter 是专门为 Spring Boot 3.x 版本设计的启动器,支持 Spring Boot 3.x 的特性和依赖。而 mybatis-plus-boot-starter 通常是为较早版本的 Spring Boot(如 2.x)设计的启动器。

Tips:网上很多教程,都是写 mybatis-plus-boot-starter,导致不少问题。

2、MyBatis-Plus 的依赖包含了 MyBatis 的,这里建议把后者的依赖注释,除非你可以保障两者的版本一致,否则可能会引发一系列意想不到的问题。

Step2、修改配置
和 MP 相关的配置,无非就是 datasource 和 Mybatis,在之前的基础上,只需要将属性 mybatis 改成 mybatis-plus,其他都不需要调整。

mybatis-plus:mapper-locations: classpath:/mappings/**/*Mapper.xmltype-aliases-package: com.lw.sbdemo2.entityconfig-location: classpath:mybatis-config.xml

Step3、修改实体类
这里只需要添加一个 @TableId 注解,标识一下主键即可(这里由于主键字段不是id,所以需要加注解)。
其他都是表和字段,由于也是基于表生成的代码,遵循约定大于配置原则,可以不需要调整。
正常情况使用 @TableField 标识字段,@TableName 标识表名,自动支持驼峰转下划线。

public class ZyTeacherInfo {@TableId@Schema(description = "教师编号")@NotBlank(message = "教师编号不能为空")private java.lang.String teaCode;@Schema(description = "教师名称")@Size(min = 2, max = 8, message = "教师名称长度需在2-8位")private java.lang.String teaName;...省略其他代码
}

对应表信息:
image.png

Step4、修改 Mapper
这里直接选择新建一个 Mapper,以示区别,因为旧的 Mapper 已经有继承一个自己封装的基类了。
创建一个 Mapper 接口,继承 MP 的BaseMapper,如下所示:

package com.lw.sbdemo2.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lw.sbdemo2.entity.ZyTeacherInfo;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface ZyTeacherInfoMpMapper extends BaseMapper<ZyTeacherInfo> {}

Step5、编写测试 Controller
这里先临时写一个接口,这里只为测试,正常不直接注入Mapper。

@Autowired
private ZyTeacherInfoMpMapper zyTeacherInfoMpMapper;@GetMapping("")
public List<ZyTeacherInfo> findList(ZyTeacherInfo zyTeacherInfo) {QueryWrapper<ZyTeacherInfo> queryWrapper = new QueryWrapper<>();queryWrapper.eq("tea_name", zyTeacherInfo.getTeaName());List<ZyTeacherInfo> zyTeacherInfos = zyTeacherInfoMpMapper.selectList(queryWrapper);for (ZyTeacherInfo teacherInfo : zyTeacherInfos) {System.out.println(teacherInfo);}return zyTeacherInfos;
}

启动程序,用 Knife4j 测试一下效果,如下所示。
image.png
效果还可以,至此,基础整合工作算完成了。


功能改造

之前 MyBatis 的版本实现了 CURD 的完整功能,那整合完 MP 之后,也不能落下。
使用前面的 ZyTeacherInfoMpMapper,已经可以实现大部分的功能,它提供的方法可不少。
但总不能在 Controller 层,直接操作 Mapper 吧,而且一些操作毕竟还是要组装 QueryWrapper 等实现,不够清爽。
那就把常用的方法,封装到业务 Service 类里面即可。
这里上一段示例代码:

@Slf4j
@Service
public class ZyTeacherInfoMpService extends ServiceImpl<ZyTeacherInfoMpMapper, ZyTeacherInfo> {/*** 插入用户*/public void addUser(ZyTeacherInfo user) {this.save(user);}/*** 删除用户*/public void deleteUser(Long id) {this.removeById(id);}/*** 更新用户*/public void updateUser(ZyTeacherInfo user) {this.updateById(user);}/*** 根据ID查询用户*/public ZyTeacherInfo getUserById(Long id) {return this.getById(id);}/*** 查询所有用户*/public List<ZyTeacherInfo> getAllUsers() {return this.list();}/*** 根据条件查询用户(LambdaQueryWrapper方式)*/public List<ZyTeacherInfo> getUsersByName(String name) {LambdaQueryWrapper<ZyTeacherInfo> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(ZyTeacherInfo::getTeaName, name);return this.list(queryWrapper);}/*** 更新电话(LambdaUpdateWrapper方式)*/public void updateUserPhone(Long userId, String phone) {LambdaUpdateWrapper<ZyTeacherInfo> updateWrapper = new LambdaUpdateWrapper<>();updateWrapper.eq(ZyTeacherInfo::getTeaCode, userId).set(ZyTeacherInfo::getTeaPhone, phone);this.getBaseMapper().update(null, updateWrapper);}
}

可以看到了选择多样化,更复杂的一些场景,可以借助 LambdaQueryWrapper 和 LambdaUpdateWrapper 实现。
上面只是部分示例,并不是完整代码,同时实战时,框架层面可以考虑进一步的封装。


过程复盘

可以看到,整个过程相当丝滑,大部分操作 MP 都提供了 Service 和 Mapper 层的基类,主要是去除了 SQL-XML。
虽然都是代码生成器生成的,但还是减少不少代码量,最主要是操作数据更贴近了程序猿的思维。
当然,一些复杂的多表查询,或者想提升SQL的性能,那还是继续选择 XML 的方式较为合适。
MP 允许无缝使用 MyBatis 原有的功能,两者并不冲突。


LambdaQueryWrapper

LambdaQueryWrapper 是 MyBatis-Plus 提供的一个非常强大的查询构造器,它允许你以 Lambda 表达式的方式构建查询条件。以下是一些复杂场景的示例,展示如何使用 LambdaQueryWrapper 进行多条件查询、组合条件、排序等操作。
假设我们有一个 User 实体,包含字段 name、age 和 email。

1、多条件查询
我们想要查询年龄大于 18 且名字包含 “John” 的用户。

LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.gt(User::getAge, 18) // 年龄大于 18.like(User::getName, "John"); // 名字包含 "John"List<User> users = userService.list(queryWrapper);

2、组合条件查询
假设我们想要查询年龄在 20 到 30 之间的用户,并且邮箱不为空。

LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.between(User::getAge, 20, 30) // 年龄在 20 到 30 之间.isNotNull(User::getEmail); // 邮箱不为空List<User> users = userService.list(queryWrapper);

3、使用 OR 条件
假设我们想要查询名字为 “Alice” 或者年龄小于 25 的用户。

LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.gt(User::getAge, 18) // 年龄大于 18.like(User::getName, "John"); // 名字包含 "John"List<User> users = userService.list(queryWrapper);

4、排序和分页
假设我们想要查询所有用户,按照年龄降序排列,并且只获取前 10 条记录。

LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.orderByDesc(User::getAge) // 按照年龄降序排列.last("LIMIT 10"); // 只获取前 10 条记录List<User> users = userService.list(queryWrapper);

5、复杂的嵌套条件
假设我们想要查询年龄大于 18 且(名字包含 “John” 或者邮箱以 “@example.com” 结尾的用户)。

LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.gt(User::getAge, 18) // 年龄大于 18.and(wrapper -> wrapper // 嵌套条件.like(User::getName, "John").or().likeRight(User::getEmail, "@example.com")); // 邮箱以 "@example.com" 结尾List<User> users = userService.list(queryWrapper);

6、动态条件查询
在某些情况下,查询条件可能是动态的。假设我们有一个查询条件对象,用户可以选择性地输入查询条件。

public List<User> dynamicQuery(UserQueryDTO queryDTO) {LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();if (queryDTO.getName() != null) {queryWrapper.like(User::getName, queryDTO.getName());}if (queryDTO.getAge() != null) {queryWrapper.eq(User::getAge, queryDTO.getAge());}if (queryDTO.getEmail() != null) {queryWrapper.eq(User::getEmail, queryDTO.getEmail());}return userService.list(queryWrapper);
}

LambdaQueryWrapper 提供了灵活的方式来构建复杂的查询条件,支持多种操作,如条件组合、排序、分页等。通过使用 Lambda 表达式,可以避免硬编码字段名,从而提高代码的可读性和安全性。


总结陈词

此篇文章介绍了MyBatis-Plus 的基础整合过程,整体还是挺好用的,推荐,仅供学习参考。
简单列了一下实战,关于 MP 还有很多基础和扩展用法,可以自行掌握,加油!
💗 后续会逐步分享企业实际开发中的实战经验,有需要交流的可以联系博主。

CSDN_END.gif

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

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

相关文章

Linux中DHCP服务器配置和管理

文章目录 一、DHCP服务1.1、DHCP的工作流程1.2、DHCP的工作模式1.3、dhcp的主要配置文件 二、安装DHCP服务2.1、更新yum源2.2、安装DHCP服务软件包2.3、配置DHCP服务2.4、启用DHCP服务&#xff08;解决报错&#xff09;2.4.1、查看dhcpd服务的状态和最近的日志条目2.4.2、查看与…

【网络安全】探索AI 聊天机器人工作流程实现RCE

未经许可,不得转载。 文章目录 前言正文前言 我发现了一个广泛使用的AI聊天机器人平台中的远程代码执行漏洞。该漏洞存在于聊天机器人的自定义工作流响应代码中,这些工作流允许开发人员通过创建定制的流程来扩展机器人的功能。 正文 在浏览自动化聊天机器人的多个特定功能…

AI界的“小钢炮“:MiniCPM-V 2.6 版本震撼发布!

MiniCPM-V 2.6 面壁智能推出了一款颠覆性的端侧AI多模态模型——MiniCPM-V 2.6。这个被亲切地称为"小钢炮"的模型&#xff0c;以其惊人的性能和极致的效率&#xff0c;向业界巨头发起了挑战。 MiniCPM-V 2.6 MiniCPM-V 2.6 是 MiniCPM-V 系列中最新、性能最佳的模型。…

算法板子:匈牙利算法——二分图的最大匹配

目录 1. 基础概念 &#xff08;1&#xff09;二分图的概念 &#xff08;2&#xff09; 匈牙利算法的作用 2. 代码 1. 基础概念 &#xff08;1&#xff09;二分图的概念 顶点集 V 分为两个集合&#xff0c;且图中每条边依附的两个顶点都分属于这两个子集&#xff0c;也就是第…

《UniverSeg: Universal Medical Image Segmentation》ICCV2023

摘要 这篇论文提出了一种名为 UniverSeg 的方法&#xff0c;它能够解决未见过的医学图像分割任务&#xff0c;而无需额外的训练。现有的深度学习模型通常无法泛化到新的解剖结构、图像模式或标签上。UniverSeg 利用一种新的 CrossBlock 机制&#xff0c;通过查询图像和定义新分…

倍福PLC数据 转 CCLink IE Field Basic项目案例

目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 设置倍福PLC 2 5 配置网关参数采集倍福PLC数据 4 6 使用CCLINK协议转发数据 7 7 三菱PLC连接网关的CCLINK的设置 8 8 案例总结 12 1 案例说明 设置倍福PLC&#xff0c;开通ADS通信设置网关采集倍福PLC数据把采集的数…

小巧免费的笔记本电池检测工具

BatteryInfoView是一款免费的笔记本电池检测软件&#xff0c;适用于笔记本电脑和上网本。该软件能够提供电池的详细信息&#xff0c;包括电池名称、制造商名称、序列号、制造日期、电源状态&#xff08;充电/放电&#xff09;、当前电池容量、完全充电容量、设计容量、充电放电…

RAG私域问答场景超级详细方案(第一期方案)[1]:工业级别构建私域问答(知识处理、知识召回排序、搜索问答模块)

RAG私域问答场景整体夏详细方案(第一期方案):工业级别构建私域问答(知识处理、知识召回排序、搜索问答模块) 大模型性能的跳阶式增长给文本摘要、信息检索、信息抽取、语义问答等自然语言处理任务带来了卓越的性能提升。同时,LangChain 作为一种基于 LLM 的框架,能够快速…

基础岛 - 8G显存验证书生·浦语大模型的Demo

因为以前用过LMDeploy&#xff0c;所以本章的内容相对熟悉。 另外&#xff0c;因为教程写的很详细保姆级&#xff0c;所以大多数情况直接复制执行命令即可。开发机的创建略过。 总体验证结论&#xff1a; LMDeploy的模型加载有点慢&#xff0c;但推理速度快&#xff0c;符合预…

第三方软件检测机构服务类型

在信息技术飞速发展的今天&#xff0c;软件产品的质量已成为企业竞争力的重要组成部分。卓码软件测评这家第三方软件检测机构致力于提供一流的软件测试服务&#xff0c;帮助企业确保其软件产品的可靠性和安全性。 一、项目验收测试&#xff1a;确保交付质量   项目验收测试是…

【Nuxt】配置

runtimeConfig 运行时配置 // https://nuxt.com/docs/api/configuration/nuxt-config export default defineNuxtConfig({compatibilityDate: 2024-04-03,devtools: {enabled: true},runtimeConfig: {appKey: process.env.APP_KEY,public: {baseUrl: process.env.BASE_URL,}} …

suse SLE 12 SP3 安装 GeForce GT 730 显卡驱动

文章目录 [toc]获取驱动安装显卡驱动验证显卡驱动 获取驱动 浏览器打开 NVIDIA Official Drivers &#xff0c;找到自己对应的驱动&#xff0c;然后查询和下载 安装显卡驱动 下载完成后&#xff0c;有一个 .run 文件&#xff0c;可以直接 bash 执行&#xff0c; bash NVIDIA-Li…

Java每日一题———删除有序数组中的重复项

这个问题可以通过使用双指针技术来解决。我们可以使用两个指针&#xff0c;一个慢指针 slowRunner 用于跟踪新数组的末尾&#xff0c;另一个快指针 fastRunner 用于遍历数组。每当 fastRunner 遇到一个新的唯一元素时&#xff0c;就将其复制到 slowRunner 指向的位置&#xff0…

力扣——11.盛最多水的容器

题目 暴力解 思路&#xff1a; 遍历每一个可能组成的容器&#xff0c;然后计算比较最大值。 代码&#xff1a; int maxArea(vector<int>& height) {int z1 0, z2 0;int len height.size();int val 0;for (z1; z1 < len - 1; z1) {for (z2 z1 1; z2 < l…

将tsx引入vue

按钮 vue <cl-batch-btn >新增批量</cl-batch-btn> import batch from "//modules/ad/components/ uploading/batch.vue" import ClBatchBtn from "/~/crud/src/components/batch-btn"; tsx

ViT论文详解

文章目录 前言一、ViT理论二、模型结构三、实验结果总结 前言 ViT是谷歌团队在2021年3月发表的一篇论文&#xff0c;论文全称是《AN IMAGE IS WORTH 16X16 WORDS:TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE》一张图片分成16x16大小的区域&#xff1a;使用Transformer进行按比…

Arch Linux - 2-安装中文输入法

文章目录 2 安装中文输入法2.0 准备2.0.1 前置条件2.0.2 建议 2.1 方案一&#xff1a;RimeIBus2.1.1 安装&配置2.1.2 添加输入法 2.2 方案二&#xff1a;IBusLibpinyin 2 安装中文输入法 2.0 准备 2.0.1 前置条件 预装gnome # 安装 pacman -S gnome# 设置开机自启动 sy…

【博客22】缤果Android_USB串口调试助手V1.0(高级篇)

超级好用的Android_USB调试助手 ( Android Studio Java) 开发工具: android-studio-2022.2.1.20-windows.exe usb-serial-for-android 目录 一、软件概要&#xff1a; 二、软件界面&#xff1a; 1.App演示 2.其他扩展展示 2.1 USB枚举 2.2 波特率 2.3 自定义指令集 2.…

8月6日Spring Boot学习笔记

MyBatis动态SQL 动态 SQL 大大减少了编写代码的工作量&#xff0c;更体现了 MyBatis 的灵活性、高度可配置性和可维护性。 if标签 <if test"判断条件">SQL语句</if> 当判断条件为 true 时&#xff0c;才会执行所包含的 SQL 语句。 choose、when和otherw…

tomcat文件上传漏洞练习

1、靶场账号注册 vulfocus 注册后邮箱中点击激活 2、首页选择并开启靶场 复制映射的ip和端口 在浏览器输入ip和端口 改成put并把1.jsp中内容复制进去 3打开哥斯拉&#xff0c;连接上面的网址