在这里插入图片描述
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、分页查询

	@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);
	}

在这里插入图片描述

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为例。

	@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方法的使用有些认知吧,后面更多使用,自行了解。

– 求知若饥,虚心若愚。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐