文章目录
Wrapper条件构造器
条件构造器wrapper就是用来封装CRUD方法参数条件的一个接口,其底层有很多的子类,最主要的就是最下面的四个子类:
- queryWrapper可以用来删改查
- updateWrapper可以在修改操作时不必创建实体类对象的操作
- LambdaQueryWrapper和LambdaUpdateWrapper则是在字段参数的调用上进行了升级,其他都一样
因为增删改查中的增加记录不需要条件即可完成,所以增加方法无需条件构造器wrapper,其他的删改查则是有这个条件构造器参数的
1 queryWrapper构造器
1.1 组装删改查条件
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<User> 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<User> users = mapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
2 updateWrapper构造器
2.1 升级修改方法(无需创建对象)
2.2 实际开发时的应用
在实际开发中,不管是queryWrapper还是updateWrapper都应该在一定的判断下再去使用条件构造器拼接条件,比如说请求传过来的值在不为空的情况下才去对这个字段进行条件设置,比如下面的这段代码
@Test
public void ifTest() {
String userName = "";
Integer ageBegin = 20;
Integer ageEnd = 30;
QueryWrapper<User> 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<User> users = mapper.selectList(queryWrapper);
}
然而,上面的代码使用了很多的if判断显得过于冗余,于是许多的方法都带有一个condition参数,当这个参数为true的时候才会拼接查询条件,下面的代码用来代替上面一堆的if判断
QueryWrapper<User> 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<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.like(StringUtils.isNotBlank(userName), User::getName, userName)
.ge(ageBegin != null, User::getAge, ageBegin)
.le(ageEnd != null, User::getAge, ageEnd);
List<User> users = mapper.selectList(lambdaQueryWrapper);
}
3.2 lambdaUpdateWrapper构造器
@Test
public void lambdaUpdateWrapperTest() {
LambdaUpdateWrapper<User> 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);
}