一、条件构造器 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)