Mybatis的几种分页方式(数组分页、limit分页)

一、数组分页

原理:进行数据库查询操作时,获取到数据库中满足条件的记录,保存在对应的List集合中,通过List.subList方法,截取到满足条件的所有记录。

实现:

首先是dao层,创建UserMapper接口,用于对数据库的操作。在接口中定义查询数据的方法,如下:

List<User> queryUsers();

创建UserMapper.xml,编写查询的SQL语句,如下:

<select id="queryUsers" resultMap="BaseResultMap">
	SELECT id, nickname, name, pwd, e_mail, is_enable, last_modify_date
	FROM user
</select>

创建UserService接口,定义实现分页的方法

List<User> queryUsers(Integer page,Integer limit);

接下来编写UserServiceImpl实现类,编写具体的分页实现操作:

public List<User> 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<User> 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<User> queryByLimit(@Param("offset") Integer offset, @Param("limit") Integer limit);

在UserMapper.xml添加具体的操作方法:

<select id="queryByLimit" resultMap="BaseResultMap">
	SELECT id, nickname, name, pwd, e_mail, is_enable, last_modify_date
	FROM user limit #{offset},#{limit}
</select>

接着编写service层,编写UserService接口以及实现类UserServiceImpl对分页方法的操作:

List<User> selectByLimit(Integer page, Integer limit);
public List<User> 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<User> queryUsers = userService.queryByLimit(page, limit);
	int countAll = userService.countAll();
	if (queryByLimit.size() > 0) {
		return ApiResponse.ofSuccess(queryByLimit, countAll);
	}
	return ApiResponse.ofMessage(500, "无数据");
}

测试结果:

从输出结果可以看出与数据分页的查询结果是一直的,所以limit分页是没问题的。

缺点:虽然这里实现了按需查找,每次检索得到指定的数据,但是每次在分页时都要去编写limit语句,很冗余。而且不方便统一管理,维护性比较差。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值