运维开发网

PlusWrapper条件构造函数超详细使用教程

运维开发网 https://www.qedev.com 2022-05-27 14:45 出处:网络
接口方法的参数中,会出现各种Wrapper,比如queryWrapper、updateWrapper等。Wrapper的作用就是用于定义各种各样的条件(where)。所以不管是查询、更新、删除都会用到

接口方法的参数中,会出现各种Wrapper,比如queryWrapper、updateWrapper等。Wrapper的作用就是用于定义各种各样的条件(where)。所以不管是查询、更新、删除都会用到


Wrapper条件构造器

条件构造器包装器是用来封装CRUD方法的参数条件的接口。在其底部有许多子类,其中最重要的是底部的四个子类:

queryWrapper可以用来删改查 updateWrapper可以在修改操作时不必创建实体类对象的操作 LambdaQueryWrapper和LambdaUpdateWrapper则是在字段参数的调用上进行了升级,其他都一样

因为添加记录的添加、删除和修改可以无条件完成,所以添加方法不需要条件构造函数包装器,其他的删除和修改查询都有这个条件构造函数参数。



1 queryWrapper构造器


1.1 组装删改查条件

组合查询条件

查询条件为:姓名中包含字母A,年龄在20-30之间,邮箱不是空的所有值,查询到的值按年龄降序排序,如果是同年龄则按id升序排序。

查询姓名、年龄和电子邮件字段。

@Testpublic void selectListTest() { QueryWrapperlt;Usergt; queryWrapper = new QueryWrapperlt;gt;(); queryWrapper.select("name", "age", "email") .like("name", "a") .between("age", 20, 30) .isNotNull("email") .orderByDesc("age") .orderByAsc("id"); // SELECT id,name,age,email,is_deleted FROM user WHERE is_deleted=0 AND (name LIKE #63; AND age BETWEEN #63; AND #63; AND email IS NOT NULL) ORDER BY age DESC,id ASC Listlt;Maplt;String, Objectgt;gt; maps = mapper.selectMaps(queryWrapper); maps.forEach(System.out::println); System.out.println("========================================================================================"); Listlt;Usergt; users = mapper.selectList(queryWrapper); users.forEach(System.out::println);}

??selectMaps和selectList的区别在于:selectMaps将查询结果封装在一个元素类型为map set的列表集中,集合中只有查询返回字段对应的键值对;selectList的返回值也是一个列表集,只不过元素类型是对应的泛型类型,包含泛型类型的所有字段,查询返回的以外的值都是null。


程序集删除条件

删除条件:邮箱不是空

@Testpublic void deleteTest() { QueryWrapperlt;Usergt; queryWrapper = new QueryWrapperlt;gt;(); queryWrapper.isNull("email"); // UPDATE user SET is_deleted=1 WHERE is_deleted=0 AND (email IS NULL) int result = mapper.delete(queryWrapper); System.out.println("删除的行数为" + result);}

装配修改条件

修改条件:(年龄大于20,用户名包含A)或者邮箱为空。

@Testpublic void updateTest() { User user = new User(); user.setAge(20); user.setEmail("temporary.com"); QueryWrapperlt;Usergt; queryWrapper = new QueryWrapperlt;gt;(); queryWrapper.gt("age", 20) .like("name", "a") .or() .isNull("email"); // UPDATE user SET age=#63;, email=#63; WHERE is_deleted=0 AND (age gt; #63; AND name LIKE #63; OR email IS NULL) int result = mapper.update(user, queryWrapper); System.out.println("修改的行数为" + result);}


1.2 条件优先级

??使用queryWrapper组装复杂条件时,存在AND/OR条件的优先级问题,也就是说,在实现多条件拼接时,如何将AND/OR条件拼接在一起。接下来,挑两个例子来理解。

// (年龄大于20并且用户名中包含有a) 或 邮箱为null// UPDATE user SET age=#63;, email=#63; WHERE is_deleted=0 AND (age gt; #63; AND name LIKE #63; OR email IS NULL)queryWrapper.gt("age", 20) .like("name", "a") .or() .isNull("email");// 用户名中包含有a 且 (年龄大于18或邮箱为null)// UPDATE user SET age=#63;, email=#63; WHERE is_deleted=0 AND (name LIKE #63; AND (age gt; #63; OR email IS NULL))queryWrapper.like("name", "a") .and(i -gt; i.gt("age", 18).or().isNull("email"));

??综上:Lambda表达式中的条件会整体优先。如果它们没有被括起来并影响结果,你需要写Lambda表达式。具体用途取决于业务SQL语句。


1.3 实现子查询@Testpublic void sonSelectTest() { QueryWrapperlt;Usergt; queryWrapper = new QueryWrapperlt;gt;(); queryWrapper.inSql("id", "select id from user where id lt;= 100"); // SELECT id,name,age,email,is_deleted FROM user WHERE is_deleted=0 AND (id IN (select id from user where id lt;= 100)) Listlt;Usergt; users = mapper.selectList(queryWrapper); users.forEach(System.out::println);}


2 updateWrapper构造器


2.1 升级修改方法(无需创建对象)

修改条件:用户名包含一个和(年龄大于20或电子邮件为空)

@Testpublic void updateWrapperTest() { UpdateWrapperlt;Usergt; updateWrapper = new UpdateWrapperlt;gt;(); updateWrapper.like("name", "a") .and(i -gt; i.gt("age", 20).or().isNull("email")); updateWrapper.set("name", "小黑").set("email", "dhsjfghr"); // UPDATE user SET name=#63;,email=#63; WHERE is_deleted=0 AND (name LIKE #63; AND (age gt; #63; OR email IS NULL)) int result = mapper.update(null, updateWrapper); System.out.println("修改的行数为" + result);}

从SQL中可以看出,updateWrapper和queryWrapper具有相同的修改功能和相同的调用方法(mapper.update)。两者的区别在于,updateWrapper可以通过使用set方法直接设置修改后的字段值,而无需创建实体类对象。


2.2 实际开发时的应用

??在实际开发中,queryWrapper和updateWrapper都应该使用条件构造函数在一定的判断下拼接条件。例如,只有当请求传递的值不是空时,才能为该字段设置条件,如下面的代码。

@Testpublic void ifTest() { String userName = ""; Integer ageBegin = 20; Integer ageEnd = 30; QueryWrapperlt;Usergt; queryWrapper = new QueryWrapperlt;gt;(); if (StringUtils.isNotBlank(userName)) { queryWrapper.like("name", userName); } if (ageBegin != null) { queryWrapper.ge("age", ageBegin); } if (ageEnd != null) { queryWrapper.le("age", ageEnd); } Listlt;Usergt; users = mapper.selectList(queryWrapper);}

??但是,上面的代码使用了很多多余的if判断,所以很多方法都有一个条件参数。当该参数为真时,查询条件将被拼接。下面的代码用来替换上面那堆if判断。

QueryWrapperlt;Usergt; queryWrapper = new QueryWrapperlt;gt;();queryWrapper.like(StringUtils.isNotBlank(userName), "name", userName) .ge(ageBegin != null, "age", ageBegin) .le(ageEnd != null, "age", ageEnd);


3 lambdaXxxWrapper构造器

??LambdaXxxWrapper和XxxWrapper的区别在于,它们可以使用lambda直接调用对象的getter方法来指定字段,而不需要在数据库中比较字段名,从而避免了参数与数据库字段不对应的问题。除了调用字段时的写法不同,其他写法都是一样的。


3.1 lambdaQueryWrapper构造器@Testpublic void lambdaQueryWrapperTest() { String userName = ""; Integer ageBegin = 20; Integer ageEnd = 30; LambdaQueryWrapperlt;Usergt; lambdaQueryWrapper = new LambdaQueryWrapperlt;gt;(); lambdaQueryWrapper.like(StringUtils.isNotBlank(userName), User::getName, userName) .ge(ageBegin != null, User::getAge, ageBegin) .le(ageEnd != null, User::getAge, ageEnd); Listlt;Usergt; users = mapper.selectList(lambdaQueryWrapper);}


3.2 lambdaUpdateWrapper构造器@Testpublic void lambdaUpdateWrapperTest() { LambdaUpdateWrapperlt;Usergt; lambdaUpdateWrapper = new LambdaUpdateWrapperlt;gt;(); lambdaUpdateWrapper.like(User::getName, "a") .and(i -gt; i.gt(User::getAge, 20).or().isNull(User::getEmail)); lambdaUpdateWrapper.set(User::getName, "小黑").set(User::getEmail, "dhsjfghr"); // UPDATE user SET name=#63;,email=#63; WHERE is_deleted=0 AND (name LIKE #63; AND (age gt; #63; OR email IS NULL)) int result = mapper.update(null, lambdaUpdateWrapper); System.out.println("修改的行数为" + result);}

关于Mybatis-Plus包装器条件构造器的超级详细教程这篇文章到此为止。关于Mybatis-Plus包装器条件构造函数的更多信息

0

精彩评论

暂无评论...
验证码 换一张
取 消