上次我们学习了如何使用Mybatis-plus插件如何对数据进行分页展示,重复的代码这里不贴了。今天我们学习如何通过插件提供的"条件包装器"实现数据的条件查询及筛选等。
// 还是通过上一个示例,发送/user/findPage?pageNum=1&pageSzie=10获取分页的数据
// 我们这次不仅要分页的数据 还要条件满足的数据。
// IPage<T> selectPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);
// 插件提供的selectPage方法接收两个参数
// 第一个参数是用于构建分页条件的对象:
// com.baomidou.mybatisplus.extension.plugins.pagination.Page
// 第二个参数是用于构建条件查询的条件包装器
// com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
// 该类是一个包装器的抽象类
// QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper) 的父类
public abstract class AbstractWrapper<T> implements ISqlSegment {
public AbstractWrapper() {
}
// 里面定义了许多的方法实现 官网说明:
//用于生成 sql 的 where 条件, entity 属性也用于生成 sql 的 where 条件
//注意: entity 生成的 where 条件与 使用各个 api 生成的 where 条件没有任何关联行为
// 说多无益 我们用示例试一下吧
// 需求:根据name进行查询并分页
@PostMapping("findPage")
public IPage<Employee> findPage(Employee employee, Integer pageNum, Integer pageSize) {
// 构建查询的包装器对象
QueryWrapper qw = new QueryWrapper();
// eq(R column, Object val) 第一个参数是数据库字段名 第二个参数是字段值
// 效果:eq("name","李白") => WHERE name = "李白"
qw.eq("name", employee.getName());
return employeeMapper.selectPage(new Page(pageNum, pageSize), qw);
}
// 需求:根据name及address进行查询并分页
@PostMapping("findPage")
public IPage<Employee> findPage(Employee employee, Integer pageNum, Integer pageSize) {
// 构建查询的包装器对象
QueryWrapper qw = new QueryWrapper();
Map searchMap = new HashMap();
/**
* allEq(Map<R, V> params) 组合条件查询
* allEq(Map<R, V> params, boolean null2IsNull) 组合条件查询 如果null2IsNull为true value = null的值会以ISNULL查询 否则忽略
*/
// 构建查询条件
searchMap.put("name", employee.getName());
searchMap.put("address", employee.getAddress());
qw.allEq(searchMap, false);
// WHERE name = '李白' AND address = '长白山'
return employeeMapper.selectPage(new Page(pageNum, pageSize), qw);
}
// 需求:根据name及address进行查询并分页
@PostMapping("findPage")
public IPage<Employee> findPage(Employee employee, Integer pageNum, Integer pageSize) {
// 构建查询的包装器对象
// 如果查询条件正好对应bean的字段 则可以直接传入 也可以达到同上的效果 非常方便
QueryWrapper qw = new QueryWrapper(employee);
return employeeMapper.selectPage(new Page(pageNum, pageSize), qw);
}
// 需求:根据name及address进行查询并分页
@PostMapping("findPage")
public IPage<Employee> findPage(Employee employee, Integer pageNum, Integer pageSize) {
// 构建查询的包装器对象
QueryWrapper qw = new QueryWrapper();
// ne(column,val) --> 不等于 <> 效果: name <> 杜甫
qw.ne("name",employee.getName());
// gt(column,val) --> 大于 > 效果: id > 1
qw.gt("id",employee.getId());
// ge(column,val) --> 大于等于 >= 效果 : age >= 18
qw.ge("age",employee.getAge());
// ....还有很多的API都可以在官网上找到 如 like notLike between isNull
return employeeMapper.selectPage(new Page(pageNum, pageSize), qw);
}