在 MyBatis / JDBC / 通用后台开发 里,“Dynamic SQL 拼接条件”通常指根据前端传参动态决定是否拼接 WHERE 条件,避免写死 SQL。下面按常见场景给你总结。
<if> 条件拼接<select id="queryUser" resultType="User">
SELECT * FROM user
WHERE 1 = 1
<if test="name != null and name != ''">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</select>
✅ 优点:清晰、安全(防止 SQL 注入)
<where> 自动处理 AND / OR<select id="queryUser" resultType="User">
SELECT * FROM user
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
✅ <where> 会自动:
AND<choose>(类似 if-else)<where>
<choose>
<when test="type == 'A'">
AND type = 'A'
</when>
<when test="type == 'B'">
AND type = 'B'
</when>
<otherwise>
AND status = 1
</otherwise>
</choose>
</where>
<foreach> 拼接 IN 条件<if test="ids != null and ids.size() > 0">
AND id IN
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</if>
StringBuilder sql = new StringBuilder("SELECT * FROM user WHERE 1=1");
if (name != null) {
sql.append(" AND name = '").append(name).append("'");
}
❌ 风险:SQL 注入
✅ 如果必须拼,一定要用 PreparedStatement
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like(name != null, "name", name);
wrapper.eq(age != null, "age", age);
| 问题 | 解决 |
|---|---|
| 条件前有 AND 报错 | 用 <where> |
| 参数为空也拼条件 | 加 != null |
| IN 条件为空 | 先判断 size() > 0 |
| SQL 注入 | 永远用 #{} 不用 ${} |
如果你能告诉我:
我可以直接帮你写一份可用的 SQL 模板。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。