MyBatis-Plus指南:从入门到面试
Hello大家好我是Yize在学习SpringCloud时学习到了MyBatis-plus下面就跟我一起来学习吧目录一、先搞清楚MyBatis-Plus 是什么二、⭐ MyBatis vs MyBatis-Plus 核心对比表面试默写级三、MP 解决了 MyBatis 的哪些痛点四、快速入门三步走1️⃣ 引入依赖2️⃣ 配置文件application.yml3️⃣ 启动类加扫描五、实体类常用注解六、核心功能一通用 CRUDBaseMapper⭐七、核心功能二条件构造器 WrapperMP 的灵魂⭐常用条件方法速查示例LambdaQueryWrapper推荐示例LambdaUpdateWrapper八、核心功能三分页插件 ⭐1️⃣ 配置分页插件必须注册2️⃣ 使用分页九、核心功能四Service 层封装IService十、企业级高阶功能十一、⚠️ 什么时候用 / 什么时候手写 SQL十二、常见误区澄清面试加分 ❓十三、一句话复习提纲 面试高频考点 MyBatis-Plus 知识点总结对比 MyBatis一、先搞清楚MyBatis-Plus 是什么MyBatis-Plus简称 MP是 MyBatis 的增强工具只做增强、不做改变为简化开发、提高效率而生。核心定位它不是 MyBatis 的替代品底层依旧依赖 MyBatis 执行 SQL引入后原有 MyBatis 的 XML、Mapper 接口完全不用改平滑兼容愿景是成为 MyBatis 的最佳搭档像魂斗罗 1P、2P效率翻倍一句话记忆 MP 是 MyBatis 的自动挡升级版——基础的 CRUD 不用写 SQL但复杂场景仍可切回手动挡手写 XML二、⭐ MyBatis vs MyBatis-Plus 核心对比表面试默写级对比维度MyBatisMyBatis-Plus定位基础持久层框架MyBatis 的增强工具单表 CRUD每张表手写 XML/注解 SQL重复代码多BaseMapper内置零 SQL条件/动态查询手写 XMLif动态标签拼接Wrapper 条件构造器Java 链式调用分页手动写LIMIT或借助 PageHelper内置分页插件开箱即用主键策略依赖数据库自增自增、雪花算法、UUID 等多种逻辑删除手动加标记、改 SQLTableLogic注解自动软删自动填充时间自己封装工具赋值TableField(fill)MetaObjectHandlerLambda 查询不支持只能写字段字符串LambdaQueryWrapper编译期校验防写错代码生成无需第三方工具内置代码生成器一键生成全套代码量大、模板冗余少、告别重复代码灵活性极高完全可控单表强复杂多表仍可手写 XML三、MP 解决了 MyBatis 的哪些痛点单表 CRUD 样板代码多 →BaseMapper内置继承即用动态条件拼接易出错 → Wrapper 链式调用参数化防 SQL 注入分页、逻辑删除、时间戳、乐观锁等通用能力无内置 → 插件/注解开箱即用实体与字段映射、多条件查询冗余 → 约定优于配置四、快速入门三步走1️⃣ 引入依赖dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.9/version /dependency2️⃣ 配置文件application.ymlmybatis-plus: mapper-locations: classpath*:/mapper/**/*.xml type-aliases-package: com.example.entity global-config: db-config: id-type: auto # 主键策略自增 logic-delete-field: deleted # 逻辑删除字段 logic-delete-value: 1 logic-not-delete-value: 0 configuration: map-underscore-to-camel-case: true # 驼峰映射 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印SQL3️⃣ 启动类加扫描SpringBootApplication MapperScan(com.example.mapper) // 扫描 Mapper public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }五、实体类常用注解Data TableName(user) // 指定表名 public class User { TableId(type IdType.AUTO) // 主键策略自增 private Long id; TableField(user_name) // 字段映射 private String name; TableField(select false) // 查询时不返回该字段 private String password; TableField(fill FieldFill.INSERT) // 插入时自动填充 private Date createTime; TableField(fill FieldFill.INSERT_UPDATE) // 插入/更新填充 private Date updateTime; TableLogic // 逻辑删除 TableField(deleted) private Integer deleted; Version // 乐观锁版本号 private Integer version; }主键策略IdType策略说明AUTO数据库自增ASSIGN_ID雪花算法默认ASSIGN_UUIDUUIDINPUT手动输入六、核心功能一通用 CRUDBaseMapper⭐Mapper 接口只需继承BaseMapper就自动拥有单表 CRUD 方法零 SQLMapper public interface UserMapper extends BaseMapperUser { // 无需编写任何方法已内置 // insert / deleteById / delete(Wrapper) // updateById / update(entity, Wrapper) // selectById / selectBatchIds / selectByMap // selectOne / selectCount / selectList / selectPage }使用示例Autowired private UserMapper userMapper; userMapper.insert(user); // 新增 userMapper.selectById(1L); // 按ID查询 userMapper.selectList(wrapper); // 按条件查询 userMapper.updateById(user); // 按ID更新 userMapper.deleteById(1L); // 删除逻辑删除则自动改SQL七、核心功能二条件构造器 WrapperMP 的灵魂⭐解决动态 SQL 拼接繁琐问题链式调用、参数化防注入、Lambda 版本编译期校验字段。四大构造器企业首选 Lambda 版本QueryWrapper查询/删除字段写字符串硬编码不推荐LambdaQueryWrapper查询/删除Lambda 方法引用✅ 推荐UpdateWrapper更新条件字符串LambdaUpdateWrapper更新条件Lambda✅ 推荐常用条件方法速查方法含义示例eqeq(name, 张三)ne≠ne(age, 18)gt/ge / ≥gt(age, 18)lt/le / ≤le(age, 60)between区间between(age, 18, 30)like%值%like(name, 李)likeRight值%likeRight(phone, 138)isNull/isNotNull空判断isNull(email)in/notIn集合in(dept_id, list)orderByAsc/Desc排序orderByDesc(age)groupBy分组groupBy(age)示例LambdaQueryWrapper推荐// 查询年龄18 且 城市武汉 的用户 LambdaQueryWrapperUser wrapper Wrappers.lambdaQuery(); wrapper.gt(User::getAge, 18) .eq(User::getCity, 武汉) .orderByDesc(User::getAge); ListUser userList userMapper.selectList(wrapper);示例LambdaUpdateWrapper// 把张三的年龄改为20 LambdaUpdateWrapperUser wrapper Wrappers.lambdaUpdate(); wrapper.eq(User::getName, 张三) .set(User::getAge, 20); userMapper.update(null, wrapper);vs MyBatis 同样需求在 MyBatis 要手写 XMLif动态标签MP 用 Java 链式一行搞定且防 SQL 注入。八、核心功能三分页插件 ⭐1️⃣ 配置分页插件必须注册Configuration public class MyBatisPlusConfig { Bean public MybatisPlusInterceptor mpInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }2️⃣ 使用分页// 查询第1页每页10条 PageUser page new Page(1, 10); LambdaQueryWrapperUser wrapper Wrappers.lambdaQuery(); wrapper.gt(User::getAge, 18); PageUser result userMapper.selectPage(page, wrapper); // result.getRecords() 数据列表 // result.getTotal() 总记录数 // result.getCurrent() 当前页vs MyBatis 不用手写LIMIT插件自动拦截改写 SQL 并查总数纯物理分页。九、核心功能四Service 层封装IServiceMP 提供IServiceServiceImpl做业务层二次封装新增批量操作、链式查询// Service 接口 public interface UserService extends IServiceUser {} // 实现类 Service public class UserServiceImpl extends ServiceImplUserMapper, User implements UserService {}IService 增强能力批量、语义化userService.saveBatch(userList); // 批量新增 userService.updateBatchById(userList);// 批量更新 userService.listByIds(idList); // 按主键批量查询 userService.removeByIds(idList); // 按主键批量删除 userService.lambdaQuery() // 链式查询 .eq(User::getAge, 18) .list();BaseMapper vs IService 区别BaseMapperIService层级DAO/Mapper 层Service 层特点底层原生操作批量、链式、语义化使用简单单条/自定义项目标准分层十、企业级高阶功能功能用法自动填充TableField(fill) 实现MetaObjectHandler自动注入 createTime/updateTime逻辑删除TableLogicdelete 自动改写为 update乐观锁Version 注册乐观锁拦截器防并发覆盖防全表操作全局拦截插件阻断无条件的全表 delete/update代码生成器根据表结构一键生成 Entity/Mapper/Service/Controller多租户TenantLineInnerInterceptor自动追加 tenant_id十一、⚠️ 什么时候用 / 什么时候手写 SQL✅ 优先用 MP后台管理系统、CRUD 为主单表增删改查、简单条件查询需要统一规范自动填充、逻辑删除、乐观锁✅ 必须用原生 MyBatis手写 XML多表联查、复杂统计、子查询大数据量复杂报表、分组聚合需要 DBA 深度优化 SQL 的核心业务支付、对账企业最佳实践MP 做单表快速开发 原生 XML 做复杂 SQL两者混合使用互不冲突。十二、常见误区澄清面试加分 ❓❌ MP 可以完全替代 MyBatis ✅ 错MP 只是增强底层仍依赖 MyBatis❌ 用 MP 就不能写 XML SQL ✅ 错完全可混用自定义方法 XML 共存❌ MP 会降低性能 ✅ 错只是代码封装最终生成标准 SQL性能一致❌ MP 只能做简单 CRUD ✅ 错支持条件、分页、分组、批量等十三、一句话复习提纲 MP 是 MyBatis 的增强搭档只增强不改动。 靠BaseMapper实现单表零 SQL 的 CRUD靠Wrapper推荐 Lambda 版链式构造条件靠分页插件自动拦截分页配合自动填充、逻辑删除、乐观锁、代码生成器等企业级能力大幅提升效率。单表用 MP多表联查退回原生 XML。 面试高频考点MyBatis 与 MP 的区别增强 vs 替代、CRUD、Wrapper、分页MP 的核心定位只做增强不做改变兼容原生BaseMapper内置方法Wrapper条件构造器优先 Lambda 版防字段写错分页插件配置与使用自动填充 / 逻辑删除 / 乐观锁的注解与配置MP 与原生 MyBatis 的选型单表 MP多表手写 SQL好啦本次的分享到此结束我们下次见