温馨提示×

温馨提示×

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

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

为何用动态SQL分页

发布时间:2026-09-29 13:02:37 来源:亿速云 阅读:89 作者:小樊 栏目:数据库

使用动态 SQL 来实现分页,本质上是为了解决分页条件不确定、灵活、可复用的问题。下面从“为什么需要”和“常见场景”两个角度说明。


一、为什么要用动态 SQL 做分页

1. 分页参数往往不固定

实际业务中,分页通常不只是 pageNum / pageSize,还可能伴随:

  • 按条件筛选(姓名、状态、时间范围)
  • 按不同字段排序
  • 是否统计总数

这些条件有时有,有时没有,如果用静态 SQL,只能写很多 if-else 分支或拼接字符串,维护成本高。

✅ 动态 SQL(如 MyBatis 的 <if>、<where>)可以根据参数自动拼接 SQL。


2. 避免 SQL 拼接错误

手写字符串拼接分页 SQL:

String sql = "select * from user where 1=1 ";
if (name != null) {
    sql += " and name like '%" + name + "%'";
}
sql += " limit " + (pageNum-1)*pageSize + "," + pageSize;

问题:

  • 容易 SQL 注入
  • 容易语法错误(多空格、少空格)
  • 可读性差

✅ 动态 SQL 由框架处理拼接,安全且清晰。


3. 支持多种数据库分页方式

不同数据库分页语法不同:

  • MySQL:LIMIT ?, ?
  • Oracle:ROWNUM
  • PostgreSQL:LIMIT OFFSET
  • SQL Server:OFFSET FETCH

✅ 动态 SQL 可以根据数据库类型或配置切换分页逻辑(如 PageHelper、MyBatis-Plus)。


4. 与分页插件配合更自然

常见分页方案:

  • MyBatis + PageHelper
  • MyBatis-Plus 分页拦截器

它们底层也是动态改写 SQL:

select * from user
-- 自动变成
select * from user limit 0,10

如果不使用动态 SQL,很难优雅实现这种“无侵入分页”。


二、典型动态分页 SQL 示例(MyBatis)

<select id="selectUserPage" resultType="User">
  select * from user
  <where>
    <if test="name != null">
      and name like concat('%', #{name}, '%')
    </if>
    <if test="status != null">
      and status = #{status}
    </if>
  </where>
  order by create_time desc
  limit #{offset}, #{pageSize}
</select>

三、什么时候“不一定”需要动态 SQL

如果你:

  • 分页条件固定
  • 不使用筛选
  • 单表简单查询

那直接用静态 SQL + 分页参数也可以。


总结一句话

用动态 SQL 分页,是为了在“条件不确定、数据库多样、代码可维护”的前提下,安全、灵活地生成分页查询语句。

如果你愿意,我也可以对比 MyBatis 动态 SQL vs PageHelper vs MyBatis-Plus 的优缺点。

向AI问一下细节

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

AI
助
手