mybatisplus的QueryWrapper或LambdaQueryWrapper的使用方式

先说总结

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 操作!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值