手工拼接動態 SQL 時,WHERE 與 AND 的位置總是讓人頭大。一個極簡技巧 —— 預置 WHERE 1=1,徹底消除首條件特判邏輯,讓代碼線性、可讀、易維護。
// 傳統寫法:需判斷是否第一個條件
StringBuilder sql = new StringBuilder("SELECT * FROM t");
if (name != null) {
if (first) { sql.append(" WHERE name=?"); first=false; }
else { sql.append(" AND name=?"); }
}
if (age != null) { ... } // 重複邏輯
StringBuilder sql = new StringBuilder("SELECT * FROM t WHERE 1=1");
if (name != null) sql.append(" AND name=?");
if (age != null) sql.append(" AND age=?");
if (status != null) sql.append(" AND status=?");
// 統一參數綁定,無需 first 旗標
1=1 永真條件,不影響查詢結果集AND 追加,邏輯極其清晰OR 邏輯時需加括號分組,WHERE 1=1 AND (a=1 OR b=2)<where>
<if test="name != null"> AND name = #{name} </if>
<if test="age != null"> AND age = #{age} </if>
</where>
<where> 標簽智能處理首個 AND/OR,功能等同 WHERE 1=1 但更語義化。