使用动态 SQL 来实现分页,本质上是为了解决分页条件不确定、灵活、可复用的问题。下面从“为什么需要”和“常见场景”两个角度说明。
实际业务中,分页通常不只是 pageNum / pageSize,还可能伴随:
这些条件有时有,有时没有,如果用静态 SQL,只能写很多 if-else 分支或拼接字符串,维护成本高。
✅ 动态 SQL(如 MyBatis 的 <if>、<where>)可以根据参数自动拼接 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 由框架处理拼接,安全且清晰。
不同数据库分页语法不同:
LIMIT ?, ?ROWNUMLIMIT OFFSETOFFSET FETCH✅ 动态 SQL 可以根据数据库类型或配置切换分页逻辑(如 PageHelper、MyBatis-Plus)。
常见分页方案:
它们底层也是动态改写 SQL:
select * from user
-- 自动变成
select * from user limit 0,10
如果不使用动态 SQL,很难优雅实现这种“无侵入分页”。
<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 分页,是为了在“条件不确定、数据库多样、代码可维护”的前提下,安全、灵活地生成分页查询语句。
如果你愿意,我也可以对比 MyBatis 动态 SQL vs PageHelper vs MyBatis-Plus 的优缺点。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。