温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何用Dynamic SQL分页

发布时间:2026-09-08 21:18:06 来源:亿速云 阅读:84 作者:小樊 栏目:数据库

下面以主流关系型数据库 + 常见开发方式为例,说明如何用 Dynamic SQL(动态 SQL)实现分页


一、什么是 Dynamic SQL 分页

Dynamic SQL 是指在运行时根据条件拼接 SQL,例如:

  • 页码(pageNum)
  • 每页大小(pageSize)
  • 排序字段
  • 查询条件

分页 SQL 通常不是固定的,而是动态生成。


二、MySQL 中的动态分页(最常用)

1️⃣ 基础分页 SQL

SELECT *
FROM user
ORDER BY id
LIMIT ?, ?;

2️⃣ 使用 MyBatis 动态 SQL 分页

<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);

三、Oracle 动态分页(ROWNUM)

1️⃣ Oracle 分页模板

SELECT *
FROM (
    SELECT t.*, ROWNUM rn
    FROM (
        SELECT * FROM user
        ORDER BY id
    ) t
    WHERE ROWNUM <= #{end}
)
WHERE rn > #{start}

2️⃣ MyBatis 动态 SQL

<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>

四、SQL Server 动态分页(OFFSET FETCH)

SELECT *
FROM user
ORDER BY id
OFFSET #{offset} ROWS
FETCH NEXT #{pageSize} ROWS ONLY;

✅ SQL Server 2012+ 推荐方式


五、动态 SQL 分页最佳实践

✅ 1. 永远计算总数(count)

SELECT COUNT(*) FROM user
<where>
    <if test="name != null">
        AND name LIKE #{name}
    </if>
</where>

✅ 2. 防止分页参数错误

if (pageNum < 1) pageNum = 1;
if (pageSize < 1) pageSize = 10;

✅ 3. 排序字段白名单(防注入)

if (!allowedSortFields.contains(sortField)) {
    sortField = "id";
}

六、使用分页插件(推荐)

MyBatis PageHelper

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),我可以给你完整示例代码

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI