Jalor 5 分页实现,那个 Jalor 框架(基于 Spring + Hibernate/MyBatis 的快速开发平台),它内部分页查询的机制大致是这样的:
🔹 Jalor 5 的分页实现原理
-
拦截 SQL
Jalor 5 并没有自己实现分页语法,而是通过 DAO 层封装 + Dialect 方言 来实现。- 如果你底层用 MyBatis,它会用类似 PageHelper / RowBounds 的方式,在执行 SQL 前加上
limit或者rownum包装。 - 如果你底层用 Hibernate,就用
setFirstResult()和setMaxResults()。
- 如果你底层用 MyBatis,它会用类似 PageHelper / RowBounds 的方式,在执行 SQL 前加上
-
统一的 Page 对象
Jalor 5 提供一个 Page 或类似的分页对象,里面有:pageNo(当前页)pageSize(每页大小)totalCount(总记录数)result(数据列表)
-
不同数据库的分页适配
Jalor 5 会根据配置的数据库方言(MySQL / Oracle / SQL Server / PostgreSQL)自动拼接对应的分页 SQL。- MySQL/PostgreSQL →
LIMIT ?, ? - Oracle < 12c →
ROWNUM包装 - Oracle ≥ 12c / SQL Server ≥ 2012 →
OFFSET ... FETCH - SQL Server 2008- →
ROW_NUMBER()包装
- MySQL/PostgreSQL →
-
调用方式
一般是:Page<User> page = userService.findPage(query, pageNo, pageSize);内部会先执行
SELECT COUNT(*)获取总数,再拼接带分页的 SQL 拿数据,最后组装成Page对象返回。
🔹 举个 Jalor 5 的分页 SQL 例子
假设是 MySQL:
-- 总数查询
SELECT COUNT(*) FROM user WHERE status = 1;
-- 数据查询
SELECT *
FROM user
WHERE status = 1
ORDER BY id
LIMIT 20, 10;
如果是 Oracle(11g):
SELECT *
FROM (
SELECT t.*, ROWNUM rn
FROM (
SELECT *
FROM user
WHERE status = 1
ORDER BY id
) t
WHERE ROWNUM <= 30
)
WHERE rn > 20;
⚡ 也就是说:Jalor 5 并不是直接写分页 SQL,而是通过方言适配器自动生成的。
Jalor 5 分页流程图(从前端传 pageNo/pageSize → Service → DAO → SQL → Page 对象返回)。
Jalor 6 分页实现,我查过这个框架的升级说明,和 Jalor 5 相比,分页这块有明显的调整:
🔹 Jalor 6 分页机制
-
底层 ORM 变化
Jalor 5 多是基于 Hibernate/MyBatis 混合,分页靠 Hibernate 的setFirstResult/setMaxResults或 MyBatis 的拦截器。
Jalor 6 改成更贴近 MyBatis 的方式,内部自带分页插件(类似 PageHelper),而不是自己再封装一层 Hibernate 兼容。 -
统一分页接口
Jalor 6 内部提供统一的Page<T>对象,和 5 代类似:public class Page<T> { private int pageNo; // 当前页 private int pageSize; // 每页大小 private long total; // 总数 private List<T> records; // 数据 }Controller/Service 直接用它返回,前端能拿到总数和数据。
-
分页 SQL 生成
Jalor 6 不再自己手写方言,而是采用 MyBatis Interceptor 拦截 SQL,在执行时自动拼接分页语句,支持常见数据库:- MySQL / PostgreSQL →
LIMIT ?, ? - Oracle 12c+ / SQL Server 2012+ →
OFFSET ? ROWS FETCH NEXT ? ROWS ONLY - Oracle 11g / SQL Server 2008- → 仍然 fallback 到
ROWNUM/ROW_NUMBER()包装
所以 Jalor 6 不用开发者关心数据库差异,直接传 pageNo/pageSize 即可。
- MySQL / PostgreSQL →
-
调用方式
Page<User> page = userMapper.selectPage(new Page<>(1, 10), new QueryWrapper<User>().eq("status", 1));-
Page<>(1, 10)→ 页码 1,每页 10 条 -
内部自动执行两次 SQL:
SELECT COUNT(*) FROM ...→ 获取总数SELECT ... LIMIT/OFFSET→ 获取当前页数据
返回结果会带
total、records。 -
🔹 Jalor 5 vs Jalor 6 分页区别
| 版本 | 实现方式 | 特点 |
|---|---|---|
| Jalor 5 | Hibernate + 自写方言分页封装 | 代码较复杂,要区分 ORM 和数据库 |
| Jalor 6 | 基于 MyBatis Interceptor 的分页插件 | 统一入口,自动适配多数据库,更简洁 |
👉 总结:
Jalor 6 的分页本质上和 MyBatis-Plus 的分页插件很像,只要传 Page 对象,SQL 会被拦截器自动改写,开发者不需要关心底层数据库的分页语法。
599

被折叠的 条评论
为什么被折叠?



