一、Wrapper类层次结构

Wrapper : 条件构造抽象类,最顶端父类
- AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
--- QueryWrapper : 查询条件封装
--- UpdateWrapper : Update 条件封装
---AbstractLambdaWrapper : 使用Lambda 语法
------ LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
------- LambdaUpdateWrapper : Lambda 更新封装Wrapper
二、QueryWrapper完整示例
1. 组装查询条件(AND组合)
java
// QueryWrapper
// 1.组装查询条件,queryWrapper不可使用lamdbaWrapper的语法如实体类::get字段名,否则会报错
@Test
public void Test01(){
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
queryWrapper.like("name","s")
.between("age",21,25)
.isNotNull("a_email");
List<User> results=userService.list(queryWrapper);
results.forEach(System.out::println);
}
动态条件拼接逻辑参考
2. 组装排序条件
java
// 2.组装排序条件,Asc升序,Desc降序
@Test
public void Test02(){
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
// queryWrapper.orderByAsc("id").like("name","s");
queryWrapper.orderByDesc("id").like("name","s");
List<User> results=userService.list(queryWrapper);
results.forEach(System.out::println);
}
3. 组装删除条件
java
// 组装删除条件,实际是逻辑删除
@Test
public void Test03(){
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
queryWrapper.isNull("a_email");
boolean deleteResult=userService.remove(queryWrapper);
}
4. 组装SELECT子句
java
// 条件的优先级,and的优先级高于or的优先级,修改
// SELECT u_id AS id,name,age,a_email AS email,is_deleted FROM c_user WHERE is_deleted=0 AND (name LIKE ? AND age > ? AND a_email IS NOT NULL)
@Test
public void Test04(){
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
queryWrapper.like("name","s")
.gt("age",20)
.isNotNull("a_email");
User user = new User();
user.setAge(18);
user.setEmail("user@qcby.com");
boolean result= userService.update(user,queryWrapper);
}
5. 条件的优先级
java
// 条件的优先级,and的优先级高于or的优先级,修改
// SELECT u_id AS id,name,age,a_email AS email,is_deleted FROM c_user WHERE is_deleted=0 AND (name LIKE ? AND age > ? AND a_email IS NOT NULL)
@Test
public void Test04(){
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
queryWrapper.like("name","s")
.gt("age",20)
.isNotNull("a_email");
User user = new User();
user.setAge(18);
user.setEmail("user@qcby.com");
boolean result= userService.update(user,queryWrapper);
}
// 条件的优先级
// UPDATE c_user SET age=?, a_email=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR a_email IS NULL))
// 所以这个sql的运行,先运行(age > ? OR a_email IS NULL),再运行其他的
@Test
public void Test05(){
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
queryWrapper.like("name","s")
.and(i->i.gt("age",20).or().isNull("a_email"));
User user = new User();
user.setAge(18);
user.setEmail("user@qcby.com");
boolean result= userService.update(user,queryWrapper);
}
6.组装 select 子句
java
//5.组装select子句,这个是指定查询的字段
@Test
public void Test06(){
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
queryWrapper.select("name","age");
userService.list(queryWrapper);
}
7.实现子查询
java
// 实现子查询
// SELECT u_id AS id,name,age,a_email AS email,is_deleted FROM c_user WHERE is_deleted=0 AND (u_id IN (select u_id from c_user where u_id <= 3))
@Test
public void Test07(){
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
queryWrapper.inSql("u_id","select u_id from c_user where u_id <= 3");
userService.list(queryWrapper);
}
三、UpdateWrapper完整示例
java
// UpdateWrapper
@Test
public void test07(){
UpdateWrapper<User> updateWrapper=new UpdateWrapper<>();
updateWrapper.set("age",18)
.set("a_email", "user@qcby.com")
.like("name", "s")
.and(i->i.gt("age",20).or().isNull("a_email"));
userService.update(updateWrapper);
}
四、动态条件处理(Condition)
带Condition参数的重构
java
@Test
// 组装条件condition,if ,test
public void test08(){
String name=null;
Integer ageBegin = 10;
Integer ageEnd = 24;
QueryWrapper<User> queryWrapper=new QueryWrapper<>();
if (StringUtils.isNotBlank(name)){
queryWrapper.like("name","s");
}
if(ageBegin !=null){
queryWrapper.ge("age",ageBegin);
}
if(ageEnd!=null){
queryWrapper.le("age",ageEnd);
}
userService.list(queryWrapper);
}
java
// SELECT u_id AS id,name,age,a_email AS email,is_deleted FROM c_user WHERE is_deleted=0 AND (age >= ? AND age <= ?)
// 那个条件成立对应生成对应的where语句
@Test
public void test08UseCondition(){
String name = null;
Integer ageBegin = 10;
Integer ageEnd = 24;
// 判断字符串 name 是否为「非空且包含有效字符」
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StringUtils.isNotBlank(name),"name","s")
.ge(ageBegin!=null,"age",20)
.le(ageEnd!=null,"age",25);
userService.list(queryWrapper);
}
五、LambdaQueryWrapper完整示例
java
// LambdaQueryWrapper
@Test
public void test9(){
String name = "s";
Integer ageBegin = 10;
Integer ageEnd = 24;
LambdaQueryWrapper<User> queryWrapper=new LambdaQueryWrapper<>();
queryWrapper.like(StringUtils.isNotBlank(name),User::getName,name)
.ge(ageBegin != null, User::getAge, ageBegin)
.le(ageEnd != null, User::getAge, ageEnd);
userService.list(queryWrapper);
}
六、LambdaUpdateWrapper完整示例
java
// LambdaUpdateWrapper
@Test
public void test10(){
LambdaUpdateWrapper<User> updateWrapper=new LambdaUpdateWrapper<>();
updateWrapper.set(User::getAge,18)
.set(User::getEmail,"user@qcby.com")
.like(User::getName, "s")
.and(i->i.lt(User::getAge,24).or().isNull(User::getEmail));
User user = new User();
userService.update(user,updateWrapper);
}
七,测试过滤器
java
@Test
public void testWrapper(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 1. JDK1.8 兼容:用 HashMap 创建查询字段候选集(替代 Map.of())
Map<String, Object> queryMap = new HashMap<>();
queryMap
.put("id", 1);
queryMap
.put("name", "老王");
queryMap
.put("age", 30); // 取第二个代码的 age=30(替代原 null)
// 2. 保留原过滤器逻辑:只筛选字段名包含"a"的字段
queryWrapper
.allEq((field, value) -> field.contains("a"), queryMap);
userService.listMaps(queryWrapper);
}