1、简介
为了实现简化操作,mybatis-plus 引入条件构造器简化基本 sql 操作,主要使用两种,一种是查询的条件构造器(QueryWrapper),另外一种是(UpdateWrapper),这些条件构造器主要关系如下:
2、查询条件构造(QueryWrapper 和 LambdaQueryWrapper在一起比较)
查询条件构造有两个,一个是 QueryWrapper 另一个是 LambdaQueryWrapper,LambdaQueryWrapper 是为了防止 QueryWrapper 构造条件的时候将字段名写错因发错误,因此 LambdaQueryWrapper 更加常用。下面就详细介绍两种条件构造的具体使用方式。
2.1、eq方法(ne方法同样用法)
// 两种写法
// 1、queryWrapper
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name","Jack");
// 2、LambdaQueryWrapper(常用)
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(User::getName,"Jack");
// 3、当为null的条件,我们是不需要进行查询条件拼接的,否则就会出现无法查询出结果,在构建lambdaQueryWrapper时判断
lambdaQueryWrapper.eq(name != null,User::getName,name);
2.2、allEq方法
// 等价与多个eq
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("name","Jone");
hashMap.put("age",null);
queryWrapper.allEq(hashMap,false);
// allEq(Map<R, V> params, boolean null2IsNull);
// 参数params: 表示传递的Map集合;
// 参数null2IsNull: 表示对于为null的条件是否判断isNul
2.3、gt & ge & lt & le & between & notBetween
下面使用 LambdaQueryWrapper 进行演示,如果使用 QueryWrapper 将lambda 表达式获取字段名写成具体的字段名即可。
lambdaQueryWrapper.gt(User::getAge,age); // 大于
lambdaQueryWrapper.ge(User::getAge,age); // 大于等于
lambdaQueryWrapper.lt(User::getAge,age); // 小于
lambdaQueryWrapper.le(User::getAge,age); // 小于等于
lambdaQueryWrapper.between(User::getAge,18,30); // 介于之间
lambdaQueryWrapper.notBetween(User::getAge,18,30); // 介于之间之外
2.4、like & notLike & likeLeft & likeRight
lambdaQueryWrapper.like(User::getName,"J"); // 封装的查询条件为 '%J%'
lambdaQueryWrapper.notLike(User::getName,"J");
lambdaQueryWrapper.likeLeft(User::getName,"J"); // 封装的查询条件为 '%J'
lambdaQueryWrapper.likeRight(User::getName,"J"); // 封装的查询条件为 'J%'
2.5、isNull & isNotNull
lambdaQueryWrapper.isNull(User::getName); // 拼接的查询条件为 name is null
lambdaQueryWrapper.isNotNull(User::getName); // 拼接的查询条件为 name is not null
2.6、in & notIn & inSql & notInSql
// 1、使用列表形式
ArrayList<Integer> arrayList = new ArrayList<>();
Collections.addAll(arrayList,18,20,21);
lambdaQueryWrapper.in(User::getAge,arrayList);
// 2、使用列举值形式
lambdaQueryWrapper.in(User::getAge,18,20,21);
// ================= notIn ====================
notIn用法和in相同
// ================= inSql ====================
lambdaQueryWrapper.inSql(User::getAge,"18,20,22"); // 拼接的sql为 age in (18,20,22)
lambdaQueryWrapper.inSql(User::getAge,"select age from user where age > 20"); //age in (select ...)
// ================= notInSql =================
lambdaQueryWrapper.notInSql(User::getAge,"18,20,22"); // 拼接的sql为 age not in (18,20,22)
lambdaQueryWrapper.notInSql(User::getAge,"select age from user where age > 20"); //age not in (select ...)
2.7、groupBy & having
// 设置条件,指定查询字段名称和分组字段
queryWrapper.groupBy("age");
queryWrapper.select("age,count(*) as field_count");
queryWrapper.having("field_count = 1");
List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
2.8、orderByAsc & orderByDesc & orderBy
// 指定的字段都为升序,按照先后顺序
lambdaQueryWrapper.orderByAsc(User::getAge,User::getId);
// 指定的字段都为降序,按照先后顺序
lambdaQueryWrapper.orderByDesc(User::getAge,User::getId);
// orderBy(boolean condition, boolean isAsc, R column, R... columns)
lambdaQueryWrapper.orderBy(true,true,User::getId);
lambdaQueryWrapper.orderBy(true,false,User::getAge);
2.9、func
lambdaQueryWrapper.func(i -> {if(true) {i.eq(User::getId, 1);}else {i.ne(User::getId, 1);}
});
// 拼接的sql为: where id = 1
2.10、and & or & nested
// 正常拼接默认就是and
lambdaQueryWrapper.gt(User::getAge,22).lt(User::getAge,30);
// 使用链式拼接,and嵌套
lambdaQueryWrapper.eq(User::getName,"wang").and(i -> i.gt(User::getAge,26).or().lt(User::getAge,22));
// or嵌套
lambdaQueryWrapper.eq(User::getName,"wang").or(i -> i.gt(User::getAge,22).lt(User::getAge,26));
// nested TODO
lambdaQueryWrapper.nested(i -> i.eq(User::getName, "Billie").ne(User::getAge, 22));
2.11、自定义查询条件(apply, last)
// apply
lambdaQueryWrapper.apply("id = 1"); // 拼接的sql为 where id = 1
// last
lambdaQueryWrapper.last("limit 0,2"); // 拼接的sql是在末尾加上 limit 0, 2
2.12、exists & notExists
// 判断指定sql是否能查询出数据,查询有结果返回true, 否则不查询。 where exists ...
lambdaQueryWrapper.exists("select id from powershop_user where age = 18");
// 判断指定sql是否能查询出数据,查询无结果查询, 否则不查询。 where not exists ...
lambdaQueryWrapper.notExists("select id from powershop_user where age = 18");
2.13、指定字段查询(select)
lambdaQueryWrapper.select(User::getId,User::getName); // 拼接的sql为 select id, name from ...
3、更新条件构造(UpdateWrapper 和 LambdaUpdateWrapper(常用))
UpdateWrapper 和 LambdaUpdateWrapper 与查询条件构造器在拼接条件时候使用方式基本一致,不同点是需要更新值,使用 set。具体细节不再赘述。
UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
userUpdateWrapper.set("aa",0);// UpdateWrapper 使用 lambda 方法后,可以使用lambda 表达式,可以链式编程,与LambdaUpdateWrapper 效果一致
userUpdateWrapper.lambda().set(User::getName,"aa");
LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
lambdaUpdateWrapper.set(User::getName,"bb");
总结:本文介绍了 mybatis-plus 使用条件构造器简化 sql 操作,方便快捷。
本人是一个从小白自学计算机技术,对运维、后端、各种中间件技术、大数据等有一定的学习心得,想获取自学总结资料(pdf版本)或者希望共同学习,关注微信公众号:it自学社团。后台回复相应技术名称/技术点即可获得。(本人学习宗旨:学会了就要免费分享)