DBAPI 实现分页查询的两种方法
DBAPI 实现分页查询的两种方法
背景
在进行分页查询时,用户通常需要传入当前页码 pageNo
和每页显示的条数 pageSize
参数。根据这两个参数,我们可以从数据库中查询出当前页的数据。以 MySQL 为例,分页查询的 SQL 语句如下:
select * from t_user limit 30, 10
这里的 limit 30, 10
表示从第 31 条记录开始,查询 10 条记录。
参数动态计算
在 DBAPI 中,参数注入 SQL 的写法如下:
select * from t_user limit #{offset}, #{pageSize}
而这里的 offset
参数每次都要根据 pageNo
和 pageSize
动态计算,具体公式为 offset = (pageNo - 1) * pageSize
。
为了解决这个动态计算的需求,DBAPI 提供了两种实现方案:第一种是使用参数处理插件,第二种是使用动态 SQL 中的 bind
标签。
方案 1 - 参数处理插件
- 访问插件市场,下载分页插件,上传到 DBAPI 的
extlib
目录或者lib
目录下,重启 DBAPI 服务。
-
创建 API,添加参数
pageNo
和pageSize
。API 必须至少包含这两个参数,且必须是bigint类型,
pageNo
表示当前第几页,pageSize
表示每页显示的条数。
-
SQL 编写
SQL 中使用参数
offset
和pageSize
,offset
表示查询记录的开始位置,pageSize
表示每页显示的条数。select * from student limit #{offset}, #{pageSize}
-
在
全局插件-参数处理
中选择分页插件
。插件参数不用填写,为非必填项。
使用此插件,系统会自动生成一个新的参数
offset
,值为(pageNo - 1) * pageSize
。 -
测试
保存 API,请求测试可以看到分页成功。
注意此插件在个人版
4.0.16
及以上、企业版4.1.10
及以上版本支持。
方案 2 - 动态 SQL 中的 bind 标签
-
创建 API,添加参数
pageNo
和pageSize
。API 必须至少包含这两个参数,且必须是bigint类型,
pageNo
表示当前第几页,pageSize
表示每页显示的条数。
-
SQL 编写
SQL 中使用参数
offset
和pageSize
,offset
表示查询记录的开始位置,pageSize
表示每页显示的条数。DBAPI 支持类似 mybatis 的动态 SQL 标签语法,
offset
使用<bind>
标签创建出来。<bind name="offset" value="(pageNo - 1) * pageSize" /> select * from student limit #{offset}, #{pageSize}
-
测试
保存 API,请求测试可以看到分页成功。