一、数组分页
原理:进行数据库查询操作时,获取到数据库中满足条件的记录,保存在对应的List集合中,通过List.subList方法,截取到满足条件的所有记录。
实现:
首先是dao层,创建UserMapper接口,用于对数据库的操作。在接口中定义查询数据的方法,如下:
List queryUsers();
创建UserMapper.xml,编写查询的SQL语句,如下:
创建UserService接口,定义实现分页的方法
List queryUsers(Integer page,Integer limit);
接下来编写UserServiceImpl实现类,编写具体的分页实现操作:
public List queryUsers(Integer page, Integer limit) {
//从第几条数据开始
int fromIndex = (page-1)*limit;
//到第几条数据结束
int toIndex = page*limit;
//使用subList方法截取满足条件的数据
return userMapper.queryUsers().subList(fromIndex, toIndex);
}
最后在controller编写测试代码,这里我前端使用的事LayUI框架,所以对返回数据进行了封装,如下所示:
@GetMapping(value = "queryUsers",produces = "application/json; charset=UTF-8")
@ResponseBody
public ApiResponse queryUsers(Integer page, Integer limit) {
List queryUsers = userService.queryUsers(page, limit);
int countAll = userService.countAll();
if (queryUsers.size() > 0) {
return ApiResponse.ofSuccess(queryUsers, countAll);
}
return ApiResponse.ofMessage(500, "无数据");
}
测试结果:
缺点:当查询数据量大的时候,每次查询对数据库和程序的性能都会产生极大的影响,适合操作数据量小的情况下使用
二、limit分页
首先还是在UserMapper添加分页查询的方法:
List queryByLimit(@Param("offset") Integer offset, @Param("limit") Integer limit);
在UserMapper.xml添加具体的操作方法:
接着编写service层,编写UserService接口以及实现类UserServiceImpl对分页方法的操作:
List selectByLimit(Integer page, Integer limit);
public List selectByLimit(Integer page, Integer limit) {
int offset = (page - 1) * limit;
return userMapper.queryByLimit(offset, limit);
}
最后controller编写测试方法:
@GetMapping(value = "queryByLimit",produces = "application/json; charset=UTF-8")
@ResponseBody
public ApiResponse queryByLimit(Integer page, Integer limit) {
List queryUsers = userService.queryByLimit(page, limit);
int countAll = userService.countAll();
if (queryByLimit.size() > 0) {
return ApiResponse.ofSuccess(queryByLimit, countAll);
}
return ApiResponse.ofMessage(500, "无数据");
}
测试结果:
从输出结果可以看出与数据分页的查询结果是一直的,所以limit分页是没问题的。
缺点:虽然这里实现了按需查找,每次检索得到指定的数据,但是每次在分页时都要去编写limit语句,很冗余。而且不方便统一管理,维护性比较差。