如何将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阻止吗?
答案 0 :(得分:1)
为什么不将数组映射到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" />'
答案 1 :(得分: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
键/值,因为Map
中没有的任何键,无论如何都会评估为null
为此致电get
。如果您确实需要null
中明确的Map
个键/值,请告诉我,我会稍微调整一下代码。