优质院校建设网站,万网搭建淘宝客网站,招商加盟网站系统,企业网站管理系统 免费#x1f4e2; 大家好#xff0c;我是 【战神刘玉栋】#xff0c;有10多年的研发经验#xff0c;致力于前后端技术栈的知识沉淀和传播。 #x1f497; #x1f33b; CSDN入驻不久#xff0c;希望大家多多支持#xff0c;后续会继续提升文章质量#xff0c;绝不滥竽充数… 大家好我是 【战神刘玉栋】有10多年的研发经验致力于前后端技术栈的知识沉淀和传播。 CSDN入驻不久希望大家多多支持后续会继续提升文章质量绝不滥竽充数欢迎多多交流。 文章目录 写在前面的话MyBatis-Plus技术简介整合步骤功能改造过程复盘LambdaQueryWrapper 总结陈词 写在前面的话
本系列博文已连载到第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 --
dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-spring-boot3-starter/artifactIdversion3.5.5/version
/dependency!-- 整合MyBatis --
!--dependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion3.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.xmlStep3、修改实体类 这里只需要添加一个 TableId 注解标识一下主键即可这里由于主键字段不是id所以需要加注解。 其他都是表和字段由于也是基于表生成的代码遵循约定大于配置原则可以不需要调整。 正常情况使用 TableField 标识字段TableName 标识表名自动支持驼峰转下划线。
public class ZyTeacherInfo {TableIdSchema(description 教师编号)NotBlank(message 教师编号不能为空)private java.lang.String teaCode;Schema(description 教师名称)Size(min 2, max 8, message 教师名称长度需在2-8位)private java.lang.String teaName;...省略其他代码
}对应表信息
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 BaseMapperZyTeacherInfo {}Step5、编写测试 Controller 这里先临时写一个接口这里只为测试正常不直接注入Mapper。
Autowired
private ZyTeacherInfoMpMapper zyTeacherInfoMpMapper;GetMapping()
public ListZyTeacherInfo findList(ZyTeacherInfo zyTeacherInfo) {QueryWrapperZyTeacherInfo queryWrapper new QueryWrapper();queryWrapper.eq(tea_name, zyTeacherInfo.getTeaName());ListZyTeacherInfo zyTeacherInfos zyTeacherInfoMpMapper.selectList(queryWrapper);for (ZyTeacherInfo teacherInfo : zyTeacherInfos) {System.out.println(teacherInfo);}return zyTeacherInfos;
}启动程序用 Knife4j 测试一下效果如下所示。 效果还可以至此基础整合工作算完成了。 功能改造
之前 MyBatis 的版本实现了 CURD 的完整功能那整合完 MP 之后也不能落下。 使用前面的 ZyTeacherInfoMpMapper已经可以实现大部分的功能它提供的方法可不少。 但总不能在 Controller 层直接操作 Mapper 吧而且一些操作毕竟还是要组装 QueryWrapper 等实现不够清爽。 那就把常用的方法封装到业务 Service 类里面即可。 这里上一段示例代码
Slf4j
Service
public class ZyTeacherInfoMpService extends ServiceImplZyTeacherInfoMpMapper, 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 ListZyTeacherInfo getAllUsers() {return this.list();}/*** 根据条件查询用户LambdaQueryWrapper方式*/public ListZyTeacherInfo getUsersByName(String name) {LambdaQueryWrapperZyTeacherInfo queryWrapper new LambdaQueryWrapper();queryWrapper.eq(ZyTeacherInfo::getTeaName, name);return this.list(queryWrapper);}/*** 更新电话LambdaUpdateWrapper方式*/public void updateUserPhone(Long userId, String phone) {LambdaUpdateWrapperZyTeacherInfo 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” 的用户。
LambdaQueryWrapperUser queryWrapper new LambdaQueryWrapper();
queryWrapper.gt(User::getAge, 18) // 年龄大于 18.like(User::getName, John); // 名字包含 JohnListUser users userService.list(queryWrapper);2、组合条件查询 假设我们想要查询年龄在 20 到 30 之间的用户并且邮箱不为空。
LambdaQueryWrapperUser queryWrapper new LambdaQueryWrapper();
queryWrapper.between(User::getAge, 20, 30) // 年龄在 20 到 30 之间.isNotNull(User::getEmail); // 邮箱不为空ListUser users userService.list(queryWrapper);3、使用 OR 条件 假设我们想要查询名字为 “Alice” 或者年龄小于 25 的用户。
LambdaQueryWrapperUser queryWrapper new LambdaQueryWrapper();
queryWrapper.gt(User::getAge, 18) // 年龄大于 18.like(User::getName, John); // 名字包含 JohnListUser users userService.list(queryWrapper);4、排序和分页 假设我们想要查询所有用户按照年龄降序排列并且只获取前 10 条记录。
LambdaQueryWrapperUser queryWrapper new LambdaQueryWrapper();
queryWrapper.orderByDesc(User::getAge) // 按照年龄降序排列.last(LIMIT 10); // 只获取前 10 条记录ListUser users userService.list(queryWrapper);5、复杂的嵌套条件 假设我们想要查询年龄大于 18 且名字包含 “John” 或者邮箱以 “example.com” 结尾的用户。
LambdaQueryWrapperUser queryWrapper new LambdaQueryWrapper();
queryWrapper.gt(User::getAge, 18) // 年龄大于 18.and(wrapper - wrapper // 嵌套条件.like(User::getName, John).or().likeRight(User::getEmail, example.com)); // 邮箱以 example.com 结尾ListUser users userService.list(queryWrapper);6、动态条件查询 在某些情况下查询条件可能是动态的。假设我们有一个查询条件对象用户可以选择性地输入查询条件。
public ListUser dynamicQuery(UserQueryDTO queryDTO) {LambdaQueryWrapperUser 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 还有很多基础和扩展用法可以自行掌握加油 后续会逐步分享企业实际开发中的实战经验有需要交流的可以联系博主。