【问题标题】:Pass an ArrayList as parameter to StoredProcedure from a class将 ArrayList 作为参数从类传递给存储过程
【发布时间】:2013-05-17 11:00:30
【问题描述】:

如何将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 块吗?

【问题讨论】:

  • 也许您可以使用覆盖并稍微更改代码中的逻辑
  • 将您的 SQL 存储过程添加到问题中。

标签: java stored-procedures


【解决方案1】:

为什么不将数组映射到 XML 文件中并将其作为参数 (varchar) 传递?这样你就不需要在java中检查空值了。然后在 SP 上检索它,将其映射回一个表,如果参数为空或 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" />'

【讨论】:

    【解决方案2】:

    如果你只是想清理代码中的一些样板,你应该尝试这样的事情:

    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,因为如果您为此调用getMap 中不存在的任何键都将评估为null。如果您真的需要Map 中的那些显式null 键/值,请告诉我,我会稍微调整一下代码。

    【讨论】:

      猜你喜欢
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 2016-04-05
      • 2020-02-21
      • 1970-01-01
      相关资源
      最近更新 更多