首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

SQL 動態拼接神技:WHERE 1=1 讓條件構建優雅無比

     編輯:Java 綜合教學

SQL 動態拼接神技:WHERE 1=1 讓條件構建優雅無比

手工拼接動態 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 追加,邏輯極其清晰

適用邊界

  • ✅ 手工拼接 SQL 字符串 (JDBC、MyBatis XML 外部化)
  • ✅ 條件數量不固定、組合隨意
  • ❌ ORM 框架 (JPA/Hibernate Criteria、QueryDSL) 已內建優雅 API
  • ❌ 涉及 OR 邏輯時需加括號分組,WHERE 1=1 AND (a=1 OR b=2)

進階:MyBatis 中的替代方案

<where>
    <if test="name != null"> AND name = #{name} </if>
    <if test="age != null"> AND age = #{age} </if>
</where>

<where> 標簽智能處理首個 AND/OR,功能等同 WHERE 1=1 但更語義化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved