目录

  1. 手动分页
  2. Sql 分页
    1. SQL LIMIT 子句
    2. 实例代码
  3. 问题
  4. 附录

对于分页需求存在不同的实现方式,在这里收集了两种不同的实现方法

手动分页

查询出全部数据,随后再手动截取需要的部分,可能增加数据库压力

1
2
//Mybatis 接口
List<Student> queryStudentsByArray();
1
2
3
4
<!--Mapper 配置文件-->
<select id="queryStudentsByArray" resultMap="studentmapper">
select * from student
</select>
1
2
3
4
5
6
7
8
9
10
// Service 层
public List<Student> queryStudentsByArray(int currPage, int pageSize) {
//查询全部数据
List<Student> students = studentMapper.queryStudentsByArray();
//从第几条数据开始
int firstIndex = (currPage - 1) * pageSize;
//到第几条数据结束
int lastIndex = currPage * pageSize;
return students.subList(firstIndex, lastIndex); //直接在list中截取
}

随后通过Controller即可调用 Service 完成分页

Sql 分页

使用 Sql 语法,每次查询出需要的数据

SQL LIMIT 子句

要检索查询返回的行的一部分,使用 LIMITOFFSET 子句

1
2
3
4
5
6
SELECT
column_list
FROM
table1
ORDER BY column_list
LIMIT row_count OFFSET offset;
参数含义
row_count确定将返回的行数
OFFSET子句在开始返回行之前跳过的偏移行个数

OFFSET子句是可选的,如果同时使用LIMITOFFSET子句,OFFSET会在LIMIT约束行数之前先跳过偏移行,在使用LIMIT子句时,使用ORDER BY子句确保返回的行按指定顺序非常重要

实例代码

1
2
//mybatis接口
List<Student> queryStudentsBySql(Map<String,Object> data);
1
2
3
4
<!--Mapper 配置文件-->
<select id="queryStudentsBySql" parameterType="map" resultMap="studentmapper">
select * from student limit #{currIndex} , #{pageSize}
</select>
1
2
3
4
5
6
7
// Service 层
public List<Student> queryStudentsBySql(int currPage, int pageSize) {
Map<String, Object> data = new HashedMap();
data.put("currIndex", (currPage-1)*pageSize);
data.put("pageSize", pageSize);
return studentMapper.queryStudentsBySql(data);
}

问题

本小节将记录存在进行 MyBatis 分页时遇到的错误以及解决方案

附录

Mybatis 四种分页方式
Could not set parameters for mapping 错误与 mybatis 源码追踪
易百教程
【Mybatis】Mybatis 常见的分页实现方法