当前位置: 首页 > article >正文

MyBatis-Plus详解(速成版)

一、介绍MyBatis-Plus:1.概念MyBatis-Plus 是一个MyBatis的增强工具在 MyBatis 的基础上只做增强不做改变为简化开发、提高效率而生。MyBatis-Plus的官网简介https://baomidou.com/introduce/2.特点无侵入只做增强不做改变引入它不会对现有工程产生影响如丝般顺滑损耗小启动即会自动注入基本 CURD性能基本无损耗直接面向对象操作强大的 CRUD 操作内置通用 Mapper、通用 Service仅仅通过少量配置即可实现单表大部分 CRUD 操作更有强大的条件构造器满足各类使用需求支持 Lambda 形式调用通过 Lambda 表达式方便的编写各类查询条件无需再担心字段写错支持主键自动生成支持多达 4 种主键策略内含分布式唯一 ID 生成器 - Sequence可自由配置完美解决主键问题支持 ActiveRecord 模式支持 ActiveRecord 形式调用实体类只需继承 Model 类即可进行强大的 CRUD 操作支持自定义全局通用操作支持全局通用方法注入内置代码生成器采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码支持模板引擎更有超多自定义配置等您来使用内置分页插件基于 MyBatis 物理分页开发者无需关心具体操作配置好插件之后写分页等同于普通 List 查询分页插件支持多种数据库支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库内置性能分析插件可输出 SQL 语句以及其执行时间建议开发测试时启用该功能能快速揪出慢查询内置全局拦截插件提供全表 delete 、 update 操作智能分析阻断也可自定义拦截规则预防误操作3.框架结构二、配置MyBatis-Plus:1.引入依赖dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-spring-boot3-starter/artifactId version3.5.15/version /dependency2.使用 MapperScan 注解扫描 mapper 文件SpringBootApplication MapperScan(com.baomidou.mybatisplus.samples.quickstart.mapper) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }3.在 application.yml 文件中增加MyBatis-Plus 的统一配置# mybatis 相关统一配置 mybatis-plus: configuration: #开启下划线转驼峰 map-underscore-to-camel-case: true作用将数据库表中的下划线命名方式映射为 Java 对象中的驼峰命名方式。例如数据库表中的列名为 user_name对应的 Java 对象的属性名为 userName。三、基本使用1. BaseMapper CRUDData TableName(user) public class User { TableId(type IdType.AUTO) private Long id; private String name; private Integer age; private String email; } // Mapper 接口 —— 继承 BaseMapper 即拥有全套单表 CRUD public interface UserMapper extends BaseMapperUser {}增User user new User(); user.setName(张三); user.setAge(25); userMapper.insert(user); // id 自动回填到实体删userMapper.deleteById(1L); userMapper.deleteBatchIds(Arrays.asList(1L, 2L, 3L)); // 条件删除 userMapper.delete(new LambdaQueryWrapperUser() .lt(User::getAge, 18) .eq(User::getName, 张三) );改// 只更新非 null 字段 User user new User(); user.setId(1L); user.setName(李四); userMapper.updateById(user); // 条件更新 userMapper.update(user, new LambdaUpdateWrapperUser() .eq(User::getAge, 25) );查User user userMapper.selectById(1L); ListUser users userMapper.selectBatchIds(Arrays.asList(1L, 2L)); ListUser users userMapper.selectList( new LambdaQueryWrapperUser() .eq(User::getAge, 25) .orderByDesc(User::getCreateTime) ); Long count userMapper.selectCount( new LambdaQueryWrapperUser().gt(User::getAge, 20) );2. 条件构造器 WrapperLambdaQueryWrapper// SELECT * FROM user WHERE age BETWEEN 20 AND 30 // AND name LIKE %张% AND email IS NOT NULL // ORDER BY age DESC, id ASC LIMIT 10 LambdaQueryWrapperUser wrapper new LambdaQueryWrapperUser() .between(User::getAge, 20, 30) .like(User::getName, 张) .isNotNull(User::getEmail) .orderByDesc(User::getAge) .orderByAsc(User::getId) .last(LIMIT 10); ListUser users userMapper.selectList(wrapper);条件方法速查方法说明SQLeq等于name 张三ne不等于name 张三gt/ge大于 / ≥age 18lt/le小于 / ≤age 30between区间age BETWEEN 20 AND 30like/notLike模糊name LIKE %张%likeLeft/likeRight左/右模糊name LIKE %张in/notIn包含id IN (1,2,3)isNull/isNotNull空/非空email IS NULLorderByAsc/orderByDesc排序ORDER BY age ASCUpdateWrapper// UPDATE user SET age 26, name 王五 WHERE id 1 LambdaUpdateWrapperUser wrapper new LambdaUpdateWrapperUser() .eq(User::getId, 1L) .set(User::getAge, 26) .set(User::getName, 王五); userMapper.update(null, wrapper);动态条件// condition 为 false 时该条件不会拼入 SQL LambdaQueryWrapperUser wrapper new LambdaQueryWrapperUser() .eq(StringUtils.isNotBlank(name), User::getName, name) .ge(age ! null, User::getAge, age);嵌套条件// WHERE name 张三 AND (age 20 OR email IS NOT NULL) LambdaQueryWrapperUser wrapper new LambdaQueryWrapperUser() .eq(User::getName, 张三) .and(w - w.eq(User::getAge, 20).or().isNotNull(User::getEmail));3. 分页查询配置插件Configuration public class MybatisPlusConfig { Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); interceptor.addInnerInterceptor( new PaginationInnerInterceptor(DbType.MYSQL) ); return interceptor; } }使用PageUser page new Page(1, 10); // 第1页每页10条 LambdaQueryWrapperUser wrapper new LambdaQueryWrapperUser() .like(StringUtils.isNotBlank(keyword), User::getName, keyword) .orderByDesc(User::getCreateTime); PageUser result userMapper.selectPage(page, wrapper); result.getRecords(); // 当前页数据 result.getTotal(); // 总记录数 result.getPages(); // 总页数联表分页// Mapper 接口 PageUserVO selectUserWithDept(PageUserVO page, Param(ew) LambdaQueryWrapperUser wrapper); // XML // SELECT u.*, d.name AS dept_name // FROM user u LEFT JOIN department d ON u.dept_id d.id // ${ew.customSqlSegment}4. IServiceIService 对 BaseMapper 的进一步封装提供批量操作和链式调用。public interface IUserService extends IServiceUser {} Service public class UserServiceImpl extends ServiceImplUserMapper, User implements IUserService {}常用方法// 增 userService.save(user); userService.saveBatch(userList); // 批量默认每批1000条 // 删 userService.removeById(1L); userService.removeByIds(ids); // 改 userService.updateById(user); userService.updateBatchById(userList); // 批量更新 // 查 userService.getById(1L); userService.list(queryWrapper); userService.count(queryWrapper);链式调用// 链式查询 userService.lambdaQuery() .eq(User::getAge, 25) .like(User::getName, 张) .list(); // 链式更新 userService.lambdaUpdate() .set(User::getAge, 30) .eq(User::getId, 1L) .update(); // 链式删除 userService.lambdaUpdate() .eq(User::getAge, 0) .remove();5. 自动填充实体标注TableField(fill FieldFill.INSERT) private LocalDateTime createTime; TableField(fill FieldFill.INSERT_UPDATE) private LocalDateTime updateTime;实现 HandlerComponent public class MyMetaObjectHandler implements MetaObjectHandler { Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, createTime, LocalDateTime::now, LocalDateTime.class); this.strictInsertFill(metaObject, updateTime, LocalDateTime::now, LocalDateTime.class); } Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, updateTime, LocalDateTime::now, LocalDateTime.class); } }四、常用注解速查注解位置说明TableName实体类指定表名TableId主键字段主键策略TableField普通字段映射、填充、非数据库字段TableLogic逻辑删除字段逻辑删除标识Version乐观锁字段配合乐观锁插件EnumValue枚举字段枚举值映射OrderBy字段默认排序IdType 主键策略策略说明AUTO数据库自增INPUT手动设置ASSIGN_ID雪花算法默认LongASSIGN_UUIDUUIDStringTableField 属性TableField(value email_addr) // 列名映射 TableField(exist false) // 非数据库字段 TableField(fill FieldFill.INSERT) // 自动填充 TableField(select false) // 查询不返回五、实用技巧1. 逻辑删除mybatis-plus: global-config: db-config: logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 0配置后所有 CRUD 自动适配deleteById→UPDATE SET deleted1selectList→ 自动追加WHERE deleted0。2. 乐观锁// 配置插件 interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); // 实体 Version private Integer version; // 使用先查后改version 自动 1 User user userMapper.selectById(1L); // version 1 user.setName(新名字); userMapper.updateById(user); // WHERE id1 AND version1 → version23. 防全表更新/删除interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor()); // 阻止无 WHERE 条件的 update/delete4. AR 模式ActiveRecordData TableName(user) public class User extends ModelUser { ... } // 无需注入 Mapper直接用实体操作 User user new User(); user.setName(张三); user.insert(); User found new User(); found.setId(1L); found found.selectById();速记继承 BaseMapper 得单表 CRUDWrapper 构造条件IService 加批量和链式调用分页插件配一行注解搞定映射和填充。

相关文章:

MyBatis-Plus详解(速成版)

一、介绍MyBatis-Plus: 1.概念 MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 MyBatis-Plus的官网简介:https://baomidou.com/introduce/ 2.特点: 无侵入&#xff…...

告别VS Code!用CLion 2024.3 + CUDA 12.1搭建高效GPU开发环境(附CMake配置避坑指南)

CLion 2024.3 CUDA 12.1:打造专业级GPU开发环境的终极指南 在GPU加速计算领域,开发者长期面临一个两难选择:是使用功能全面但笨重的Visual Studio,还是选择轻量灵活但功能有限的VS Code?JetBrains CLion 2024.3的出现…...

VSCode里Code Runner跑Python总报9009?别慌,检查一下你的setting.json文件

VSCode中Code Runner执行Python报错9009的终极排查指南 当你第一次在VSCode中用Code Runner插件运行Python脚本,满心期待看到输出结果时,终端却弹出"Process exited with code 9009"的红色错误提示——这种挫败感我深有体会。这个看似神秘的错…...

163MusicLyrics:免费解锁网易云QQ音乐歌词,告别本地音乐“哑巴“时代

163MusicLyrics:免费解锁网易云QQ音乐歌词,告别本地音乐"哑巴"时代 【免费下载链接】163MusicLyrics 云音乐歌词获取处理工具【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 还在为本地音乐播放…...

Pearcleaner:Mac应用彻底清理的终极解决方案,告别数字垃圾困扰

Pearcleaner:Mac应用彻底清理的终极解决方案,告别数字垃圾困扰 【免费下载链接】Pearcleaner A free, source-available and fair-code licensed mac app cleaner 项目地址: https://gitcode.com/gh_mirrors/pe/Pearcleaner 还在为Mac应用卸载后残…...

AutoSar网络管理(NM)与0x28通信控制服务:搞懂主从节点,精准控制子总线流量

AutoSar网络管理中0x28服务的拓扑控制艺术:主从架构与子总线流量精准调度 在车载电子系统日益复杂的今天,一条CAN总线上可能挂着十几个ECU节点,而网关则需要管理多条这样的总线。想象一下,当某个子总线上的节点需要软件更新时&…...

技术解密:如何从零构建开源贴片机的完整指南

技术解密:如何从零构建开源贴片机的完整指南 【免费下载链接】lumenpnp The LumenPnP is an open source pick and place machine. 项目地址: https://gitcode.com/gh_mirrors/lu/lumenpnp 在电子制造领域,贴片机一直是小型创客和硬件开发者难以企…...

mat-chem-sim-pred开发者指南:如何贡献新的科学计算算子

mat-chem-sim-pred开发者指南:如何贡献新的科学计算算子 【免费下载链接】mat-chem-sim-pred 面向工业领域,聚焦计算仿真、预测两大核心场景,构建面向流程工业"机理数据"双轮驱动的领域计算层,推动AI for Science在材料…...

AI大模型Agent面试,超详细(附答案)!

AI大模型Agent面试,超详细(➕答案)!假如你从2026年开始学大模型,按这个步骤走准能稳步进阶。 接下来告诉你一条最快的邪修路线, 3个月即可成为模型大师,薪资直接起飞。阶段1:大模型基础阶段2:RA…...

三步搞定Windows和Office永久激活:KMS_VL_ALL_AIO智能激活全攻略

三步搞定Windows和Office永久激活:KMS_VL_ALL_AIO智能激活全攻略 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统频繁弹出激活提示而烦恼吗?Office突然…...

终极AMD Ryzen调试指南:简单三步掌握硬件性能调优

终极AMD Ryzen调试指南:简单三步掌握硬件性能调优 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitcod…...

Slide离线阅读功能详解:随时随地浏览Reddit内容的完整教程

Slide离线阅读功能详解:随时随地浏览Reddit内容的完整教程 【免费下载链接】Slide Slide is an open-source, ad-free Reddit browser for Android. 项目地址: https://gitcode.com/gh_mirrors/sl/Slide 你是否经常在地铁、飞机或网络信号不佳的地方想要浏览…...

Unity 2D基础:Rigidbody2D刚体的运动控制

Unity 2D基础:Rigidbody2D刚体的运动控制📚 本章学习目标:深入理解Rigidbody2D刚体的运动控制的核心概念与实践方法,掌握关键技术要点,了解实际应用场景与最佳实践。本文属于《Unity工程师成长之路教程》Unity 2D基础篇…...

Docker容器化高可用架构部署方案(十二)

11-MySQL-MGR初始化 本文档详细介绍MySQL MGR(Group Replication)集群的初始化步骤。 初始化前提 三个MySQL容器已正常运行 MySQL容器healthcheck通过 网络连通性正常 初始化步骤 步骤1:等待MySQL容器就绪 # 查看MySQL容器状态 docke…...

openLCA 2.6.2 完整安装与使用指南:免费开源的生命周期评估解决方案

openLCA 2.6.2 完整安装与使用指南:免费开源的生命周期评估解决方案 【免费下载链接】olca-app Source code of openLCA 项目地址: https://gitcode.com/gh_mirrors/ol/olca-app openLCA 是一款功能强大的开源生命周期评估软件,专门用于产品从原材…...

终极指南:Visual C++运行库合集AIO - 一站式解决Windows软件依赖问题

终极指南:Visual C运行库合集AIO - 一站式解决Windows软件依赖问题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 还在为运行软件时遇到"找不到…...

Windows 11 LTSC微软商店安装终极指南:5分钟快速解决方案

Windows 11 LTSC微软商店安装终极指南:5分钟快速解决方案 【免费下载链接】LTSC-Add-MicrosoftStore Add Windows Store to Windows 11 24H2 LTSC 项目地址: https://gitcode.com/gh_mirrors/ltscad/LTSC-Add-MicrosoftStore Windows 11 LTSC版本以其卓越的稳…...

Qt C++ 集成 SQLite 实现本地数据持久化:从原理到宠物投喂器实战

1. 项目概述与核心需求解析最近在做一个宠物智能投喂器的数据管理后台,核心需求是把设备上传的各种运行数据持久化存储起来,方便后续分析和查看。设备会上传投喂间隔时间、水温、剩余重量这几个关键参数,我需要一个轻量、可靠且易于集成的本地…...

RISC-V SoC中TileLink互连验证IP的设计与实战应用

1. 项目概述:为什么RISC-V SoC需要一个专门的TileLink验证IP?如果你正在设计或验证一个基于RISC-V的片上系统(SoC),尤其是当它集成了多个处理器核心、加速器、DMA控制器和各种内存控制器时,那么“互连”这个…...

CANN/asc-devkit ClearBias接口文档

ClearBias 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode.com/…...

C51结构体内存分配限制与解决方案

1. C51结构体成员的内存空间限制解析在8051单片机开发中,C51编译器对结构体成员的内存分配有着严格限制。这个问题困扰过不少从标准C转向嵌入式开发的工程师。让我用一个实际案例来解释这个技术细节:struct sensor_data {float data temperature; // 试…...

2026届必备的五大AI写作网站实测分析

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 现如今人工智能内容生成技术被广泛运用,好多创作者依靠它迅速生成文章标题。然而…...

Avidemux:开源视频剪辑神器,5分钟学会专业级视频处理

Avidemux:开源视频剪辑神器,5分钟学会专业级视频处理 【免费下载链接】avidemux2 Avidemux2, simple video editor 项目地址: https://gitcode.com/gh_mirrors/avi/avidemux2 你知道吗?在开源视频编辑领域,有一款轻量级但功…...

从算法理想向工程现实的跨越:SLAM 核心架构、思维误区与 Nav2 实战避坑指南

前言:直面 SLAM 的“先有鸡还是先有蛋” 在机器人领域,SLAM(Simultaneous Localization and Mapping,同时定位与地图构建) 毫无疑问是最耀眼的明珠之一。简单来说,它的核心任务就是让一个机器人在未知环境中…...

极域电子教室防控制软件JiYuTrainer:重获学习自主权的智能解决方案

极域电子教室防控制软件JiYuTrainer:重获学习自主权的智能解决方案 【免费下载链接】JiYuTrainer 极域电子教室防控制软件, StudenMain.exe 破解 项目地址: https://gitcode.com/gh_mirrors/ji/JiYuTrainer 你是否曾在计算机课堂上被极域电子教室的全屏广播限…...

Multisim仿真避坑:手把手教你搞定MOS管共源放大电路的静态工作点(含参数扫描技巧)

Multisim实战:MOS管共源放大电路静态工作点优化全攻略 刚接触Multisim仿真的电子工程师常会遇到这样的困境:明明按照教科书步骤搭建了MOS管共源放大电路,仿真结果却与理论计算相差甚远。静态工作点(Q点)不是偏高就是偏…...

保姆级教程:用YOLOv5 v6.0训练自己的数据集(从环境配置到模型导出)

从零构建工业级YOLOv5 v6.0检测系统:环境配置到模型部署全流程实战 在工业质检、安防监控等场景中,快速构建高精度目标检测系统已成为工程师的核心竞争力。YOLOv5以其卓越的平衡性——兼顾速度与精度、完善的工程化支持,成为落地首选。本文将…...

告别编译报错!手把手教你为最新版Keil MDK安装ARM Compiler 5(保姆级图文)

嵌入式开发者的救星:彻底解决Keil MDK缺失ARM Compiler 5的终极方案 当你满怀信心地打开一个历史遗留的嵌入式项目,准备进行功能迭代时,Keil MDK突然弹出一个冰冷的错误窗口:"Error: Compiler V5.06 update 7 (build 960) no…...

告别繁琐配置!用EB和S32DS快速搭建AutoSar MCAL基础工程(附完整文件结构解析)

从零构建AutoSar MCAL工程:EB与S32DS高效协作实战指南 当第一次打开AutoSar MCAL的官方示例工程时,多数工程师都会被密密麻麻的文件夹和配置文件淹没。Base、Platform、ECUC、MemIf等模块交织在一起,而EB生成的generate文件夹里又充斥着大量看…...

告别AT指令恐惧:用STM32F407驱动SIM800C实现短信报警(附完整代码)

STM32F407与SIM800C实战:构建工业级短信报警系统的完整指南 在工业自动化、智能家居和远程监控领域,可靠的异常通知机制往往决定着系统响应速度与故障处理效率。传统有线报警方式受限于物理距离,而基于Wi-Fi的解决方案又面临网络覆盖的挑战。…...