目录
3.4、wapper条件构造器
- Wrapper : 条件构造抽象类,最顶端父类
- AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
- QueryWrapper : 查询条件封装
- UpdateWrapper : Update 条件封装
- AbstractLambdaWrapper : 使用Lambda 语法
- LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
- LambdaUpdateWrapper : Lambda 更新封装Wrapper
- AbstractChainWrapper
- LambdaUpdateChainWrapper
- LambdaUpdateChainWrapper
- UpdateChainWrapper
- QueryChainWrapper
- AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
3.4.1、AbstractWrapper
AbstractWrapper 及其子类主要用来生成 where 后的sql 条件。类似动态SQL生成。
1、allEq
可以拼接所有符合条件的数据。(= 或 is null)
-
不包含null
@Test public void testServcie(){ //使用条件构造器创建条件 QueryWrapper<User> userWrapper = new QueryWrapper<>(); Map<String,String> map = new HashMap<>(); map.put("username","root"); map.put("password","123456"); userWrapper.allEq(map); //传递条件构造器 User one = userService.getOne(userWrapper); System.out.println(one); }
-
包含null
-
不含 null2IsNull 参数
@Test public void testServcie(){ //使用条件构造器创建条件 QueryWrapper<User> userWrapper = new QueryWrapper<>(); Map<String,String> map = new HashMap<>(); map.put("username","root"); map.put("password",null); userWrapper.allEq(map); //传递条件构造器 User one = userService.getOne(userWrapper); System.out.println(one); }
-
含 null2IsNull 参数
@Test public void testServcie(){ //使用条件构造器创建条件 Map<String,String> map = new HashMap<>(); map.put("username","admin"); map.put("password",null); QueryWrapper<User> userWrapper1 = new QueryWrapper<>(); userWrapper1.allEq(map,true); //传递条件构造器 User one = userService.getOne(userWrapper1); System.out.println("null2IsNull 为true:"+one); QueryWrapper<User> userWrapper2 = new QueryWrapper<>(); userWrapper2.allEq(map,false); //传递条件构造器 User one1 = userService.getOne(userWrapper2); System.out.println("null2IsNull 为false:"+one1); }
-
-
过滤器过滤出指定的条件,只要符合条件的参数才会被拼接
@Test public void testServcie(){ QueryWrapper<User> userWrapper = new QueryWrapper<>(); Map<String,String> map = new HashMap<>(); map.put("user_id","1"); map.put("username","admin"); map.put("password","123456"); //只要username和password的参数才会有效 userWrapper.allEq((k,v)->(k.equals("username") || k.equals("password") ),map); User one = userService.getOne(userWrapper); }
2、比较运算符拼接
-
eq:等于
-
ne:不等于<>
-
gt:大于>
-
ge:大于等于>=
-
lt:小于<
-
le:小于等于 <=
-
between:在某个区间内 BETWEEN [ ] AND [ ]
-
notBetween:不在区间内 NOT BETWEEN [] AND []
-
isNull、isNotNull:专门用来判断是否为null
-
in:判断是否在集合中
-
notIn:和in相反
@Test
public void testServcie(){
QueryWrapper<User> userWrapper = new QueryWrapper<>();
//id在(1,2,3,4,5,6,7,8,9),且deleted为1,且密码不为123456的
userWrapper.in("user_id",1,2,3,4,5,6,7,8,9)
.eq("deleted",1)
.ne("password","123456");
List<User> list = userService.list(userWrapper);
list.forEach(System.out::println);
}
3、子查询
-
inSql:in 后面可以跟集合,也可以跟一个select语句
-
notinSQL:和inSql相反
-
exists:拼接 EXISTS ( sql语句 )
-
notExists
4、GROUP BY分组
需要配合 QueryWrapper 中 select 方法使用。
-
groupBu:分组
-
having:对分组后的数据进行过滤
5、ORDER BY排序
-
orderByAsc:相当于 ORDER BY 字段, … ASC。升序排列
-
orderByDesc:相当于 ORDER BY 字段, … DESC。降序排列
-
orderBy:相当于 ORDER BY 字段, …
@Test
public void testServcie(){
QueryWrapper<User> userWrapper = new QueryWrapper<>();
//逆序
userWrapper.in("user_id",1,2,3)
.orderBy(true,false,"user_id");
List<User> list = userService.list(userWrapper);
list.forEach(System.out::println);
}
6、逻辑符号
and 和 or 方法都是可以嵌套的。
-
AND():默认的拼接都是AND
@Test public void testServcie(){ QueryWrapper<User> userWrapper = new QueryWrapper<>(); userWrapper.eq("user_id",1) .eq("username","root"); List<User> list = userService.list(userWrapper); list.forEach(System.out::println); }
-
OR():将默认的AND 变成OR
@Test public void testServcie(){ QueryWrapper<User> userWrapper = new QueryWrapper<>(); userWrapper.eq("user_id",1) .or().eq("username","root"); List<User> list = userService.list(userWrapper); list.forEach(System.out::println); }
-
nested:正常嵌套 不带 AND 或者 OR
7、apply
该方法可用于数据库函数 动态入参的params
对应前面applySql
内部的{index}
部分.这样是不会有sql注入风险的,反之会有!
8、模糊查询
-
like:用于模糊匹配
-
notLike,和like相反
@Test
public void testServcie(){
QueryWrapper<User> userWrapper = new QueryWrapper<>();
//密码包含123的
userWrapper.in("user_id",1,2,3,4,5)
.like("password","%123%");
List<User> list = userService.list(userWrapper);
list.forEach(System.out::println);
}
3.4.2、QueryWrapper
QueryWrapper 继承 AbstractWrapper,主要用于查询数据,select 是用来明确返回那些字段
配合之前的分组查询进行测试
@Test
public void testServcie(){
QueryWrapper<User> userWrapper = new QueryWrapper<>();
//返回字段 deleted, COUNT(*), GROUP_CONCAT(username)
userWrapper.select("deleted, COUNT(*),GROUP_CONCAT(username)")
.in("user_id",1,2,3,4,5)
.groupBy("deleted");
List<Map<String, Object>> maps = userService.listMaps(userWrapper);
maps.forEach(System.out::println);
}
3.4.3、UpdateWrapper
继承自 AbstractWrapper,主要用于数据的增伤改。
1、set
SQL 的 SET 字段。
@Test
public void testServcie(){
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("user_id",9)
.set("username","updateWrapper")
.set("password","8000");
boolean update = userService.update(updateWrapper);
System.out.println(update);
}
2、setSql
和set是类似的,只不过参数的形式不一样。
@Test
public void testServcie(){
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
//setSql是在一个参数里写的条件,没有将字段和值分开
updateWrapper.eq("user_id",9)
.setSql("username='setSql'")
.setSql("password='753159'");
boolean update = userService.update(updateWrapper);
System.out.println(update);
}
3.4.4、支持Lambda
LambdaUpdateWrapper 和 LambdaQueryWrapper 的使用其实是类似的,只不过这两个类可以直接使用Lambda的表达式。
获取方式:
//1、直接创建LambdaUpdateWrapper 和 LambdaQueryWrapper
LambdaUpdateWrapper<User> lambda =new LambdaUpdateWrapper<>();
LambdaQueryWrapper<User> lambda1 = new LambdaQueryWrapper<>();
//2、可以直接使用 QueryWrapper 和 UpdateWrapper 提供的lambda();方法
LambdaQueryWrapper<User> lambda1 = queryWrapper.lambda();
LambdaUpdateWrapper<User> lambda2 = updateWrapper.lambda();
@Test
public void testServcie(){
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//可以使用lambda表达式形式的参数
updateWrapper.lambda()
.set(User::getUsername,"lambda表达式")
.set(User::getPassword,"2312312");
}