[英]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.