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 QueryWrapperQueryWrapper<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、分页查询@Test public 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); }
实例如下:
// 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为例。
@Test public 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方法的使用有些认知吧,后面更多使用,自行了解。
– 求知若饥,虚心若愚。
