跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

Mybatis-Plus Wrapper条件构造器超详细使用教程

目录Wrapper条件构造器1 queryWrapper构造器1.1 组装删改查条件1.2 条件优先级1.3 实现子查询2 updateWrapper构造器2.1 升级修改方法(无需创建对象) 2.2 实际开发时的应用3 lambdaXxxWrapper构造器3.1 lambdaQueryWrapper构造器3.2 lambdaUpdateWrapper构造器Wrapper条件构造器条件构造器wrapper就是用来封装CRUD方法参数条件的一个接口,其底层有很多的子类,最主要的就是最下面的四个子类:queryWrapper可以用来删改查updateWrapper可以在修改操作时不必创建实体类对象的操作LambdaQueryWrapper和LambdaUpdateWrapper则是在字段参数的调用上进行了升级,其他都一样因为增删改查中的增加记录不需要条件即可完成,所以增加方法无需条件构造器wrapper,其他的删改查则是有这个条件构造器参数的

1 queryWrapper构造器1.1 组装删改查条件组装查询条件查询条件为:名字里包含a字母、年龄在20~30之间、email不为空的所有值,且查询到的值按照年龄降序排序,若年龄相同则按照id升序排序查询返回name、age、email字段@Test public void selectListTest() {QueryWrapper queryWrapper = new QueryWrapper<>();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 ? AND age BETWEEN ? AND ? AND email IS NOT NULL) ORDER BY age DESC,id ASC List> maps = mapper.selectMaps(queryWrapper);maps.forEach(System.out::println);System.out.println("========================================================================================");List users = mapper.selectList(queryWrapper);users.forEach(System.out::println);}⚠  selectMaps和selectList的区别在于:selectMaps会将查询到的结果封装在一个元素类型为map集合的list集合中,集合中只有查询返回字段所对应的键值对;而selectList的返回值也是一个list集合,只不过元素类型为对应的泛型,包含泛型所有的字段,查询返回字段之外的值都为null

组装删除条件删除条件:email不为空@Test public void deleteTest() {QueryWrapper queryWrapper = new QueryWrapper<>();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)或邮箱为null@Test public void updateTest() {User user = new User();user.setAge(20);user.setEmail("temporary.com");

QueryWrapper queryWrapper = new QueryWrapper<>();queryWrapper.gt("age", 20).like("name", "a").or().isNull("email");

// UPDATE user SET age=?, email=? WHERE is_deleted=0 AND (age > ? AND name LIKE ? OR email IS NULL) int result = mapper.update(user, queryWrapper);System.out.println("修改的行数为" + result);}1.2 条件优先级使用queryWrapper组装复杂条件的时候,存在一个且或条件的优先级问题,也就是说在实现多条件拼接的时候且或条件该如何拼接到一起,接下来就挑取两个例子来了解一下// (年龄大于20并且用户名中包含有a) 或 邮箱为null// UPDATE user SET age=?, email=? WHERE is_deleted=0 AND (age > ? AND name LIKE ? OR email IS NULL) queryWrapper.gt("age", 20).like("name", "a").or().isNull("email");

// 用户名中包含有a 且 (年龄大于18或邮箱为null)// UPDATE user SET age=?, email=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL)) queryWrapper.like("name", "a").and(i -> i.gt("age", 18).or().isNull("email"));总结一下:Lambda表达式中的条件会被当做一个整体优先执行,如果不括起来影响结果的话就需要使用Lambda表达式的写法,具体的使用要根据业务SQL语句来定1.3 实现子查询@Test public void sonSelectTest() {QueryWrapper queryWrapper = new QueryWrapper<>();queryWrapper.inSql("id", "select id from user where id <= 100");

// SELECT id,name,age,email,is_deleted FROM user WHERE is_deleted=0 AND (id IN (select id from user where id <= 100)) List users = mapper.selectList(queryWrapper);users.forEach(System.out::println);}2 updateWrapper构造器2.1 升级修改方法(无需创建对象)组装修改条件 修改条件:用户名中包含有a并且(年龄大于20或邮箱为null)@Test public void updateWrapperTest() {

UpdateWrapper updateWrapper = new UpdateWrapper<>();updateWrapper.like("name", "a").and(i -> i.gt("age", 20).or().isNull("email"));updateWrapper.set("name", "小黑").set("email", "dhsjfghr");

// UPDATE user SET name=?,email=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? 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都应该在一定的判断下再去使用条件构造器拼接条件,比如说请求传过来的值在不为空的情况下才去对这个字段进行条件设置,比如下面的这段代码@Test public void ifTest() {

String userName = "";Integer ageBegin = 20;Integer ageEnd = 30;

QueryWrapper queryWrapper = new QueryWrapper<>();

if (StringUtils.isNotBlank(userName)) {queryWrapper.like("name", userName);}if (ageBegin != null) {queryWrapper.ge("age", ageBegin);}if (ageEnd != null) {queryWrapper.le("age", ageEnd);}

List users = mapper.selectList(queryWrapper);}然而,上面的代码使用了很多的if判断显得过于冗余,于是许多的方法都带有一个condition参数,当这个参数为true的时候才会拼接查询条件,下面的代码用来代替上面一堆的if判断QueryWrapper queryWrapper = new QueryWrapper<>();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构造器@Test public void lambdaQueryWrapperTest() {

String userName = "";Integer ageBegin = 20;Integer ageEnd = 30;

LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();lambdaQueryWrapper.like(StringUtils.isNotBlank(userName), User::getName, userName).ge(ageBegin != null, User::getAge, ageBegin).le(ageEnd != null, User::getAge, ageEnd);

List users = mapper.selectList(lambdaQueryWrapper);}3.2 lambdaUpdateWrapper构造器@Test public void lambdaUpdateWrapperTest() {

LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>();lambdaUpdateWrapper.like(User::getName, "a").and(i -> i.gt(User::getAge, 20).or().isNull(User::getEmail));lambdaUpdateWrapper.set(User::getName, "小黑").set(User::getEmail, "dhsjfghr");

// UPDATE user SET name=?,email=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL)) int result = mapper.update(null, lambdaUpdateWrapper);System.out.println("修改的行数为" + result);}到此这篇关于Mybatis-Plus Wrapper条件构造器超详细使用教程的文章就介绍到这了,更多相关Mybatis-Plus Wrapper条件构造器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:mybatis-plus Wrapper条件构造器updateForSet更新方式Mybatis-Plus 条件构造器 QueryWrapper 的基本用法详解MyBatis-Plus Wrapper条件构造器查询大全Mybatis-Plus 条件构造器示例详解Mybatis-Plus条件构造器select方法返回指定字段方式mybatis-plus条件构造器的操作代码MyBatis-Plus条件构造器之condition参数的使用Mybatis-Plus条件构造器的具体使用方法MyBatis-Plus条件构造器Wrapper应用实例

相关文章