2013-05-17 115 views
3

如何將ArrayList作爲參數從Java類傳遞到StoredProcedure將ArrayList作爲參數傳遞給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次,以檢查對每個到來的數組列表參數設定值作爲參數存儲過程。

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

+0

也許你可以使用覆蓋和更改代碼中的邏輯有點 –

+0

將SQL存儲過程添加到問題中。 – Perception

回答

0

如果你只是想清理一些在你的代碼鍋爐板,你應該嘗試這樣的事:

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; 
} 

你並不需要明確null鍵/值添加到Map因爲如果您撥打get,那麼Map中不存在的任何密鑰將評估爲null。如果您確實需要Map中明確的null鍵/值,請告訴我,我將稍微調整一下代碼。

1

爲什麼不將數組映射到XML文件並將其作爲參數(varchar)傳遞?這樣你就不需要檢查java中的空值了。然後在SP您檢索其映射回一個表,它會自動將空值如果參數爲空或從XML丟失:

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

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 

如果你叫它你已經得到一個表的參數列,但如果你留下一個參數的XML列填充爲空,例如...

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