妙用MyBatisPlus,12个实战技巧解锁新知识

cover_image

前言

说起数据库ORM,我忽然想起了小时候外婆做的那锅鲜美的羊肉汤。平常人家做的羊肉汤无非是几块肉、几片姜,味道寡淡得很,喝了和喝白开水差不多。但外婆的汤,那是另一回事儿
—— 一锅汤,香气四溢,肉质软烂,汤头浓郁得能让人连碗都想舔干净。

写代码何尝不是如此?以前写Mybatis,就像是在煮一锅没有灵魂的羊肉汤:原料都在,但就是不够鲜美。代码繁琐,每写一个查询都像是在不断调味,却怎么也调不出那种令人惊艳的味道。直到遇见MyBatisPlus,一切都变了
—— 这就像是从普通的羊肉汤,突然升级到了外婆秘制的顶级羊肉汤!

MyBatisPlus就像一位精通厨艺的帮厨,它帮你处理了所有繁琐的准备工作。想要一个复杂的查询?不用自己一刀一刀地切肉、一勺一勺地调味,框架已经帮你准备好了。你只需要轻轻地指挥,代码就像汤汁一样顺滑流畅,性能更是鲜美可口。

在接下来的篇幅里,我将与你分享12个MyBatisPlus优化的"秘制配方"。相信看完这些,你写的每一行代码,都会像外婆的羊肉汤一样,让人回味无穷。

耐心看完,你一定有所收获。

避免使用isNull判断


// ❌ 不推荐
LambdaQueryWrapper < User > wrapper1 = new LambdaQueryWrapper < > ();
wrapper1.isNull(User::getStatus); 
// ✅ 推荐:使用具体的默认值
LambdaQueryWrapper < User > wrapper2 = new LambdaQueryWrapper < > ();
wrapper2.eq(User::getStatus, UserStatusEnum.INACTIVE.getCode());
  • 📝 原因:
    • 使用具体的默认值可以提高代码的可读性和维护性
    • NULL值会使索引失效,导致MySQL无法使用索引进行查询优化
    • NULL值的比较需要特殊的处理逻辑,增加了CPU开销
    • NULL值会占用额外的存储空间,影响数据压缩效率

明确Select字段


// ❌ 不推荐// 默认select 所有字段
List<User> users1 = userMapper.selectList(null);    
// ✅ 推荐:指定需要的字段
LambdaQueryWrapper < User > wrapper = new LambdaQueryWrapper < > ();
wrapper.select(User::getId, User::getName, User::getAge);
List < User > users2 = userMapper.selectList(wrapper);
  • 📝 原因:
    • 避免大量无用字段的网络传输开销
    • 可以利用索引覆盖,避免回表查询
    • 减少数据库解析和序列化的负担
    • 降低内存占用,特别是在大量数据查询时

批量操作方法替代循环


// ❌ 不推荐
for (User user: userList) {
   
    userMapper.insert(user);
}
// ✅ 推荐
userService.saveBatch(userList, 100);  // 每批次处理100条数据  
// ✅ 更优写法:自定义批次大小
userService.saveBatch(userList, BatchConstants.BATCH_SIZE);
  • 📝 原因:
    • 减少数据库连接的创建和销毁开销
    • 批量操作可以在一个事务中完成,提高数据一致性
    • 数据库可以优化批量操作的执行计划
    • 显著减少网络往返次数,提升吞吐量

Exists方法子查询


// ❌ 不推荐
wrapper.inSql("user_id", "select user_id from order where amount > 1000");  
// ✅ 推荐
wrapper.exists("select 1 from order where order.user_id = user.id and amount > 1000"); 
// ✅ 更优写法:使用
LambdaQueryWrapperwrapper.exists(orderService.lambdaQuery().gt(Order::getAmount, 1000).apply("order.user_id = user.id"));
  • 📝 原因:
    • EXISTS是基于索引的快速查询,可以使用到索引
    • EXISTS在找到第一个匹配项就会停止扫描
    • IN子查询需要加载所有数据到内存后再比较
    • 当外表数据量大时,EXISTS的性能优势更明显

使用orderBy代替last


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值