【学习笔记】Mybatis-Plus(三):MP中Wrapper的使用

Wrapper简介

注意:

查询用QueryWrapper和LambdaQueryWrapper来封装

updateWrapper和LambdaUPdateWrapper不但能封装查询还能更改要更新的对象。

QueryWrapper的使用

QueryWrapper中的很多条件限定都是见名知其意的。下表列出来几个常用的:

1.多条件进行查询

java 复制代码
@Test
public void test01() {
    //查询用户,姓李的 & 年龄从20岁到30岁内 & 地址是北京朝阳的
    QueryWrapper<User> queryWrapper = new QueryWrapper();
    queryWrapper.likeRight("name", "李")
            .between("age", 20, 30)
            .eq("address", "北京朝阳");
    List<User> users = this.userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}
//sql语句
==>  Preparing: SELECT id,name,age,email,address AS addr,
createtime,updatetime,is_deleted FROM lm_user 
WHERE is_deleted=0 AND (name LIKE ? AND age BETWEEN ? AND ? AND address = ?)
==> Parameters: 李%(String), 20(Integer), 30(Integer), 北京朝阳(String)

2.有排序查询

java 复制代码
@Test
public void test02() {
    //按年龄降序查询用户,如果年龄相同则按id升序排列
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.orderByDesc("age")
            .orderByAsc("id");
    List<User> users = this.userMapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}
//sql语句
SELECT id,name,age,email,address AS addr,createtime,updatetime,is_deleted 
FROM lm_user WHERE is_deleted=0 ORDER BY age DESC,id ASC

3.条件优先级查询

java 复制代码
@Test
public void test03() {
    //(年龄大于20并且用户名中包含有张)或邮箱为null的用户信息
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.gt("age", 20)
            .like("name", "张")
            .or()
            .isNull("email");
    this.userMapper.selectList(queryWrapper);
    //用户名中包含有张并且(年龄大于20或邮箱为null)的用户信息
    QueryWrapper<User> query = new QueryWrapper<>();
    query.like("name", "张")
            .and(wrapper -> wrapper.gt("age", 20).or().isNull("email"));
    this.userMapper.selectList(query);
}
//sql语句
==>  Preparing: SELECT id,name,age,email,address AS addr,
createtime,updatetime,is_deleted FROM lm_user 
WHERE is_deleted=0 AND (age > ? AND name LIKE ? OR email IS NULL)
==> Parameters: 20(Integer), %张%(String)
==>  Preparing: SELECT id,name,age,email,address AS addr,
createtime,updatetime,is_deleted FROM lm_user 
WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL))
==> Parameters: %张%(String), 20(Integer)

LambdaQueryWrapper的使用

用LamdaQueryWrapper的好处是数据库的字段名不用手写了,可以避免写错的风险。用法和QueryWrapper差不多。

java 复制代码
@Test
public void test04() {
    //(年龄大于20并且用户名中包含有张)或邮箱为null的用户信息
    LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper();
    queryWrapper.gt(User::getAge, 20)
            .like(User::getName, "张")
            .or()
            .isNull(User::getEmail);
    List<User> userList = this.userMapper.selectList(queryWrapper);
    userList.forEach(System.out::println);

    //采用链式更方便。查询结果和上面一样的
    List<User> users = new LambdaQueryChainWrapper<>(this.userMapper)
            .gt(User::getAge, 20)
            .like(User::getName, "张")
            .or()
            .isNull(User::getEmail)
            .list();
    users.forEach(System.out::println);
}
//sql语句
==>  Preparing: SELECT id,name,age,email,address AS addr,
createtime,updatetime,is_deleted FROM lm_user 
WHERE is_deleted=0 AND (age > ? AND name LIKE ? OR email IS NULL)
==> Parameters: 20(Integer), %张%(String)

UpdateWrapper的使用

java 复制代码
@Test
public void test05() {
    //通过UpdateWrapper进行更新
    UpdateWrapper<User> updateWrapper = new UpdateWrapper();
    updateWrapper.gt("age", 20)
            .like("name", "张")
            .or()
            .isNull("email")
            .set("age", 23);
    this.userMapper.update(null, updateWrapper);

    //链式方式进行更新
    UpdateChainWrapper<User> updateChainWrapper = new UpdateChainWrapper<>(this.userMapper);
    updateChainWrapper.gt("age", 20)
            .like("name", "张")
            .or()
            .isNull("email")
            .set("age", 23).update();
}
//sql语句
==>  Preparing: UPDATE lm_user SET age=? WHERE is_deleted=0 
AND (age > ? AND name LIKE ? OR email IS NULL)
==> Parameters: 23(Integer), 20(Integer), %张%(String)

LambdaUpdateWrapper

java 复制代码
@Test
public void test06() {
    boolean result = new LambdaUpdateChainWrapper<User>(this.userMapper)
            .set(User::getAge, 23)
            .set(User::getEmail, "laoma@163.com")
            .gt(User::getAge, 20)
            .like(User::getName, "张")
            .or()
            .isNull(User::getEmail)
            .update();
    System.out.println("更新结果:" + result);
}
//sql语句
==>  Preparing: UPDATE lm_user SET age=?,email=? WHERE is_deleted=0 AND (age > ? AND name LIKE ? OR email IS NULL)
==> Parameters: 23(Integer), laoma@163.com(String), 20(Integer), %张%(String)

有条件时才加入条件

在实际开发过程中在拼接条件时,经常是判断这个值不为null,空字符串时才加入条件。这个在MP中再每个条件设置的第一个参数condition就是用来判断是否加入条件的条件。

java 复制代码
@Test
public void test07() {
    User request = new User();
    request.setAge(null);
    request.setName("老马");
    request.setEmail("laoma@163.com");
    List<User> users = new LambdaQueryChainWrapper<>(this.userMapper)
            .select(User::getId, User::getName, User::getAge, User::getEmail)
            .gt(request.getAge()!=null, User::getAge, 20)
            .like(StringUtils.isNotBlank(request.getName()), User::getName, request.getName())
            .eq(StringUtils.isNotBlank(request.getEmail()), User::getEmail, request.getEmail())
            .list();
    users.forEach(System.out::println);
}
//sql语句
==>  Preparing: SELECT id,name,age,email FROM lm_user 
WHERE is_deleted=0 AND (name LIKE ? AND email = ?)
==> Parameters: %老马%(String), laoma@163.com(String)
相关推荐
_Kayo_2 小时前
node.js 学习笔记3 HTTP
笔记·学习
记忆不曾留5 小时前
Mybatis 源码解读-SqlSession 会话源码和Executor SQL操作执行器源码
mybatis·二级缓存·sqlsession会话·executor执行器·一级缓存localcache
CCCC13101635 小时前
嵌入式学习(day 28)线程
jvm·学习
星星火柴9366 小时前
关于“双指针法“的总结
数据结构·c++·笔记·学习·算法
小狗爱吃黄桃罐头6 小时前
正点原子【第四期】Linux之驱动开发篇学习笔记-1.1 Linux驱动开发与裸机开发的区别
linux·驱动开发·学习
艾莉丝努力练剑7 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
武昌库里写JAVA8 小时前
JAVA面试汇总(四)JVM(一)
java·vue.js·spring boot·sql·学习
Cx330❀8 小时前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法
杜子不疼.8 小时前
《Python学习之字典(一):基础操作与核心用法》
开发语言·python·学习
小幽余生不加糖8 小时前
电路方案分析(二十二)适用于音频应用的25-50W反激电源方案
人工智能·笔记·学习·音视频