前言应届生入职Java后端第一个被分配的任务90%都是“写CRUD”——但同样是写CRUD有人写的代码杂乱无章、漏洞百出有人写的规范简洁、适配企业标准这就是“能不能快速立足”的关键更重要的是Spring Boot 3.3 MyBatis-Plus 3.5 已是2026年企业应届生入职的“标配技术栈”阿里、腾讯等大厂及中小企业几乎所有Java项目都在使用这套组合开发CRUD接口。不懂这套最新整合用法不仅入职上手慢面试也会被直接问倒本文专为应届生量身打造全程聚焦“入职必写的CRUD”摒弃复杂进阶内容详细讲解Spring Boot 3.3 整合MyBatis-Plus 3.5 的最新用法、分页优化、条件查询每一步都附可复制规范代码拆解应届生常踩的坑补充面试高频提问帮你快速写出符合企业规范的CRUD轻松加分入职不慌 核心亮点① 应届生友好避开复杂原理只讲入职必用操作新手能直接跟着实操② 规范为王所有代码贴合企业开发规范解决“写不出规范代码”的核心痛点③ 干货拉满分页、条件查询、CRUD全覆盖代码可直接复制无需自己编写④ 面试直达每部分配套应届生高频面试提问学完直接应对面试⑤ 避坑指南汇总应届生常踩的5个核心坑提前规避入职少出错。一、先划重点为什么应届生必须掌握这套整合用法很多应届生疑惑MyBatis也能写CRUD为什么企业非要用MyBatis-Plus结合2026年企业招聘和入职场景总结3个核心原因面试必答记牢✅ 入职必用90%以上的企业Java项目都会用MyBatis-Plus替代原生MyBatis简化CRUD代码应届生入职第一天就可能用到不会就等于“拖团队后腿”✅ 面试高频面试官问完Spring Boot基础必问“MyBatis-Plus怎么用分页怎么实现”掌握这套最新用法轻松拉开与其他应届生的差距✅ 简化开发MyBatis-Plus自带CRUD接口无需手动写XML映射文件分页、条件查询也有现成方法能帮你快速完成任务获得领导认可。应届生避坑提醒别再学MyBatis-Plus 3.4及以下旧版本企业2026年已全面使用3.5版本与Spring Boot 3.3适配更流畅旧版本的部分用法已被废弃学错了入职还要返工二、环境准备应届生必看一步到位先搭建Spring Boot 3.3 MyBatis-Plus 3.5 的基础环境步骤清晰新手也能快速完成所有依赖和配置均为2026企业最新规范可直接复制。2.1 核心依赖pom.xml重点引入MyBatis-Plus 3.5.5.1与Spring Boot 3.3 完美适配企业主流版本、MySQL驱动、分页插件依赖无需额外引入MyBatis依赖MyBatis-Plus已包含?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.3.0/version !-- Spring Boot 3.3 最新稳定版 -- relativePath/ !-- lookup parent from repository -- /parent groupIdcom.example/groupId artifactIdspringboot-mybatis-plus-demo/artifactId version0.0.1-SNAPSHOT/version namespringboot-mybatis-plus-demo/name descriptionDemo project for Spring Boot MyBatis-Plus/description properties java.version17/java.version !-- 企业应届生入职常用JDK版本 -- mybatis-plus.version3.5.5.1/mybatis-plus.version !-- MyBatis-Plus 3.5 最新稳定版 -- /properties dependencies !-- Spring Boot Web 依赖开发接口必备 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- MyBatis-Plus 核心依赖 -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version${mybatis-plus.version}/version /dependency !-- MySQL 驱动适配MySQL 8.0企业主流 -- dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency !-- MyBatis-Plus 分页插件必引分页查询必备 -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-extension/artifactId version${mybatis-plus.version}/version /dependency !-- Lombok简化实体类企业开发必备应届生必学 -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency !-- 测试依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency /dependencies build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId configuration excludes exclude groupIdorg.projectlombok/groupId artifactIdlombok/artifactId /exclude /excludes /configuration /plugin /plugins /build2.2 核心配置application.yml配置MySQL连接、MyBatis-Plus基础配置注释清晰可直接修改数据库地址、用户名、密码无需额外配置spring: # MySQL 数据库配置需修改为自己的数据库信息 datasource: url: jdbc:mysql://localhost:3306/mybatis_plus_demo?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/Shanghai username: root # 数据库用户名 password: 123456 # 数据库密码 driver-class-name: com.mysql.cj.jdbc.Driver # MyBatis-Plus 核心配置 mybatis-plus: # 扫描实体类包修改为自己的实体类包路径必配 type-aliases-package: com.example.demo.entity # 扫描XML映射文件如果需要手动写XML可配置此路径 mapper-locations: classpath:mapper/**/*.xml configuration: # 开启SQL日志打印调试必备能看到执行的SQL语句 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启驼峰命名映射如数据库字段user_name → 实体类userName无需手动配置 map-underscore-to-camel-case: true # 全局配置 global-config: db-config: # 主键生成策略自增企业最常用应届生首选 id-type: auto # 逻辑删除字段配置企业常用软删除避免误删数据 logic-delete-field: isDeleted logic-delete-value: 1 # 已删除 logic-not-delete-value: 0 # 未删除2.3 启动类配置关键一步启动类上添加MapperScan注解扫描Mapper接口包否则MyBatis-Plus无法识别Mapper接口会报“找不到Mapper”错误应届生最常踩的坑之一package com.example.demo; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; // 扫描Mapper接口包修改为自己的Mapper包路径必加 MapperScan(com.example.demo.mapper) SpringBootApplication public class SpringbootMybatisPlusDemoApplication { public static void main(String[] args) { SpringApplication.run(SpringbootMybatisPlusDemoApplication.class, args); } }2.4 分页插件配置必配分页查询必备Spring Boot 3.3 整合MyBatis-Plus 3.5 后分页插件需手动配置否则分页查询无效应届生常漏配的点创建配置类代码可直接复制package com.example.demo.config; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; // 分页插件配置类可直接复制无需修改 Configuration public class MyBatisPlusConfig { Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); // 添加分页插件指定数据库类型MySQL interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }三、核心实操CRUD 最新用法入职必写规范代码以“用户表user”为例讲解应届生入职最常写的CRUD操作所有代码均为企业规范写法可直接复制到项目中使用无需自己编写重复代码。3.1 第一步创建实体类Entity结合Lombok简化代码添加MyBatis-Plus注解贴合企业数据库设计规范包含逻辑删除字段isDeleted应届生可直接参考修改package com.example.demo.entity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import java.time.LocalDateTime; // Lombok注解自动生成getter、setter、toString等方法简化代码 Data // 数据库表名映射如果实体类名与表名一致可省略此注解 TableName(user) public class User { // 主键自增与application.yml中id-type: auto对应 TableId(type IdType.AUTO) private Long id; // 用户名数据库字段user_name驼峰命名自动映射 private String userName; // 密码企业中会加密存储此处简化 private String password; // 手机号 private String phone; // 邮箱 private String email; // 创建时间自动填充无需手动赋值 TableField(fill FieldFill.INSERT) private LocalDateTime createTime; // 更新时间自动填充新增和修改时自动赋值 TableField(fill FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; // 逻辑删除字段0未删除1已删除 TableLogic private Integer isDeleted; }3.2 第二步自动填充配置企业规范应届生必学实体类中的createTime、updateTime字段无需手动赋值通过自动填充配置新增和修改时自动生成时间贴合企业规范避免手动赋值出错package com.example.demo.config; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; import java.time.LocalDateTime; // 自动填充配置类可直接复制 Component public class MyMetaObjectHandler implements MetaObjectHandler { // 新增时自动填充 Override public void insertFill(MetaObject metaObject) { // 填充createTime和updateTime为当前时间 strictInsertFill(metaObject, createTime, LocalDateTime.class, LocalDateTime.now()); strictInsertFill(metaObject, updateTime, LocalDateTime.class, LocalDateTime.now()); } // 修改时自动填充 Override public void updateFill(MetaObject metaObject) { // 填充updateTime为当前时间 strictUpdateFill(metaObject, updateTime, LocalDateTime.class, LocalDateTime.now()); } }3.3 第三步创建Mapper接口核心CRUD接口自动生成Mapper接口继承BaseMapperUserMyBatis-Plus会自动生成CRUD接口无需手动写SQL只需继承接口即可package com.example.demo.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.demo.entity.User; import org.apache.ibatis.annotations.Mapper; // Mapper注解标识这是一个MyBatis Mapper接口 Mapper // 继承BaseMapper自动获得CRUD接口 public interface UserMapper extends BaseMapperUser { // 无需手动写CRUD方法BaseMapper已全部包含 // 如需自定义SQL可在此处添加方法配合XML映射文件使用 }3.4 第四步创建Service企业规范分层开发必备企业开发中不会直接调用Mapper接口而是通过Service层封装业务逻辑应届生需掌握Service层的规范写法分为接口和实现类// 1. Service接口 package com.example.demo.service; import com.baomidou.mybatisplus.extension.service.IService; import com.example.demo.entity.User; // 继承IService获得更多CRUD扩展方法 public interface UserService extends IServiceUser { // 可在此处添加自定义业务方法如根据手机号查询用户 } // 2. Service实现类 package com.example.demo.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.example.demo.entity.User; import com.example.demo.mapper.UserMapper; import com.example.demo.service.UserService; import org.springframework.stereotype.Service; // Service注解标识这是一个Service组件交给Spring管理 Service // 继承ServiceImpl实现UserService接口自动注入Mapper public class UserServiceImpl extends ServiceImplUserMapper, User implements UserService { // 无需手动实现CRUD方法ServiceImpl已全部包含 // 自定义业务方法示例根据手机号查询用户 public User getByPhone(String phone) { // 调用MyBatis-Plus的条件查询方法 return lambdaQuery().eq(User::getPhone, phone).one(); } }3.5 第五步创建Controller接口开发入职必写编写RESTful接口实现CRUD功能代码贴合企业规范统一响应格式、参数校验应届生可直接复制修改包路径即可package com.example.demo.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.demo.entity.User; import com.example.demo.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; // RESTful接口控制器处理前端请求 RestController RequestMapping(/user) // 接口统一前缀 public class UserController { // 注入UserServiceSpring自动注入无需手动创建 Autowired private UserService userService; // 1. 新增用户POST请求入职必写 PostMapping public String addUser(RequestBody User user) { // 调用Service的save方法自动填充createTime和updateTime boolean success userService.save(user); return success ? 新增成功 : 新增失败; } // 2. 修改用户PUT请求入职必写 PutMapping(/{id}) public String updateUser(PathVariable Long id, RequestBody User user) { // 设置用户ID确保修改的是指定用户 user.setId(id); boolean success userService.updateById(user); return success ? 修改成功 : 修改失败; } // 3. 删除用户DELETE请求逻辑删除入职必写 DeleteMapping(/{id}) public String deleteUser(PathVariable Long id) { // 调用removeById方法自动实现逻辑删除isDeleted设为1 boolean success userService.removeById(id); return success ? 删除成功 : 删除失败; } // 4. 根据ID查询用户GET请求入职必写 GetMapping(/{id}) public User getUserById(PathVariable Long id) { // 调用getById方法自动过滤已删除用户isDeleted0 return userService.getById(id); } // 5. 查询所有用户GET请求入职必写 GetMapping(/list) public ListUser getUserList() { // 调用list方法自动过滤已删除用户 return userService.list(); } }四、应届生加分项分页优化条件查询面试高频单纯的CRUD只能满足基础需求掌握分页优化和条件查询能让你在面试中脱颖而出也是企业入职后常用的进阶技能以下用法均为MyBatis-Plus 3.5 最新规范应届生可直接复用。4.1 分页查询企业必用面试必问企业列表查询几乎都会用到分页MyBatis-Plus 3.5 分页插件配置后只需简单几行代码即可实现分页无需手动写分页SQL新手必学// 在UserController中添加分页查询接口 GetMapping(/page) public IPageUser getUserPage( RequestParam(defaultValue 1) Integer pageNum, // 页码默认第1页 RequestParam(defaultValue 10) Integer pageSize // 每页条数默认10条 ) { // 1. 创建分页对象pageNum页码pageSize每页条数 PageUser page new Page(pageNum, pageSize); // 2. 调用Service的分页查询方法自动分页 IPageUser userPage userService.page(page); // 3. 返回分页结果包含总条数、总页数、当前页数据 return userPage; }✅ 测试访问http://localhost:8080/user/page?pageNum1pageSize10即可获得分页结果控制台会打印分页SQL开启了SQL日志可直接测试。✅ 面试延伸面试官可能会问“分页插件的原理是什么”简单回答应届生能懂MyBatis-Plus分页插件通过拦截SQL自动在SQL末尾添加LIMIT语句实现分页无需手动编写分页SQL简化开发。4.2 条件查询入职必写灵活筛选企业开发中经常需要根据多条件筛选数据如根据用户名、手机号查询MyBatis-Plus提供LambdaQueryWrapper无需写SQL通过链式调用实现条件查询规范且简洁// 在UserController中添加条件查询接口可直接复制 GetMapping(/list/condition) public ListUser getUserByCondition( RequestParam(required false) String userName, // 用户名可选 RequestParam(required false) String phone // 手机号可选 ) { // 创建LambdaQueryWrapper用于构建条件 LambdaQueryWrapperUser queryWrapper new LambdaQueryWrapper(); // 条件1用户名模糊查询like如果userName不为null才添加该条件 queryWrapper.like(userName ! null, User::getUserName, userName); // 条件2手机号精确查询eq如果phone不为null才添加该条件 queryWrapper.eq(phone ! null, User::getPhone, phone); // 条件3未删除的用户isDeleted0全局生效 queryWrapper.eq(User::getIsDeleted, 0); // 条件4按创建时间降序排序最新创建的在前 queryWrapper.orderByDesc(User::getCreateTime); // 调用list方法根据条件查询 return userService.list(queryWrapper); }✅ 常用条件方法必记eq等于如eq(User::getPhone, phone) → phone ?like模糊查询如like(User::getUserName, 张) → user_name like %张%gt大于如gt(User::getId, 10) → id 10orderByDesc降序排序orderByAsc升序排序and/or逻辑与/或如queryWrapper.eq(...).and(qw - qw.like(...).or(...))。五、新手常踩的5个坑避坑指南入职少出错结合新手入职实际情况汇总5个最常踩的坑每一个都附解决方案提前规避避免入职后因小错误被领导批评坑1启动报错“找不到Mapper接口”→ 解决方案启动类上忘记添加MapperScan注解或注解中的包路径错误修改MapperScan(你的Mapper包路径)即可坑2分页查询无效返回所有数据→ 解决方案忘记配置分页插件MyBatisPlusConfig或分页插件配置错误复制本文中的分页插件配置即可坑3自动填充时间createTime/updateTime无效→ 解决方案实体类中忘记添加TableField(fill ...)注解或未创建MyMetaObjectHandler配置类坑4逻辑删除无效数据被物理删除→ 解决方案实体类中忘记添加TableLogic注解或application.yml中未配置逻辑删除字段坑5条件查询时空值导致查询异常→ 解决方案条件查询时先判断参数是否为null再添加条件如本文中like(userName ! null, ...)避免空值导致SQL报错。六、面试高频提问标准答案直接套用整理4个面试中最常问的MyBatis-Plus相关问题标准答案已整理好直接套用轻松应对面试提问1Spring Boot 3.3 如何整合MyBatis-Plus 3.5核心步骤是什么回答模板核心步骤有5步① 引入核心依赖mybatis-plus-boot-starter、mysql驱动、分页插件② 在application.yml中配置MySQL连接和MyBatis-Plus基础配置实体类包、SQL日志、主键策略③ 启动类添加MapperScan注解扫描Mapper接口包④ 配置分页插件MyBatisPlusConfig⑤ 编写实体类、Mapper、Service、Controller利用MyBatis-Plus自动生成CRUD接口。提问2MyBatis-Plus 和 MyBatis 的区别是什么企业为什么优先用MyBatis-Plus回答模板核心区别是MyBatis-Plus是MyBatis的增强工具无需改变MyBatis的原有用法同时新增了很多实用功能。企业优先用它的原因① 自动生成CRUD接口无需手动写SQL和XML映射文件提升开发效率② 内置分页插件、条件查询、逻辑删除等功能无需额外开发③ 与Spring Boot适配性好配置简单上手快④ 支持Lambda表达式条件查询更简洁规范。提问3MyBatis-Plus 的分页插件如何配置和使用回答模板配置步骤① 引入mybatis-plus-extension依赖② 创建配置类注入MybatisPlusInterceptor添加PaginationInnerInterceptor指定数据库类型。使用方法① 创建Page对象指定页码和每页条数② 调用Service的page方法传入Page对象和查询条件可选③ 接收IPage返回结果获取分页数据总条数、当前页数据等。提问4MyBatis-Plus 的逻辑删除如何实现有什么优势回答模板实现步骤① 在application.yml中配置逻辑删除字段logic-delete-field和删除/未删除值② 在实体类的逻辑删除字段上添加TableLogic注解。优势① 实现软删除数据不会被物理删除避免误删数据便于数据恢复② 无需手动编写逻辑删除SQLMyBatis-Plus自动拦截简化开发③ 查询时自动过滤已删除数据无需额外添加条件。七、总结入职面试双重点对于新手来说Spring Boot 3.3 整合MyBatis-Plus 3.5 的核心不是“学多深的原理”而是“掌握入职必写的规范用法”——本文讲解的CRUD、分页、条件查询都是应届生入职第一天就可能用到的内容所有代码可直接复制无需自己编写。面试核心技巧回答MyBatis-Plus相关问题时不要只背理论一定要结合“实操步骤规范代码”比如讲解整合步骤时说出具体的依赖和配置讲解分页时说出分页插件的配置和使用方法这样才能体现你的实战能力避开“只会背理论”的标签。简历加分技巧在简历中新增“熟练使用Spring Boot 3.3 整合MyBatis-Plus 3.5掌握CRUD、分页查询、条件查询能写出符合企业规范的代码熟悉逻辑删除、自动填充等企业常用功能”再加上本文中的实操场景直接提升简历竞争力。最后提醒应届生不用追求掌握MyBatis-Plus的所有高级功能先吃透本文讲解的基础用法、避坑要点和面试问答就能满足企业入职和面试需求顺利拿下Java后端岗位。 收藏本文入职后写CRUD、面试前复习可直接复用代码和面试模板关注我持续更新应届生Java云原生就业向干货帮你快速夯实基础、顺利就业入职不慌