簡體   English   中英

將ArrayList作為參數傳遞給類中的StoredProcedure

[英]Pass an ArrayList as parameter to StoredProcedure from a class

如何將ArrayList作為參數從Java類傳遞給StoredProcedure

我有一個方法,從中調用數據庫StoredProcedure ,如下面的代碼所示:

 public void insertFileDownload(ArrayList<String> spareaList, ArrayList<String> spcollrtList, ArrayList<String> spmaintRtList, ArrayList<String> spenfRtList) {


 if (spareaList != null) {
            for (String a : spareaList) {//for Areas
                Map<String, Object> param = new HashMap<String, Object>();
                param.put("areaName", a);
                param.put("collroutesName", null);
                param.put("maintrtsName", null);
                param.put("enfrtsName", null);

                genericDao.sqlQueryWithParameters(" {call sp_addMeterJob(:areaName,:collroutesName,:maintrtsName,:enfrtsName) }", param);
            }

        } else if (spcollrtList != null) {//for CollectionRoutes

            for (String cllRt : spcollrtList) {
                Map<String, Object> param = new HashMap<String, Object>();
                param.put("areaName", null);
                param.put("collroutesName", cllRt);
                param.put("maintrtsName", null);
                param.put("enfrtsName", null);                            

                genericDao.sqlQueryWithParameters(" {call sp_addMeterJob(:areaName,:collroutesName,:maintrtsName,:enfrtsName) }", param);
            }

..........

目前我正在使用if else條件4次來檢查每個傳入的數組列表參數,以將值設置為存儲過程的參數。

有沒有其他更好的方法避免許多if else塊?

為什么不將數組映射到XML文件中並將其作為參數(varchar)傳遞? 這樣你就不需要在java中檢查空值。 然后在SP上檢索它,將其映射回一個表,如果參數為null或xml中缺少,它會自動放入空值:

alter PROCEDURE [dbo].[ProcessArrayXML] @xml varchar(max)
AS
BEGIN
declare @xmlHandler int

exec sp_xml_preparedocument @xmlHandler OUTPUT, @xml

select * into #xmlBorrar
from openxml(@xmlHandler,'param') 
WITH (areaName varchar(50) '@areaName',
  collroutesName varchar(50) '@collroutesName',
  maintrtsName varchar(50) '@maintrtsName',
  enfrtsName varchar(50) '@enfrtsName')

--DOSOMETHING
select * from #xmlBorrar

end

如果你打電話給:

exec [ProcessArrayXML]  
'<?xml version="1.0" encoding="ISO-8859-1"?><param areaName = "1234" maintrtsName="1030" enfrtsName="1142" collroutesName="1204" />'

你得到一個以參數為列的表,但是如果你把一個參數從xml中刪除,那么列填充為null,例如......

exec [ProcessArrayXML]  
'<?xml version="1.0" encoding="ISO-8859-1"?><param collroutesName="1204" />'

如果您只想清理代碼中的某些樣板,您應該嘗試這樣的方法:

public void insertFileDownload(ArrayList<String> spareaList, 
  ArrayList<String> spcollrtList, ArrayList<String> spmaintRtList, ArrayList<String> spenfRtList) {
  if (!processList(spareaList, "areaName"))
    if (!processList(spcollrtList, "collroutesName"))
      if (!processList(spmaintRtList, "maintrtsName"))
        processList(spenfRtList, "enfrtsName");
}

private boolean processList(ArrayList<String> list, String mapKey) {
  boolean processed = false;
  if (list != null){
    processed = true;
    for (String a : list) {
      Map<String, Object> param = new HashMap<String, Object>();
      param.put(mapKey, a);
      genericDao.sqlQueryWithParameters(" {call sp_addMeterJob(:areaName,:collroutesName,:maintrtsName,:enfrtsName) }", param);
    }      
  }
  return processed;
}

您不需要向Map添加顯式null鍵/值,因為如果您為其調用get ,則Map不存在的任何鍵都將評估為null 如果您確實需要Map中的那些顯式null鍵/值,請告訴我,我會稍微調整一下代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM