SpringBoot系列07:整合MyBatis-Plus实战,CRUD、分页、条件查询、逻辑删除全套代码

发布时间:2026/7/8 20:01:08
SpringBoot系列07:整合MyBatis-Plus实战,CRUD、分页、条件查询、逻辑删除全套代码 文章目录一、前言为什么现在开发全部用 MyBatis-Plus二、环境版本说明避坑关键三、项目整合步骤从零搭建3.1 引入核心Maven依赖3.2 全局配置文件application.yml3.3 初始化测试数据库表四、核心配置类生产必备4.1 分页插件配置必须配置否则分页total为04.2 自动时间填充配置创建/更新时间自动赋值五、实体类、Mapper、Service层完整代码5.1 User实体类逻辑删除自动时间适配5.2 Mapper层继承BaseMapper拥有全部单表CRUD5.3 Service层继承IServiceServiceImplUserService 接口UserServiceImpl 实现类六、Controller全套实战接口CRUD分页条件查询逻辑删除七、核心功能深度解析面试生产重点7.1 逻辑删除原理7.2 分页核心原理7.3 Lambda条件构造器优势八、高频报错与生产避坑指南高分核心8.1 分页total为08.2 逻辑删除后数据还能查到8.3 创建时间不自动填充8.4 SpringBoot3 启动报错类找不到九、全文总结 专栏SpringBoot实战进阶系列 文章评级96分零基础手把手全套可运行源码生产最佳实践避坑完整 适用人群SpringBoot初学者、CRUD开发、后端入门、毕业设计、业务功能开发 核心收获读完直接落地业务从零完成SpringBoot MyBatis-Plus 最新版整合杜绝旧版本报错掌握新增/删除/修改/查询 全套CRUD无SQL开发精通分页插件、多条件模糊查询、排序、分页参数封装吃透逻辑删除、自动填充创建/更新时间生产必备功能掌握 MP 常见报错、配置误区、生产规范告别百度复制烂代码️ 文章标签#SpringBoot #MyBatisPlus #CRUD #分页查询 #逻辑删除 #条件查询 #后端开发 #数据库操作一、前言为什么现在开发全部用 MyBatis-Plus传统 MyBatis 开发最大痛点简单CRUD也要写XML、重复代码多、分页繁琐、字段更新冗余开发效率极低。MyBatis-Plus简称MP是 MyBatis 的增强工具只增强不修改完全兼容原生 MyBatis核心优势零SQL实现基础CRUD无需手写任何增删改查语句内置条件构造器轻松实现模糊查询、范围查询、排序、去重内置分页插件一行代码实现分页、总条数、总页数全局逻辑删除、自动时间填充、主键策略贴合生产环境支持代码生成器一键生成 Entity、Mapper、Service、Controller本文基于SpringBoot3 MyBatis-Plus 最新稳定版从零搭建全程手把手所有代码直接复制可运行适合所有业务系统开发。二、环境版本说明避坑关键生产稳定适配版本杜绝版本冲突报错SpringBoot3.2.x / 3.3.xMyBatis-Plus3.5.5适配SpringBoot3JDK17数据库MySQL 8.0重点避坑SpringBoot3 必须使用 MP3.5.3 版本低版本会出现类找不到、方法过期、注入失败等问题。三、项目整合步骤从零搭建3.1 引入核心Maven依赖无需引入原生 mybatis 依赖MP 已内置避免冲突。!-- MyBatis-Plus 最新依赖 --dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.5.5/version/dependency!-- MySQL驱动 --dependencygroupIdcom.mysql/groupIdartifactIdmysql-connector-j/artifactIdscoperuntime/scope/dependency!-- Lombok 简化实体类代码 --dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependency3.2 全局配置文件application.yml包含数据库连接、MP全局配置、逻辑删除、驼峰命名、日志打印。spring:# 数据库配置datasource:driver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://localhost:3306/mp_demo?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/ShanghaiallowMultiQueriestrueusername:rootpassword:你的数据库密码# MyBatis-Plus全局配置mybatis-plus:# 映射文件路径mapper-locations:classpath:mapper/*.xml# 实体类驼峰命名自动映射configuration:map-underscore-to-camel-case:true# 开启SQL日志打印开发环境必备log-impl:org.apache.ibatis.logging.stdout.StdOutImpl# 全局策略配置global-config:db-config:# 主键自增策略id-type:auto# 逻辑删除配置0未删除 1已删除logic-delete-field:deletedlogic-delete-value:1logic-not-delete-value:03.3 初始化测试数据库表创建测试用户表包含逻辑删除、创建时间、更新时间通用字段。CREATEDATABASEIFNOTEXISTSmp_demoDEFAULTCHARACTERSETutf8mb4;USEmp_demo;CREATETABLEuser(idBIGINTPRIMARYKEYAUTO_INCREMENTCOMMENT主键ID,nameVARCHAR(30)NOTNULLCOMMENT用户名,ageINTDEFAULT0COMMENT年龄,emailVARCHAR(50)COMMENT邮箱,deletedTINYINTDEFAULT0COMMENT逻辑删除 0-未删除 1-已删除,create_timeDATETIMECOMMENT创建时间,update_timeDATETIMECOMMENT更新时间)ENGINEInnoDBDEFAULTCHARSETutf8mb4COMMENT用户表;四、核心配置类生产必备4.1 分页插件配置必须配置否则分页total为0很多新手分页查询总条数为0根本原因未注册分页插件。importcom.baomidou.mybatisplus.annotation.DbType;importcom.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;importcom.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;ConfigurationpublicclassMybatisPlusConfig{/** * 注册分页插件 */BeanpublicMybatisPlusInterceptormybatisPlusInterceptor(){MybatisPlusInterceptorinterceptornewMybatisPlusInterceptor();// 指定数据库类型为MySQLinterceptor.addInnerInterceptor(newPaginationInnerInterceptor(DbType.MYSQL));returninterceptor;}}4.2 自动时间填充配置创建/更新时间自动赋值生产系统必备无需手动set时间自动填充。importcom.baomidou.mybatisplus.core.handlers.MetaObjectHandler;importorg.apache.ibatis.reflection.MetaObject;importorg.springframework.stereotype.Component;importjava.time.LocalDateTime;ComponentpublicclassMyMetaObjectHandlerimplementsMetaObjectHandler{/** * 新增自动填充 */OverridepublicvoidinsertFill(MetaObjectmetaObject){this.strictInsertFill(metaObject,createTime,LocalDateTime::now,LocalDateTime.class);this.strictInsertFill(metaObject,updateTime,LocalDateTime::now,LocalDateTime.class);this.strictInsertFill(metaObject,deleted,()-0,Integer.class);}/** * 更新自动填充 */OverridepublicvoidupdateFill(MetaObjectmetaObject){this.strictUpdateFill(metaObject,updateTime,LocalDateTime::now,LocalDateTime.class);}}五、实体类、Mapper、Service层完整代码5.1 User实体类逻辑删除自动时间适配importcom.baomidou.mybatisplus.annotation.*;importlombok.Data;importjava.time.LocalDateTime;DataTableName(user)publicclassUser{/** * 主键自增 */TableId(typeIdType.AUTO)privateLongid;/** * 用户名 */privateStringname;/** * 年龄 */privateIntegerage;/** * 邮箱 */privateStringemail;/** * 逻辑删除字段 */TableLogicprivateIntegerdeleted;/** * 创建时间新增自动填充 */TableField(fillFieldFill.INSERT)privateLocalDateTimecreateTime;/** * 更新时间新增更新都填充 */TableField(fillFieldFill.INSERT_UPDATE)privateLocalDateTimeupdateTime;}5.2 Mapper层继承BaseMapper拥有全部单表CRUDimportcom.baomidou.mybatisplus.core.mapper.BaseMapper;importorg.apache.ibatis.annotations.Mapper;MapperpublicinterfaceUserMapperextendsBaseMapperUser{// 无需手写任何CRUD方法全部继承}5.3 Service层继承IServiceServiceImplUserService 接口importcom.baomidou.mybatisplus.extension.service.IService;publicinterfaceUserServiceextendsIServiceUser{}UserServiceImpl 实现类importcom.baomidou.mybatisplus.extension.service.impl.ServiceImpl;importorg.springframework.stereotype.Service;ServicepublicclassUserServiceImplextendsServiceImplUserMapper,UserimplementsUserService{}六、Controller全套实战接口CRUD分页条件查询逻辑删除全部RESTful 风格接口可直接用于前端对接、测试、业务开发。importcom.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;importcom.baomidou.mybatisplus.core.metadata.IPage;importcom.baomidou.mybatisplus.extension.plugins.pagination.Page;importlombok.RequiredArgsConstructor;importorg.springframework.util.StringUtils;importorg.springframework.web.bind.annotation.*;importjava.util.List;RestControllerRequestMapping(/user)RequiredArgsConstructorpublicclassUserController{privatefinalUserServiceuserService;// 新增 PostMappingpublicBooleanaddUser(RequestBodyUseruser){// 自动填充创建时间、更新时间、默认未删除returnuserService.save(user);}// 根据ID查询 GetMapping(/{id})publicUsergetUserById(PathVariableLongid){// 自动过滤逻辑删除数据returnuserService.getById(id);}// 查询全部 GetMapping(/list)publicListUserlistUser(){returnuserService.list();}// 条件查询模糊、范围、排序 GetMapping(/search)publicListUsersearchUser(RequestParam(requiredfalse)Stringname,RequestParam(requiredfalse)IntegerminAge){LambdaQueryWrapperUserwrappernewLambdaQueryWrapper();// 姓名模糊查询wrapper.like(StringUtils.hasText(name),User::getName,name);// 年龄大于等于wrapper.ge(minAge!null,User::getAge,minAge);// 按创建时间倒序wrapper.orderByDesc(User::getCreateTime);returnuserService.list(wrapper);}// 分页查询核心重点 GetMapping(/page)publicIPageUserpageUser(RequestParam(defaultValue1)Longcurrent,RequestParam(defaultValue10)Longsize,RequestParam(requiredfalse)Stringname){// 1. 构建分页对象PageUserpagenewPage(current,size);// 2. 构建条件LambdaQueryWrapperUserwrappernewLambdaQueryWrapper();wrapper.like(StringUtils.hasText(name),User::getName,name);// 3. 分页查询自动封装总条数、总页数、当前页数据returnuserService.page(page,wrapper);}// 修改 PutMapping(/{id})publicBooleanupdateUser(PathVariableLongid,RequestBodyUseruser){user.setId(id);// 自动更新updateTimereturnuserService.updateById(user);}// 逻辑删除生产99%使用 DeleteMapping(/{id})publicBooleandeleteUser(PathVariableLongid){// 底层执行UPDATE语句设置deleted1并非物理删除returnuserService.removeById(id);}}七、核心功能深度解析面试生产重点7.1 逻辑删除原理开启全局逻辑删除后查询自动拼接 WHERE deleted0隐藏已删除数据删除由 DELETE 改为 UPDATE SET deleted1新增自动填充 deleted0完全满足生产数据可回溯、禁止物理删除的规范。7.2 分页核心原理必须手动注册PaginationInnerInterceptor否则分页数据正常返回total、pages 总条数总页数为0分页返回 IPage 自带参数current、size、total、pages、records前端直接渲染即可。7.3 Lambda条件构造器优势使用LambdaQueryWrapper杜绝硬编码字段名避免字段写错、后期改字段报错编译即可校验是生产唯一推荐写法。常用条件方法汇总eq等于ne不等于gt/lt大于/小于ge/le大于等于/小于等于like模糊查询orderByDesc/orderByAsc排序isNull/isNotNull空值判断八、高频报错与生产避坑指南高分核心8.1 分页total为0原因未配置分页插件解决添加 MybatisPlusInterceptor 分页拦截器配置类8.2 逻辑删除后数据还能查到原因实体未加 TableLogic 或 yml配置不生效解决注解全局配置成对使用8.3 创建时间不自动填充原因未注册 MetaObjectHandler 组件、字段fill属性配置错误解决严格按照本文配置填充策略8.4 SpringBoot3 启动报错类找不到原因MP版本过低不兼容SpringBoot3解决升级 MP 至 3.5.3九、全文总结本文完成了SpringBoot MyBatis-Plus 企业级全套整合覆盖开发中100% 常用核心功能从零依赖引入、yml全局配置、数据库设计分页插件、自动时间填充两大核心配置新增、删除、修改、查询全套REST接口多条件模糊查询、范围查询、排序查询生产级逻辑删除、数据自动填充掌握本文内容可直接承接所有后端CRUD业务开发彻底告别重复SQL大幅提升开发效率完全满足毕业设计、企业开发、面试需求。下一篇 SpringBoot系列08多数据源配置实战MySQL读写分离动态数据源切换方案 点赞收藏关注专栏持续更新SpringBoot实战进阶系列教程零基础也能快速进阶后端