首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

iBATIS.NET 搭配 Oracle 批量刪除實現:動態 IN 條件映射技巧

     編輯:ASP.NET 基礎

場景需求

前端傳入逗號分隔 ID 字符串("1,2,3,4,5,6,7"),需轉為陣列執行批量刪除:DELETE FROM T_LABEL_SDSALES WHERE SDSALES_ID IN (1,2,3,4,5,6,7)。

實現步驟

1. C# 字符串轉陣列

string SDSALES_IDString = "1,2,3,4,5,6,7";
// 分割並過濾空值,轉為 string[]
Array array = SDSALES_IDString
    .Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)
    .ToArray<string>();

2. 實體類定義陣列屬性

public class T_LABEL_SDSALES {
    public Array SDSALES_IDs { get; set; } // 對應 XML 中的 property
    // 其他屬性...
}

3. SQL Map XML 配置:iterate 標籤動態構建 IN 條件

<delete id="DeleteManyT_LABEL_SDSALES" parameterClass="T_LABEL_SDSALES">
    DELETE FROM T_LABEL_SDSALES 
    WHERE <isNotNull property="SDSALES_IDs">
        SDSALES_ID IN 
        <iterate property="SDSALES_IDs" conjunction="," open="(" close=")">
            #SDSALES_IDs[]#
        </iterate>
    </isNotNull>
</delete>

關鍵標籤解析

標籤/屬性作用
<isNotNull>判斷屬性非空才輸出 WHERE 條件,防止全表刪除
<iterate>遍歷陣列/集合生成重複 SQL 片段
property指定要遍歷的屬性名(SDSALES_IDs)
conjunction元素間連接符,此處為逗號
open/close整體包裹字符,生成 (...)
#SDSALES_IDs[]#佔位符:[] 表示取當前迭代元素值

生成 SQL 示例

DELETE FROM T_LABEL_SDSALES WHERE SDSALES_ID IN (1,2,3,4,5,6,7)

注意事項與最佳實踐

  • Oracle IN 限制: 預設最多 1000 個表達式,大量 ID 需分批或用臨時表
  • 參數類型: 確保陣列元素類型與資料庫欄位類型一致(數字 vs 字符串)
  • 防注入: iBATIS 參數化自動處理,但動態 SQL 需謹慎
  • 性能: 批量刪除優於循環單條刪除,減少網絡往返

擴展:通用批量操作基類

public abstract class BatchRepository<T> {
    protected void BatchDelete(string sqlMapId, IEnumerable<object> ids) {
        var param = new Hashtable { { "Ids", ids.ToArray() } };
        SqlMap.Delete(sqlMapId, param);
    }
}

// XML 通用片段
<iterate property="Ids" conjunction="," open="(" close=")">
    #Ids[]#
</iterate>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved