Wrapper :条件构造抽象类,最顶端父类。AbstractWrapper类比较重要。
AbstractWrapper类
是 QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper) 的父类。用于生成 sql 的 where 条件,,entity 属性也用于生成 sql 的 where 条件。
注意:
entity 生成的 where 条件与 使用各个 api 生成的 where 条件没有任何关联行为
AbstractWrapper抽象类提供的重要方法查看官方文档。
官方文档–条件构造器 AbstractWrapper方法:https://baomidou.com/pages/10c804/#abstractwrapper
注意:
对于CRUD操作,我们都可以使用条件构造器Wrapper来操作。
一、QueryWrapper/LambdaQueryWrapper
1、select方法
select方法:查询返回指定的部分字段数据。
select(String... sqlSelect)
select(Predicate<TableFieldInfo> predicate)
select(Class<T> entityClass, Predicate<TableFieldInfo> predicate)
1.1 QueryWrapper
QueryWrapper<UserDO> queryWrapper = new QueryWrapper<UserDO>();queryWrapper.select("id", "user_name", "height", "create_time");List<UserDO> userDOList = userService.list(queryWrapper);
1.2 LambdaQueryWrapper
QueryWrapper<UserDO> queryWrapper = new QueryWrapper<UserDO>();queryWrapper.lambda().select(UserDO::getId, UserDO::getUserName, UserDO::getHeight, UserDO::getCreateTime);List<UserDO> userDOList = userService.list(queryWrapper);
2、eq方法
eq(R column, Object val)
eq(boolean condition, R column, Object val)
注意:boolean condition 是控制该字段是否拼接到最终的sql语句中。如果为 true时,才会生成 sql 的 where 条件。
2.1 QueryWrapper
QueryWrapper<UserDO> queryWrapper = new QueryWrapper<UserDO>();queryWrapper.select("id", "user_name", "height", "create_time").eq("user_name", "赵子龙");List<UserDO> userDOList = userService.list(queryWrapper);
2.2 LambdaQueryWrapper
QueryWrapper<UserDO> queryWrapper = new QueryWrapper<UserDO>();queryWrapper.lambda().select(UserDO::getId, UserDO::getUserName, UserDO::getHeight, UserDO::getCreateTime).eq(false,UserDO::getUserName, "赵子龙"); //不会生成 sql 的 where 条件List<UserDO> userDOList = userService.list(queryWrapper);
通过上面的使用,对 QueryWrapper和 LambdaQueryWrapper的使用有些认知吧,后面更多使用,自行了解。
3、分页查询
@Testpublic void testPageWrapper() {System.out.println(("----- 分页查询 method test ------"));QueryWrapper<UserDO> queryWrapper = new QueryWrapper<UserDO>();queryWrapper.lambda().select(UserDO::getId, UserDO::getUserName, UserDO::getHeight, UserDO::getCreateTime).eq(false,UserDO::getUserName, "赵子龙") //不会生成 sql 的 where 条件.or().le(UserDO::getAge, 20);Page<UserDO> page = new Page<>(2, 4);Page<UserDO> userPage = userService.page(page, queryWrapper);System.out.println("当前页:" + userPage.getCurrent());System.out.println("总页数:" + userPage.getPages());System.out.println("记录数:" + userPage.getTotal());System.out.println("是否有上一页:" + userPage.hasPrevious());System.out.println("是否有下一页:" + userPage.hasNext());System.out.println("所有记录数据如下:");userPage.getRecords().forEach(System.out::println);}
4、and与or的嵌套
实例如下:
// A or (B and C)
queryWrapper.eq("a", "A").or(wrapper -> wrapper.eq("b", "B").eq("c", "C"));// A or (B or C)
queryWrapper.eq("a", "A").or(wrapper -> wrapper.eq("b", "B").or().eq("c", "C"));// A and (B and C)
queryWrapper.eq("a", "A").and(wrapper -> wrapper.eq("b", "B").eq("c", "C"));// A and (B or C)
queryWrapper.eq("a", "A").and(wrapper -> wrapper.eq("b", "B").or().eq("c", "C"));
二、UpdateWrapper/LambdaUpdateWrapper
1、set方法和setSql方法
set(String column, Object val)
set(boolean condition, String column, Object val)
setSql(String sql)
1.1 UpdateWrapper
UpdateWrapper<UserDO> updateWrapper = new UpdateWrapper<UserDO>();updateWrapper.set("user_name","赵子龙updateWrapper").set("age","22").setSql("height = '1.80'").eq("id", "7");boolean update = userService.update(updateWrapper);
1.2 LambdaUpdateWrapper
UpdateWrapper<UserDO> updateWrapper = new UpdateWrapper<UserDO>();updateWrapper.lambda().set(UserDO::getUserName, "赵子龙LambdaUpdateWrapper").set(UserDO::getAge, 21).setSql("height = '1.80'").eq(true,UserDO::getId, 7);boolean update = userService.update(updateWrapper);
2、使用 update(T entity, Wrapper updateWrapper)方法
default boolean update(Wrapper<T> updateWrapper) {return this.update((Object)null, updateWrapper);}default boolean update(T entity, Wrapper<T> updateWrapper) {return SqlHelper.retBool(this.getBaseMapper().update(entity, updateWrapper));}
使用 T entity主要就是先在UpdateWrapper中设置查询条件,再通过实体类去设置要修改的值,也就是sql语句中的set内容,这种是比较符合mybatis plus的语句。
注意:
- 如果修改的值较少时,则推荐第一种方式。
- 如果修改的值比较多时,推荐用第二种方式。
这里以 LambdaUpdateWrapper为例。
@Testpublic void testLambdaUpdateWrapper2() {System.out.println(("----- LambdaUpdateWrapper修改(使用 entity) method test ------"));// 需要修改的字段UserDO userDO = new UserDO();userDO.setUserName("赵子龙LambdaUpdateWrapper");userDO.setAge(20);userDO.setHeight(1.88);userDO.setEmail("zhaoyun@123.com");userDO.setUpdateTime(new Date());UpdateWrapper<UserDO> updateWrapper = new UpdateWrapper<UserDO>();updateWrapper.lambda().eq(UserDO::getUserName, "赵子龙").or().eq(true,UserDO::getId, 7);boolean update = userService.update(userDO, updateWrapper);System.out.println("update = " + update);}
通过上面的使用,对 UpdateWrapper和 LambdaUpdateWrapper,以及 update方法的使用有些认知吧,后面更多使用,自行了解。
– 求知若饥,虚心若愚。