先说总结
QueryWrapper和LambdaQueryWrappe的区别
dto是前端穿来的参数
1,硬伤是写死的字段,如queryWrapper.eq("username", dto.getName)的"username"这里不灵活
如果是LambdaQueryWrappe lambdaQuery.eq(User::getUsername, dto.getName)这里直接用类的get方法,这里绑定是跟着类的get方法来的,不会出现字段名对不上的问题;
2,在写法上LambdaQueryWrappe支持链式编程(链式就不能动态拼接了),可读性也高
3,复杂查询,其实二者都可以嵌套 OR 条件查询,场景比如说,前端就一个查询框,但是要模糊三个字段,比如名称/备注/编码 等等 wrapper.nested()可以嵌套起来()
// 普通 QueryWrapper queryWrapper.and(wrapper -> //这样可以链式 warpper.eq("status", 1).or().eq("status", 2)//这里可以接着or().eq("name","name") ) // WHERE (status = 1 OR status = 2) // LambdaQueryWrapper lambdaQuery.and(wrapper -> wrapper.eq(User::getStatus, 1).or().eq(User::getStatus, 2).or().eq(User::getStatus, 2).... );
List<User> users = userMapper.selectList(//lambdaQueryWrapper链式编程 new LambdaQueryWrapper<User>() .eq(User::getStatus, 1) .like(User::getNickName, "张") .orderByDesc(User::getCreateTime) );
if (cmsPrefrenceArea.getSort() !=null) {//lambdaQueryWrapper动态拼接 lambdaQueryWrapper.eq(CmsPrefrenceArea::getSort,cmsPrefrenceArea.getSort()); } if (cmsPrefrenceArea.getName() !=null) {//lambdaQueryWrapper动态拼接2 lambdaQueryWrapper.eq(CmsPrefrenceArea::getName,cmsPrefrenceArea.getName()); }
两者使用差别事例
1. 普通 QueryWrapper(推荐用于动态条件)
基础查询
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 等于查询
queryWrapper.eq("username", "admin"); // WHERE username = 'admin'
// 模糊查询
queryWrapper.like("nick_name", "张"); // WHERE nick_name LIKE '%张%'
// 范围查询
queryWrapper.between("age", 18, 30); // WHERE age BETWEEN 18 AND 30
// 排序
queryWrapper.orderByAsc("create_time"); // ORDER BY create_time ASC
// 分页(需配合分页插件)
Page<User> page = new Page<>(1, 10);
Page<User> userPage = userMapper.selectPage(page, queryWrapper);
动态条件拼接/两者其实都支持
if (StringUtils.isNotBlank(username)) { queryWrapper.eq("username", username); } if (status != null) { queryWrapper.eq("status", status); }
2. LambdaQueryWrapper(推荐用于固定条件)
LambdaQueryWrapper<User> lambdaQuery = new LambdaQueryWrapper<>();
// 等于查询
lambdaQuery.eq(User::getUsername, "admin");// WHERE username = 'admin'
// 模糊查询
lambdaQuery.like(User::getNickName, "张");// WHERE nick_name LIKE '%张%'
// 范围查询
lambdaQuery.between(User::getAge, 18, 30);// WHERE age BETWEEN 18 AND 30
// 排序
lambdaQuery.orderByAsc(User::getCreateTime);// ORDER BY create_time ASC
// 分页(需配合分页插件)
Page<User> page = new Page<>(1, 10);
Page<User> userPage = userMapper.selectPage(page, lambdaQuery);
List<User> users = userMapper.selectList(//链式调用 new LambdaQueryWrapper<User>() .eq(User::getStatus, 1) .like(User::getNickName, "张") .orderByDesc(User::getCreateTime) );
复杂查询示例//重点
// 普通 QueryWrapper
queryWrapper.and(wrapper ->
warpper.eq("status", 1).or().eq("status", 2)
);
// WHERE (status = 1 OR status = 2)
// LambdaQueryWrapper
lambdaQuery.and(wrapper ->
wrapper.eq(User::getStatus, 1).or().eq(User::getStatus, 2)
);
IN查询
List<Long> ids = Arrays.asList(1L, 2L, 3L);
// 普通 QueryWrapper
queryWrapper.in("id", ids);
// WHERE id IN (1, 2, 3)
// LambdaQueryWrapper
lambdaQuery.in(User::getId, ids);
SELECT 指定字段
// 普通 QueryWrapper
queryWrapper.select("id", "username", "age");
// LambdaQueryWrapper
lambdaQuery.select(User::getId, User::getUsername, User::getAge);
更新与删除
// 更新条件 LambdaQueryWrapper<User> updateWrapper = new LambdaQueryWrapper<>(); updateWrapper.eq(User::getUsername, "admin"); // 执行更新 User user = new User(); user.setPassword("newPassword"); userMapper.update(user, updateWrapper); // UPDATE user SET password = 'newPassword' WHERE username = 'admin'
LambdaQueryWrapper<User> deleteWrapper = new LambdaQueryWrapper<>(); deleteWrapper.eq(User::getStatus, 0); userMapper.delete(deleteWrapper); // DELETE FROM user WHERE status = 0
掌握这两种 QueryWrapper
的使用方式,可以大幅简化 MyBatis-Plus 的 CRUD 操作!