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

MyBatis 動態 SQL 實戰:條件查詢、批量增刪改查完整範例集

     編輯:Java 相關知識

MyBatis 的 `"}` 包裹。

  • 參數用 `@Param("name")` 綁定,OGNL 表達式引用 `#{name}`。
  • 集合參數在 `` 中用 `collection="paramName"`。
  • 二、六大高頻模式代碼庫

    1. 模糊查詢(多字段 OR)

    @Select({""})
    Account findByAccountOrEmail(@Param("query") String query);

    2. 批量新增(INSERT ... VALUES ...)

    @Insert({""})
    void insertLabels(@Param("companyId") Long companyId, @Param("labels") List<Long> labels);

    關鍵:MySQL 單條 SQL 長度限制 (`max_allowed_packet`),超大批次建議分批 500-1000 條。

    3. 批量刪除(DELETE ... WHERE id IN ...)

    @Delete({""})
    void deleteLabels(@Param("companyId") Long companyId, @Param("labels") List<Long> labels);

    4. 批量修改(UPDATE ... SET ... WHERE id IN ...)

    @Update({""})
    int updateStatus(@Param("status") Integer status, @Param("ids") Long[] ids);

    支持 `List`、`Long[]`、`Set` 等集合類型。

    5. 批量查詢(SELECT ... WHERE id IN ...)

    @Select({""})
    List<Product> findByIds(@Param("idList") List<Long> idList);

    6. 多條件組合查詢( 判空 + 邏輯判斷)

    @Select({""})
    List<Company> findConditional(
        @Param("companyId") Long companyId,
        @Param("type") Integer type,
        @Param("isScanSameLevel") Integer isScanSameLevel,
        @Param("isScanParent") Integer isScanParent,
        @Param("level") Integer level);

    7. 綜合複雜查詢(多表 JOIN + 多條件 + 模糊 + 排序)

    @Lang(XMLLanguageDriver.class)
    @Select({""})
    List<Product> searchProducts(
        @Param("hotCategoryId") Long hotCategoryId,
        @Param("categoryId") Long categoryId,
        @Param("keyword") String keyword,
        @Param("location") String location,
        @Param("methodId") Long methodId,
        @Param("orgId") Long orgId);

    三、動態 SQL 核心標籤速查

    標籤作用常用屬性
    <if test="...">條件包含片段test: OGNL 表達式
    <where>智能 WHERE:自動去除首個 AND/OR、若內容為空則不輸出 WHERE無
    <trim prefix="WHERE" suffixOverrides="AND|OR">自定義 WHERE/SET 裁剪prefix, suffix, prefixOverrides, suffixOverrides
    <foreach>遍歷集合構建 IN/VALUEScollection, item, index, open, separator, close
    <choose/when/otherwise>互斥分支test
    <bind name="..." value="..."/>定義變量供後續使用name, value

    四、最佳實踐建議

    1. 優先用 `` 替代 `WHERE 1=1`:語義清晰、自動處理首個 AND/OR。
    2. 批量操作分批提交:單次 `` 不超過 500-1000 條,防止 SQL 過長、鎖競爭、事務日志膨脹。
    3. IN 子句為空保護:`` 若集合為空會生成 `IN ()` 導致語法錯誤,外層用 `` 包裹。
    4. 模糊查詢參數化:`LIKE CONCAT('%', #{param}, '%')` 而非字符串拼接,防 SQL 注入。
    5. 複雜查詢抽離 XML:超過 50 行動態 SQL 建議移至 `Mapper.xml`,註解器僅保留簡單單表操作。
    6. 索引覆蓋:高頻條件組合建立聯合索引,EXPLAIN 驗證執行計劃。

    五、總結

    MyBatis 動態 SQL 通過 `` 處理條件分支、`` 解決批量構建、`/` 修飾語法邊界,將原本散落在 Java 代碼中的拼接邏輯集中到映射層,實現 **SQL 與參數分離、可讀性強、防注入、易維護**。掌握上述 6 大模式,可覆蓋 90% 以上業務查詢與批量操作場景。

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