下面以主流关系型数据库 + 常见开发方式为例,说明如何用 Dynamic SQL(动态 SQL)实现分页。
Dynamic SQL 是指在运行时根据条件拼接 SQL,例如:
分页 SQL 通常不是固定的,而是动态生成。
SELECT *
FROM user
ORDER BY id
LIMIT ?, ?;
<select id="selectUserPage" resultType="User">
SELECT *
FROM user
<where>
<if test="name != null">
AND name LIKE CONCAT('%', #{name}, '%')
</if>
</where>
ORDER BY id
LIMIT #{offset}, #{pageSize}
</select>
Java 调用:
int pageNum = 2;
int pageSize = 10;
int offset = (pageNum - 1) * pageSize;
userMapper.selectUserPage(name, offset, pageSize);
SELECT *
FROM (
SELECT t.*, ROWNUM rn
FROM (
SELECT * FROM user
ORDER BY id
) t
WHERE ROWNUM <= #{end}
)
WHERE rn > #{start}
<select id="selectUserPage" resultType="User">
SELECT *
FROM (
SELECT t.*, ROWNUM rn
FROM (
SELECT * FROM user
<where>
<if test="name != null">
AND name LIKE #{name}
</if>
</where>
ORDER BY id
) t
WHERE ROWNUM <= #{end}
)
WHERE rn > #{start}
</select>
SELECT *
FROM user
ORDER BY id
OFFSET #{offset} ROWS
FETCH NEXT #{pageSize} ROWS ONLY;
✅ SQL Server 2012+ 推荐方式
SELECT COUNT(*) FROM user
<where>
<if test="name != null">
AND name LIKE #{name}
</if>
</where>
if (pageNum < 1) pageNum = 1;
if (pageSize < 1) pageSize = 10;
if (!allowedSortFields.contains(sortField)) {
sortField = "id";
}
PageHelper.startPage(pageNum, pageSize);
List<User> list = userMapper.selectUser();
PageInfo<User> pageInfo = new PageInfo<>(list);
✅ 自动生成 count + limit
✅ 支持多种数据库
| 数据库 | 分页方式 |
|---|---|
| MySQL | LIMIT |
| Oracle | ROWNUM |
| SQL Server | OFFSET FETCH |
| PostgreSQL | LIMIT OFFSET |
核心思想:
动态拼接 WHERE + ORDER BY,再用数据库原生分页语法
如果你有具体数据库 / 框架(MyBatis、JDBC、Spring Data),我可以给你完整示例代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。