1. PageHelper插件
分页功能说明
分页功能介绍
分页查询功能,客户端通常需要我们提供两项数据:
- 数据列表:用于展示给用户看的数据;用户每次点击某一页的按钮,就要去服务端加载这一页的数据列表
- 总数量:客户端得到总数量后,可以根据每页几条计算分了多少页,从而显示页码按钮
原始分页功能的实现方式
服务端要准备以上两项数据,需要:
- 执行SQL语句查询总数量:select count(*) from emp where gender = 1
- 执行SQL语句查询数据列表:select * from emp where gender = 1 limit 0, 5
存在的问题:
- 有两条SQL语句,Mapper接口里要写两个方法;
- 两条SQL语句的where条件相同
PageHelper介绍
分页插件PageHelper官网:pagehelper.github.io/
PageHelper是一款开源的Mybatis插件,可以帮我们简化分页功能的实现
PageHelper的使用
- 添加依赖坐标
<!--PageHelper分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.2</version>
</dependency>
- 使用方式:在调用Mapper时,按照如下步骤
//1. 开启分页
PageHelper.startPage(页码,每页几条);
//2. 查询列表:SQL语句里不要加limit,只要查询列表就行.
// 例如 select * from emp where... 不要再加limit
List<Emp> empList = empMapper.selectList();
//3. 获取分页结果
Page<Emp> page = (Page<Emp>)empList;
long total = page.getTotal(); //获取总数量
2. 分页查询员工-带条件
需求
根据页面提交的搜索条件,分页查询员工列表
分析
实现
PageBean
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageBean<T> {
private Integer total;
private List<T> rows;
}
EmpController
/**
* 员工管理Controller
*/
@Slf4j
@RestController
@RequestMapping("/emps")
public class EmpController {
@Autowired
private EmpService empService;
@GetMapping
public Result queryEmpsByPage(@RequestParam(value = "page", defaultValue = "1") Integer page,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
String name, Integer gender,
@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){
PageBean<Emp> pageBean = empService.queryEmpsByPage(name, gender, begin, end, page, pageSize);
return Result.success(pageBean);
}
}
EmpService
public interface EmpService {
PageBean<Emp> queryEmpsByPage(String name, Integer gender, LocalDate begin, LocalDate end, Integer page, Integer pageSize);
}
EmpServiceImpl
@Service
public class EmpServiceImpl implements EmpService {
@Autowired
private EmpMapper empMapper;
@Override
public PageBean<Emp> queryEmpsByPage(String name, Integer gender, LocalDate begin, LocalDate end, Integer page, Integer pageSize) {
//开启分页
PageHelper.startPage(page, pageSize);
//查询列表
List<Emp> empList = empMapper.selectList(name, gender, begin, end);
//得到分页结果
Page<Emp> p = (Page<Emp>) empList;
//封装PageBean对象
PageBean<Emp> pageBean = new PageBean<>();
pageBean.setTotal((int) p.getTotal());
pageBean.setRows(empList);
return pageBean;
}
}
EmpMapper(方式1)
/**
* 员工管理
*/
@Mapper
public interface EmpMapper {
List<Emp> selectList(String name, Integer gender, LocalDate begin, LocalDate end);
}
EmpMapper.xml(方式2)
xml映射文件:要和Mapper接口同名同包
xml内容:
- mapper标签的namespace必须是Mapper接口的全限定类名;
- select标签的id必须是对应的方法名
- select标签必须有resultType,是JavaBean的全限定类名,表示要把查询结果封装成什么类型的对象
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sdf.mapper.EmpMapper">
<select id="selectList" resultType="com.itheima.pojo.Emp">
select * from emp
<where>
<if test="name!=null and name.length()>0">
and name like concat('%', #{name}, '%')
</if>
<if test="gender!=null">
and gender = #{gender}
</if>
<if test="begin!=null">
and entrydate >= #{begin}
</if>
<if test="end!=null">
and entrydate <= #{begin}
</if>
</where>
</select>
</mapper>