1. 避免使用 isNull
判断
NULL
值判断可能会导致索引失效,进而影响查询性能,尤其是在有大量数据的情况下。NULL
,比如通过 UserStatusEnum.INACTIVE.getCode()
来代替空值判断。// 不推荐的做法
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.isNull("status");
// 推荐的做法
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("status", UserStatusEnum.INACTIVE.getCode());
NULL
比较的问题,数据库查询可以更高效。2. 明确 select
字段
// 不推荐的做法
List<User> users = userMapper.selectList(new QueryWrapper<>());
// 推荐的做法
List<User> users = userMapper.selectList(
new QueryWrapper<User>().select("id", "name", "email")
);
3. 批量操作方法替代循环
saveBatch()
,提高数据插入效率。// 不推荐的做法:逐条插入
for (User user : userList) {
userMapper.insert(user);
}
// 推荐的做法:批量插入
userMapper.saveBatch(userList);
4. 使用 exists
方法代替 inSql
子查询
IN
子查询会将所有匹配的数据加载到内存中,特别是当数据量大时,会造成性能瓶颈。EXISTS
子查询,它更高效,因为数据库会直接基于索引来判断是否存在,避免了将所有数据都加载到内存的情况。// 不推荐的做法:使用 IN 子查询
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.inSql("id", "SELECT id FROM user WHERE status = 'active'");
// 推荐的做法:使用 EXISTS 子查询
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.exists("SELECT 1 FROM user WHERE status = 'active' AND user.id = user.id");
EXISTS
,查询会更高效,尤其在大数据量的情况下,性能提升明显。5. 使用 orderBy
代替 last
SQL
可能引发 SQL 注入风险。比如,你可能写了一个拼接排序的 SQL 语句,结果被不怀好意的人利用了。orderBy
来进行安全排序,避免手动拼接 SQL 字符串。// 不推荐的做法:直接拼接排序字段
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.last("ORDER BY created_at DESC");
// 推荐的做法:使用 orderBy 进行排序
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.orderByDesc("created_at");
6. 使用 LambdaQuery
确保类型安全
LambdaQueryWrapper
来保证字段名的类型安全,编译时就能发现错误,减少运行时出错的概率。// 不推荐的做法
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name", "Tom");
// 推荐的做法:使用 LambdaQueryWrapper
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getName, "Tom");
7. 使用 between
代替 ge
和 le
between
来简化 SQL 语句,使条件更为简洁,提升可读性。// 不推荐的做法
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.ge("age", 18).le("age", 30);
// 推荐的做法:使用 between
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.between("age", 18, 30);
between
,你可以让 SQL 更简洁,逻辑也更加清晰。8. 排序字段注意索引
9. 分页参数设置
10. 条件构造处理 NULL 值
eq
方法优雅地处理空值,避免无效查询条件的出现。11. 查询性能追踪
try-with-resources
结合自定义的性能追踪工具,优雅地监控查询性能。12. 枚举类型映射
-END-
以上,就是今天的分享了,看完文章记得右下角给何老师点赞,也欢迎在评论区写下你的留言。