Mybatis-Plus使用小记
MP 使用小记
所谓 MP 是指:Mybatis-Plus
前言
本篇文章是对 MP 一些日常开发学习中不常见但实用的使用小技巧总结,内容将持续更新,希望能对小伙伴们有所帮助。推荐点赞 + 收藏哦!
官方文档:Mybatis-Plus
给现有分页指定字段排序
第一种方法
- 其中,
reqDTO
是方法参数。 - 主要内容是:给 page 插入排序属性。
// 1、MP Page<TestVO> page = new Page<>(); page.setCurrent(reqDTO.getCurrent()); page.setSize(reqDTO.getSize()); List<OrderItem> itemList = new ArrayList<>(); // 插入排序属性 OrderItem orderItem = new OrderItem(); orderItem.setColumn("create_time"); // 按什么字段排序 orderItem.setAsc(false); // 是否升序 itemList.add(orderItem); page.setOrders(itemList);
第二种方法
利用 MP 中 IService<T>
的 lambdaQuery()
方法。
// select * from learning_lesson where user_id = #{userId} order by latest_learn_time desc limit #{offset}, #{size} Page<LearningLesson> page = lambdaQuery() .eq(LearningLesson::getUserId, userId) // where user_id = #{userId} .page(query.toMpPage("latest_learn_time", false));
条件判断
主要有以下几种:
- eq 就是 equal 等于
- ne 就是 not equal 不等于
- gt 就是 greater than 大于
- lt 就是 less than 小于
- ge 就是 greater than or equal 大于等于
- le 就是 less than or equal 小于等于
lambdaQuery 实现 list
// 第一种写法 LambdaQueryWrapper<EnterpriseEntity> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(EnterpriseEntity::getEnterpriseId, id); List<EnterpriseEntity> list = entService.list(wrapper); // 第二种写法 List<EnterpriseEntity> list = entService.lambdaQuery().eq(EnterpriseEntity::getEnterpriseId, id).list();
还可以用 select()
指定查询字段
实现 distinct 去重功能
List<EnterpriseEntity> list = this.query() .select("distinct type") .eq("enterprise_id", entId) .between("upload_time", DateUtil.beginOfDay(today), DateUtil.endOfDay(today)) .list();
自动填充
使用 @TableField
注解的 fill
属性,结合自定义的 MetaObjectHandler
,可以实现字段自动填充。
@TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime;
清空查询条件
MyBatis-Plus 中 QueryWrapper
类提供的方法之一:queryWrapper.clear()
。
- 用于清空当前
QueryWrapper
对象中的查询条件,让QueryWrapper
对象重新变为空白状态。
在实际的开发中,我们可能需要根据不同的条件动态构建查询条件,而 queryWrapper.clear()
提供了一种方便的方式,可以在重新构建查询条件之前清空已有的条件。
public List<User> queryUserList(String name, Integer age) { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); // 第一次构建查询条件 if (StringUtils.isNotBlank(name)) { queryWrapper.like("name", name); } if (age != null) { queryWrapper.eq("age", age); } List<User> userList = userMapper.selectList(queryWrapper); // 清空查询条件 queryWrapper.clear(); // 第二次构建新的查询条件 queryWrapper.eq("status", 1); List<User> userListWithStatus1 = userMapper.selectList(queryWrapper); // 返回结果,注意:此时的 queryWrapper 已经没有之前的条件了 return userListWithStatus1; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现