SpringBootMyBatis-Plus 实现用户管理模块 CRUD 分页 条件查询电商系统实战代码可直接复制一、开篇引言*做 Java 后端项目尤其是电商管理系统用户管理模块是所有功能的基础也是新手入门的第一个核心模块。你是不是经常遇到这些问题1.写 CRUD 代码重复冗余每个接口都要写一遍查询、分页逻辑效率极低2.分页查询失效、条件拼接混乱前端传参后端无法正确解析3.代码不符合企业级规范耦合度高后期维护困难4.不知道如何结合 MyBatis-Plus 快速实现高性能的用户管理接口本文基于你正在做的前后端分离电商管理系统用 SpringBootMyBatis-Plus一步一步实现完整的用户管理模块包含增删改查、分页查询、多条件模糊搜索、参数校验、统一返回结果所有代码 100% 可直接复制到你的项目中15 分钟就能完成企业级用户管理接口开发。二、环境准备 / 前置知识**开发环境JDK 1.8SpringBoot 2.7.14MyBatis-Plus 3.5.3Maven 3.8.6MySQL 8.0所需依赖在pom.xml中添加核心依赖!--SpringBootWeb核心依赖--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!--MyBatis-Plus核心依赖--dependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.5.3/version/dependency!--MySQL驱动--dependencygroupIdcom.mysql/groupIdartifactIdmysql-connector-j/artifactIdscoperuntime/scope/dependency!--参数校验依赖--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-validation/artifactId/dependency!--Lombok简化代码--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependency项目结构com.example.demo ├── common │ ├──Result.java// 统一返回结果类之前已实现│ └──GlobalExceptionHandler.java// 全局异常处理器之前已实现├── controller │ └──UserController.java// 用户控制器├── entity │ └──User.java// 用户实体类├── mapper │ └──UserMapper.java// MyBatis-Plus Mapper接口├── service │ ├──UserService.java// 用户Service接口│ └── impl │ └──UserServiceImpl.java// 用户Service实现类└──DemoApplication.java// 启动类数据库表结构创建电商系统用户表userCREATETABLEuser(id bigintNOTNULLAUTO_INCREMENTCOMMENT用户ID,usernamevarchar(50)NOTNULLCOMMENT用户名,passwordvarchar(100)NOTNULLCOMMENT密码,nicknamevarchar(50)DEFAULTNULLCOMMENT昵称,emailvarchar(100)DEFAULTNULLCOMMENT邮箱,phonevarchar(20)DEFAULTNULLCOMMENT手机号,avatarvarchar(255)DEFAULTNULLCOMMENT头像,status tinyintNOTNULLDEFAULT1COMMENT状态0-禁用1-正常,create_time datetimeDEFAULTCURRENT_TIMESTAMPCOMMENT创建时间,update_time datetimeDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT更新时间,deleted tinyintNOTNULLDEFAULT0COMMENT逻辑删除0-未删除1-已删除,PRIMARYKEY(id),UNIQUEKEYuk_username(username))ENGINEInnoDBDEFAULTCHARSETutf8mb4COMMENT用户表;三、核心实现严格拆分「核心知识点」「代码实操」3.1 核心知识点先讲原理再给代码MyBatis-Plus 核心优势内置通用 CRUD 方法无需编写 XML直接继承BaseMapper即可使用内置分页插件一行代码实现分页查询无需手动编写分页 SQL支持条件构造器QueryWrapper灵活实现多条件模糊查询、排序等支持逻辑删除、自动填充等企业级功能符合电商系统开发规范用户管理模块核心功能设计新增用户参数校验、用户名唯一性校验、密码加密后续可集成 BCrypt删除用户逻辑删除避免物理删除数据符合数据安全规范更新用户支持部分字段更新自动填充更新时间查询用户根据 ID 查询、分页多条件查询支持用户名、手机号模糊搜索统一返回结果所有接口遵循统一返回格式前端无需适配多套逻辑分页查询原理MyBatis-Plus 分页插件基于Page对象自动拦截 SQL 并添加分页语句支持自定义分页参数当前页、每页条数自动返回总条数、总页数结合QueryWrapper实现条件分页灵活适配前端搜索需求3.2 代码实操完整可运行代码带注释分步骤步骤 1创建用户实体类User.javapackagecom.example.demo.entity;importcom.baomidou.mybatisplus.annotation.*;importlombok.Data;importjavax.validation.constraints.NotBlank;importjavax.validation.constraints.Size;importjava.time.LocalDateTime;/** * 用户实体类 * 对应数据库user表 */DataTableName(user)// 指定表名publicclassUser{TableId(typeIdType.AUTO)// 主键自增privateLongid;NotBlank(message用户名不能为空)Size(min3,max20,message用户名长度必须在3-20之间)privateStringusername;NotBlank(message密码不能为空)Size(min6,max20,message密码长度必须在6-20之间)privateStringpassword;privateStringnickname;privateStringemail;Size(min11,max11,message手机号必须为11位)privateStringphone;privateStringavatar;privateIntegerstatus;// 0-禁用1-正常TableField(fillFieldFill.INSERT)// 插入时自动填充privateLocalDateTimecreateTime;TableField(fillFieldFill.INSERT_UPDATE)// 插入/更新时自动填充privateLocalDateTimeupdateTime;TableLogic// 逻辑删除标记privateIntegerdeleted;}步骤 2创建 Mapper 接口UserMapper.javapackagecom.example.demo.mapper;importcom.baomidou.mybatisplus.core.mapper.BaseMapper;importcom.example.demo.entity.User;importorg.apache.ibatis.annotations.Mapper;/** * 用户Mapper接口 * 继承BaseMapper获得通用CRUD方法 */MapperpublicinterfaceUserMapperextendsBaseMapperUser{}步骤 3配置 MyBatis-Plus 分页插件创建配置类MyBatisPlusConfig.javapackagecom.example.demo.config;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;/** * MyBatis-Plus配置类 * 开启分页插件 */ConfigurationpublicclassMyBatisPlusConfig{/** * 配置MyBatis-Plus拦截器 */BeanpublicMybatisPlusInterceptormybatisPlusInterceptor(){MybatisPlusInterceptorinterceptornewMybatisPlusInterceptor();// 添加分页拦截器指定数据库类型为MySQLinterceptor.addInnerInterceptor(newPaginationInnerInterceptor(DbType.MYSQL));returninterceptor;}}步骤 4创建 Service 接口与实现类Service 接口UserService.javapackagecom.example.demo.service;importcom.baomidou.mybatisplus.extension.service.IService;importcom.example.demo.entity.User;publicinterfaceUserServiceextendsIServiceUser{}Service 实现类UserServiceImpl.javapackagecom.example.demo.service.impl;importcom.baomidou.mybatisplus.extension.service.impl.ServiceImpl;importcom.example.demo.entity.User;importcom.example.demo.mapper.UserMapper;importcom.example.demo.service.UserService;importorg.springframework.stereotype.Service;ServicepublicclassUserServiceImplextendsServiceImplUserMapper,UserimplementsUserService{}步骤 5创建 Controller 控制器UserController.java核心接口packagecom.example.demo.controller;importcom.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;importcom.baomidou.mybatisplus.extension.plugins.pagination.Page;importcom.example.demo.common.Result;importcom.example.demo.entity.User;importcom.example.demo.service.UserService;importorg.springframework.validation.annotation.Validated;importorg.springframework.web.bind.annotation.*;importjavax.annotation.Resource;importjavax.validation.constraints.NotNull;/** * 用户管理控制器 * 实现用户CRUD、分页查询、条件搜索 */RestControllerRequestMapping(/user)ValidatedpublicclassUserController{ResourceprivateUserServiceuserService;/** * 分页多条件查询用户 * param current 当前页默认1 * param size 每页条数默认10 * param username 用户名模糊搜索 * param phone 手机号模糊搜索 * return 分页结果 */GetMapping(/page)publicResultPageUserpageUser(RequestParam(defaultValue1)Integercurrent,RequestParam(defaultValue10)Integersize,RequestParam(requiredfalse)Stringusername,RequestParam(requiredfalse)Stringphone){// 1. 创建分页对象PageUserpagenewPage(current,size);// 2. 构建条件查询WrapperLambdaQueryWrapperUserwrappernewLambdaQueryWrapper();// 用户名模糊查询if(username!null!username.isEmpty()){wrapper.like(User::getUsername,username);}// 手机号模糊查询if(phone!null!phone.isEmpty()){wrapper.like(User::getPhone,phone);}// 按创建时间倒序排序最新用户排在前面wrapper.orderByDesc(User::getCreateTime);// 3. 执行分页查询PageUseruserPageuserService.page(page,wrapper);returnResult.success(userPage);}/** * 根据ID查询用户详情 * param id 用户ID * return 用户信息 */GetMapping(/{id})publicResultUsergetUserById(PathVariableNotNull(message用户ID不能为空)Longid){UseruseruserService.getById(id);returnResult.success(user);}/** * 新增用户 * param user 用户信息 * return 操作结果 */PostMappingpublicResult?addUser(RequestBodyValidatedUseruser){// 校验用户名是否已存在LambdaQueryWrapperUserwrappernewLambdaQueryWrapper();wrapper.eq(User::getUsername,user.getUsername());UserexistUseruserService.getOne(wrapper);if(existUser!null){returnResult.fail(用户名已存在);}// 保存用户后续可在此处添加BCrypt密码加密booleansaveuserService.save(user);if(save){returnResult.success(用户添加成功);}else{returnResult.fail(用户添加失败);}}/** * 更新用户信息 * param user 用户信息 * return 操作结果 */PutMappingpublicResult?updateUser(RequestBodyValidatedUseruser){// 校验用户ID是否存在if(user.getId()null){returnResult.fail(用户ID不能为空);}// 更新用户booleanupdateuserService.updateById(user);if(update){returnResult.success(用户更新成功);}else{returnResult.fail(用户更新失败);}}/** * 逻辑删除用户 * param id 用户ID * return 操作结果 */DeleteMapping(/{id})publicResult?deleteUser(PathVariableNotNull(message用户ID不能为空)Longid){// 逻辑删除自动更新deleted字段为1booleanremoveuserService.removeById(id);if(remove){returnResult.success(用户删除成功);}else{returnResult.fail(用户删除失败);}}}**四、效果演示接口测试**分页 条件查询接口请求GET /user/page?current1size10username张phone138返回{code:200,msg:操作成功,data:{records:[{id:1,username:zhangsan,password:123456,nickname:张三,email:zhangsanexample.com,phone:13800138000,avatar:null,status:1,createTime:2026-04-08T10:00:00,updateTime:2026-04-08T10:00:00,deleted:0}],total:1,size:10,current:1,pages:1}}2. 新增用户接口请求POST /user请求体{username:lisi,password:123456,nickname:李四,email:lisiexample.com,phone:13900139000}返回{code:200,msg:操作成功,data:用户添加成功}3. 删除用户接口请求DELETE /user/1返回{ code: 200, msg: 操作成功, data: 用户删除成功 }五、踩坑总结 / 常见问题收藏率核心**坑 1**MyBatis-Plus 分页查询不生效total 始终为 0原因没有配置分页插件MyBatis-Plus 不会自动拦截 SQL 进行分页解决方案添加MyBatisPlusConfig配置类注入MybatisPlusInterceptor并添加PaginationInnerInterceptor补充高版本 MyBatis-Plus3.4.0不再使用旧版PaginationInterceptor必须使用新的拦截器配置坑 2逻辑删除后查询仍然能查到已删除数据原因实体类deleted字段没有添加TableLogic注解或者数据库字段类型不是tinyint解决方案给deleted字段添加TableLogic确保数据库字段为tinyint(1)默认值为 0补充可在application.yml中配置全局逻辑删除规则统一字段名和值坑 3新增 / 更新时create_time/update_time 自动填充不生效原因实体类字段没有添加TableField(fill FieldFill.INSERT)等注解或者没有实现元对象处理器解决方案给createTime添加TableField(fill FieldFill.INSERT)给updateTime添加TableField(fill FieldFill.INSERT_UPDATE)实现MetaObjectHandler接口配置自动填充逻辑可选本文用数据库默认值实现坑 4条件查询 like 模糊搜索失效原因使用了eq精确匹配而不是like模糊匹配或者参数为空时没有做非空判断解决方案使用LambdaQueryWrapper.like()方法并且在拼接条件前判断参数是否为空避免拼接无效条件坑 5用户名唯一性校验不生效原因没有在新增用户时查询数据库或者数据库没有给username字段加唯一索引解决方案新增用户前先查询用户名是否存在同时给数据库username字段添加唯一索引双重保障六、总结与延伸本文基于 SpringBootMyBatis-Plus完整实现了电商管理系统的用户管理模块包含增删改查、分页查询、多条件搜索、参数校验、统一返回结果完全符合企业级开发规范代码可直接复制到你的项目中使用。通过本文的实现你可以快速搭建用户管理模块作为电商系统的基础功能掌握 MyBatis-Plus 的核心用法后续可快速实现商品、订单等其他模块学习企业级后端接口开发规范提升代码可维护性为后续集成 JWT 登录、权限控制打下基础本文是电商管理系统实战系列的第 1 篇下一篇将讲解 SpringBoot 集成 JWT 实现登录认证与权限控制感兴趣的同学可以关注我持续更新 Java 后端实战内容。建议在项目初期就搭建好用户管理模块后续所有功能都基于用户体系扩展避免后期重构。七、互动引导提升评论率 粉丝转化有任何关于代码实现、环境配置、项目优化的问题欢迎在评论区留言我会逐一解答觉得有用的同学点赞 收藏不迷路后续更新更多 Java 后端学习、项目实战、面试技巧关注我持续分享 Java 后端干货陪你从大二到秋招拿 offer