news 2026/6/3 1:26:32

MyBatis-Plus 你真的会用吗?90% 的人都踩过这些坑!(附正确姿势 + 反例)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MyBatis-Plus 你真的会用吗?90% 的人都踩过这些坑!(附正确姿势 + 反例)

视频看了几百小时还迷糊?关注我,几分钟让你秒懂!(发点评论可以给博主加热度哦)


一、为什么用 MyBatis-Plus?真实痛点 vs 神器

很多开发者还在手写 CRUD:

// 手写 Mapper XML,重复又易错 <select id="selectUserByName" resultType="User"> SELECT * FROM user WHERE name = #{name} </select>

MyBatis-Plus(MP)是什么?
✅ 它是 MyBatis 的增强工具,在MyBatis 的基础上只做增强,不做改变
✅ 自动注入通用 CRUD 方法,无需写 SQL,一行代码搞定增删改查!

🌰 场景:快速开发后台管理系统

  • 用户管理、商品管理、订单管理……
  • 每张表都要写 5~10 个基础接口
  • 时间紧、任务重、还要防 SQL 注入

MP 方案

// 继承 BaseMapper,直接拥有 20+ 个方法! public interface UserMapper extends BaseMapper<User> {}
// 查询名字为 "张三" 的用户 List<User> users = userMapper.selectList( new QueryWrapper<User>().eq("name", "张三") );

✅ 零 XML、零 SQL、类型安全、防注入!


二、Spring Boot + MyBatis-Plus 快速集成(正确姿势)

第一步:添加依赖(pom.xml

<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.5</version> </dependency> <!-- 数据库驱动(以 MySQL 为例) --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>

⚠️ 注意:不要同时引入mybatis-spring-boot-starter,MP 已包含!


第二步:配置application.yml

spring: datasource: url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8 username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印SQL日志 global-config: db-config: id-type: auto # 主键自增 table-prefix: t_ # 表名前缀(如实体类 User 对应 t_user)

第三步:定义实体类(关键注解)

@Data @TableName("t_user") // 指定表名 public class User { @TableId(type = IdType.AUTO) // 主键策略 private Long id; @TableField("user_name") // 字段映射(数据库字段是 user_name) private String userName; private Integer age; @TableField(exist = false) // 非数据库字段(如密码确认) private String confirmPassword; }

第四步:Mapper 接口(一行代码,功能全有)

@Mapper public interface UserMapper extends BaseMapper<User> { // 无需写任何方法!BaseMapper 已提供: // insert, deleteById, updateById, selectById, selectList... }

第五步:Service 层(推荐使用 MP 的 IService)

@Service public class UserService implements IService<User> { @Autowired private UserMapper userMapper; // 可直接调用 getBaseMapper() 使用 CRUD public void demo() { // 插入 User user = new User(); user.setUserName("李四"); user.setAge(25); save(user); // 来自 IService // 查询 List<User> list = list(new QueryWrapper<User>() .ge("age", 18) .like("user_name", "李") ); } }

✅ 优势:IService提供更多便捷方法,如saveBatchupdateBatchById等。


三、高频反例 & 致命陷阱(90% 新手都中招!)

❌ 反例1:滥用select *,导致性能爆炸!

// 错误:查询所有字段,即使只需要 id 和 name List<User> users = userMapper.selectList(null);

✅ 正确:只查需要的字段

// 方式1:QueryWrapper.select() List<User> users = userMapper.selectList( new QueryWrapper<User>().select("id", "user_name") ); // 方式2:自定义 DTO + @Select @Select("SELECT id, user_name FROM t_user WHERE age > #{age}") List<UserDTO> selectSimpleUsers(@Param("age") int age);

❌ 反例2:手动拼接 SQL,引发注入漏洞!

// 危险!用户输入 "'; DROP TABLE t_user; --" 就完蛋了 String sql = "SELECT * FROM t_user WHERE name = '" + name + "'";

✅ 正确:永远使用 Wrapper 或参数绑定

// 安全!MP 自动参数化 userMapper.selectList(new QueryWrapper<User>().eq("user_name", name));

❌ 反例3:批量操作不用 MP 的 batch 方法 → 慢如蜗牛!

// 错误:循环单条插入(1万条 = 1万次数据库交互) for (User user : userList) { userMapper.insert(user); }

✅ 正确:使用saveBatch

userService.saveBatch(userList, 1000); // 分批提交,每批1000条

💡 原理:MP 内部使用ExecutorType.BATCH,极大提升性能。


❌ 反例4:逻辑删除配置错误 → 数据“假删”变“真丢”!

// 实体类未加 @TableLogic private Integer deleted; // 0-正常,1-删除

✅ 正确配置:

// 1. 实体类标注 @TableLogic private Integer deleted; // 2. 全局配置(application.yml) mybatis-plus: global-config: db-config: logic-delete-value: 1 # 删除值 logic-not-delete-value: 0 # 未删除值

🔍 效果:

  • userMapper.deleteById(1)→ 实际执行UPDATE ... SET deleted = 1
  • userMapper.selectById(1)→ 自动追加WHERE deleted = 0

❌ 反例5:分页插件未注册 → 分页失效!

// 直接调用 page 方法,结果返回全部数据! IPage<User> page = userService.page(new Page<>(1, 10));

✅ 正确:必须注册分页插件

@Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusIntercepter(); // 注意拼写! interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }

⚠️ 注意:MP 3.4.0+ 使用MybatisPlusInterceptor,旧版用PaginationInterceptor


四、高级技巧:让 MP 更高效

1. 自动填充创建/更新时间

@TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class); this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class); } @Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class); } }

2. 乐观锁防止并发更新

@Version private Integer version; // 配置插件 interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());

五、总结:MyBatis-Plus 使用 Checklist

项目正确做法
依赖只引mybatis-plus-boot-starter
主键@TableId明确策略
字段映射@TableField处理下划线
查询QueryWrapper,禁止字符串拼接
批量saveBatch/updateBatchById
分页注册PaginationInnerInterceptor
逻辑删除配置@TableLogic+ 全局规则
性能避免select *,只查必要字段

MyBatis-Plus 不是“魔法”,而是规范 + 约定
用对了,开发效率翻倍;用错了,埋下性能炸弹!


视频看了几百小时还迷糊?关注我,几分钟让你秒懂!(发点评论可以给博主加热度哦)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/29 20:25:36

集成双 5W 功放 + AI 降噪!WX-0813 语音模组让全场景通话体验翻倍

在智能设备爆发的当下&#xff0c;语音交互已成为核心需求之一&#xff0c;但环境噪音、通话回音、音频电路复杂等问题却一直困扰着开发者。无论是车载通话的风噪干扰、会议设备的多人回音&#xff0c;还是安防监控的环境杂音&#xff0c;都严重影响语音传输的清晰度。今天给大…

作者头像 李华
网站建设 2026/6/1 22:55:45

JAVA校园跑腿外卖源码,一键开启便捷生活

一键开启便捷生活&#xff1a;JAVA校园跑腿外卖源码重塑校园生态在快节奏的校园生活中&#xff0c;时间成为最稀缺的资源。从清晨赶课到深夜自习&#xff0c;从取快递到订餐&#xff0c;琐碎事务不断消耗着学生的精力。如今&#xff0c;一套基于JAVA技术构建的校园跑腿外卖源码…

作者头像 李华
网站建设 2026/5/22 22:24:43

校园外卖新势力,JAVA源码助力高效代买

校园外卖新势力&#xff1a;JAVA源码赋能高效代买&#xff0c;重新定义校园便捷生活 在快节奏的校园生活中&#xff0c;学生既要应对繁重的课业&#xff0c;又要处理琐碎的日常事务——从食堂排队买饭到快递站取件&#xff0c;从超市采购日用品到帮室友带奶茶……时间被切割成…

作者头像 李华
网站建设 2026/5/21 14:43:04

校园跑腿新选择,JAVA系统一键代劳

校园跑腿新选择&#xff0c;JAVA系统一键代劳——让你的校园生活“轻”装上阵&#xff01; 在快节奏的校园生活中&#xff0c;你是否总被这些琐事困扰&#xff1f; 赶课没时间买早餐&#xff0c;饿着肚子听课效率低&#xff1b;快递堆积如山&#xff0c;却因上课错过取件时间…

作者头像 李华
网站建设 2026/6/1 23:53:50

非标选型设计教程

非标选型设计教程非标选型设计教程非标选型设计教程一 气缸与气动系统二 直线轴承三 直线导轨四 电磁阀五 真空发生器、真空泵与真空系统六 滚动轴承与卡簧七 丝杆设计八 伺服电机九 联轴器十 步进电机十一 拖链设计十二 常用传感器十三 平带、V带和带传动十四 滚筒与同步轮十五…

作者头像 李华