MyBatisPlus系列之条件构造器 EntityWrapper

上篇:MyBatisPlus系列之通用CRUD操作

一、条件构造器 EntityWrapper

1、EntityWrapper简介

(1)Mybatis-Plus 通过 EntityWrapper(简称 EW,MP 封装的一个查询条件构造器)或者 Condition(与EW类似) 来让用户自由的构建查询条件,简单便捷,没有额外的负担,能够有效提高开发效率 

(2)实体包装器,主要用于处理 sql 拼接,排序,实体参数查询等 

(3)注意: 使用的是数据库字段,不是Java属性! 

(4)条件参数说明:

 本节,我们采用EntityWrapper,“ctrl+n”搜索查看它是继承Wrapper,如代码所示:

public class EntityWrapper<T> extends Wrapper<T> {

    /**
     * 数据库表映射实体类
     */
    protected T entity = null;

    public EntityWrapper() {
        /* 注意,传入查询参数 */
    }

    public EntityWrapper(T entity) {
        this.entity = entity;
    }

    public EntityWrapper(T entity, String sqlSelect) {
        this.entity = entity;
        this.sqlSelect = sqlSelect;
    }

    @Override
    public T getEntity() {
        return entity;
    }

    public void setEntity(T entity) {
        this.entity = entity;
    }

    /**
     * SQL 片段
     */
    @Override
    public String getSqlSegment() {
        /*
         * 无条件
		 */
        String sqlWhere = sql.toString();
        if (StringUtils.isEmpty(sqlWhere)) {
            return null;
        }

        /*
         * 根据当前实体判断是否需要将WHERE替换成 AND 增加实体不为空但所有属性为空的情况
		 */
        return isWhere != null ? (isWhere ? sqlWhere : sqlWhere.replaceFirst("WHERE", AND_OR)) : sqlWhere.replaceFirst("WHERE", AND_OR);
    }

 而在Wrapper里面,它是封装的有几个方法

2、需求

(1)条件构造器采用selectPage方法 ,查询分页操作

比如:年龄在18~50之间且性别为男且姓名为Tom的所有用户

代码实现:

	/**
	 * 条件构造器   查询操作
	 */
	@Test
	public void testEntityWrapperSelect() {
		//我们需要分页查询tbl_employee表中,年龄在18~50之间且性别为男且姓名为Tom的所有用户

		List<Employee> emps =employeeMapper.selectPage(new Page<Employee>(1, 2),
					new EntityWrapper<Employee>()
					.between("age", 18, 50)
					.eq("gender", 1)
					.eq("last_name", "Tom")
				);
		System.out.println(emps);


		}

打印输出:

 数据库的信息:

(2)条件构造器采用selectList方法 查询

比如:性别为女并且名字中带有"老师" 或者  邮箱中带有"a",代码实现:

	/**
	 * 条件构造器   查询操作
     * 查询tbl_employee表中, 性别为女并且名字中带有"老师" 或者  邮箱中带有"a"
	 */
	@Test
	public void testEntityWrapperSelect() {
				List<Employee> emps = employeeMapper.selectList(
				new EntityWrapper<Employee>()
				.eq("gender", 0)
				.like("last_name", "老师")
				//.or()    // SQL: (gender = ? AND last_name LIKE ? OR email LIKE ?)
				.orNew()   // SQL: (gender = ? AND last_name LIKE ?) OR (email LIKE ?)
				.like("email", "a")
				);
		System.out.println(emps);
		}

打印输出:

(3)条件构造器采用update方法实现修改操作

未修改前的数据:

代码实现:

	/**
	 * 条件构造器  修改操作
	 */
	@Test
	public void testEntityWrapperUpdate() {

		Employee employee = new Employee();
		employee.setLastName("王老师");
		employee.setEmail("cls@sina.com");
		employee.setGender(0);
		employeeMapper.update(employee,
				new EntityWrapper<Employee>()
						.eq("last_name", "小泽老师")
						.eq("age", 27)
		);
	}

 打印输出:

修改后的数据:

 

(4)条件构造器采用delete方法做删除操作

比如:删除名字为“Tom”,年龄23岁。 代码实现:

/**
	 * 条件构造器  删除操作
	 * 删除名字为“Tom”,年龄23岁
	 */
	@Test
	public void testEntityWrapperDelete() {

		employeeMapper.delete(
				new EntityWrapper<Employee>()
						.eq("last_name", "Tom")
						.eq("age", 23)
		);
	}

控制台打印输出:

删除前的数据:

 

删除后的数据:

(5)条件构造器采用EntityWrapper常用方法 

比如:查询性别为女的, 根据age进行排序(asc/desc), 简单分页

	/**
	 * 条件构造器   查询操作
	 */
	@Test
	public void testEntityWrapperSelect() {
		// 查询性别为女的, 根据age进行排序(asc/desc), 简单分页

		List<Employee> emps  = employeeMapper.selectList(
				new EntityWrapper<Employee>()
				.eq("gender", 0)
				.orderBy("age")
				//.orderDesc(Arrays.asList(new String [] {"age"}))
				.last("desc limit 1,3")
				);
		System.out.println(emps);


		}

控制台打印输出:

数据表的信息: 

 (6)条件构造器采用Condition的用法

比如:我们需要分页查询tbl_employee表中,年龄在18~50之间且性别为男且姓名为Tom的所有用户

/**
	 * 条件构造器   查询操作
	 */
	@Test
	public void testEntityWrapperSelect() {

		//我们需要分页查询tbl_employee表中,年龄在18~50之间且性别为男且姓名为Tom的所有用户

		List<Employee> emps =employeeMapper.selectPage(new Page<Employee>(1, 2),
					new EntityWrapper<Employee>()
					.between("age", 18, 50)
					.eq("gender", 1)
					.eq("last_name", "Tom")
				);

 控制台打印输出:

数据表的信息: 

 

 3、小结

MP: EntityWrapper Condition

条件构造器 MyBatis MBG : xxxExample→Criteria : QBC( Query By Criteria)

MyBatisPlus的QueryWrapper是一个强大的查询构造器,可以用于构建复杂的查询条件。使用QueryWrapper进行分页查询可以通过以下步骤实现: 1. 创建一个QueryWrapper对象,可以通过new关键字创建一个QueryWrapper的实例。 2. 调用QueryWrapper对象的方法,如eq、like、gt等方法,来设置查询条件。 3. 调用QueryWrapper对象的page方法,传入要查询的页码和每页显示的数量,来设置分页查询的参数。 4. 调用Mapper接口的selectPage方法,将QueryWrapper对象和分页参数传入,执行分页查询操作。 5. 获取查询结果,可以通过返回的IPage对象来获取查询到的数据和分页信息。 下面是一个示例代码: ```java import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.demo.mapper.UserMapper; import com.example.demo.entity.User; public class UserService { private UserMapper userMapper; public IPage<User> getUserPage(int pageNum, int pageSize, String username) { // 创建QueryWrapper对象 QueryWrapper<User> queryWrapper = new QueryWrapper<>(); // 设置查询条件 queryWrapper.like("username", username); // 创建分页对象 Page<User> page = new Page<>(pageNum, pageSize); // 执行分页查询 IPage<User> userPage = userMapper.selectPage(page, queryWrapper); return userPage; } } ``` 在上述示例代码中,我们首先创建了一个QueryWrapper对象,并设置了查询条件,然后创建了一个Page对象用于分页查询。最后,我们调用了selectPage方法,传入了QueryWrapper对象和分页参数,执行了分页查询操作。通过返回的IPage对象,我们可以获取到查询到的数据和分页信息。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [springboot整合MyBatisplus,实现分页查询、根据表自动生成代码、生成库里所有表对应的代码等功能](https://download.youkuaiyun.com/download/qq_33417321/88240573)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [MyBatis Plus之QueryWrapper分页查询示例](https://blog.youkuaiyun.com/weixin_41318009/article/details/107791736)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值