【问题标题】:How to return 2 ResultSet?如何返回 2 个结果集?
【发布时间】:2013-11-12 06:43:28
【问题描述】:

您好,我正在尝试从 2 个地方获取数据。 一个来自数据库,第二个来自类文件。 获取数据后,我想使用 return 关键字将这两个 ResultSet 对象返回到其他文件,但我不知道如何返回 2 个结果集。

我的代码:

public ResultSet getdata(String query, boolean test, List<CartEntry> items)
    {
        int k;
            try
            {
                Connection conn;
                Statement st;
                public ResultSet rs,result;
                List<Product> prodList = new ArrayList<Product>();
                for(CartEntry ce : items)
                {
                    prodList.add(new Product("p" + ce.getpId(), "test", "prod" + ce.getpId(), (int)ce.getpId(), ce.getpId() + 0.12f, ce.getQuantity()));
                    result = new DummyResultSet(prodList);
                    k = ce.getQuantity();
                    System.out.println(k);
                }

                st=conn.createStatement();
                rs=st.executeQuery(query);          
                querystatus=true;
                return rs;
            }
            catch(Exception e)
            {
                querystatus=false;
            }
        }

try 块的最后一行,即return rs; 我想要return rs,result; 之类的东西,但我不知道如何实现它。我只是这样尝试过,但它不起作用,它给了我一个错误。 任何人都知道如何将数据返回到其他文件以及如何检索它??

【问题讨论】:

  • 将其添加到数组列表中并返回该数组列表
  • @AJ。 : 先生怎么样? return new ResultSet[]{rs,result};

标签: java return resultset multiple-resultsets


【解决方案1】:

其他人已经告诉过你该怎么做,所以我添加了我的答案,解释你不应该这样做。

您基本上不应该返回结果集,它们是为了使用答案:相反,您应该读取结果集,将结果存储在某处(例如值对象数组)并释放结果。否则你很容易泄露你的数据库连接。

【讨论】:

    【解决方案2】:

    将 ResultSet 从一层返回到另一层的第一件事是非常糟糕的做法,因为它没有实现 Serializable 接口。

    另一件坏事是我们向服务层透露我们在数据访问层中使用 JDBC 的技术,有时服务层开发可以由某些第三方完成。我们不应该向任何其他层透露我们正在使用什么,即 JDBC、Hibernate 或 Spring JDBC。

    因此您可以从 ResultSet 中收集数据并存储到 List 中,然后返回该 List。

    【讨论】:

    • 意味着我将创建 List 对象,然后将 ResultSet 数据放入其中,然后返回列表对象?
    • serializable 与 it 有什么关系?
    • Serializable 接口与它是不好的做法这一事实并没有真正的关系(尽管它是一个提示)。这是一种不好的做法,因为它会泄漏数据库连接并用于使用结果数据。
    • @Sotirios 我刚刚说返回 ResultSet 是不好的做法,并要求将返回类型更改为列表
    • @user2659972ღ Shoaib 的意思是,您应该从结果集中检索所有信息并将其存储在您的自定义 Java 对象(即 POJO)中。将其命名为 Result 或任何您想要的名称,以及应存储在其中的所有属性。该对象将是您的业务领域对象,其中包含来自结果集的数据,但这不是结果集本身。然后您将返回此对象,而不是结果集。结果集本身,您将在try 表达式的finally 子句中正确处理。 GL!
    【解决方案3】:

    更改您的代码:

    public ArrayList getdata(String query, boolean test, List<CartEntry> items)
        {
    ArrayList arr = new ArrayList();// This is a ArrayList
            int k;
                try
                {
                    Connection conn;
                    Statement st;
                    public ResultSet rs,result;
                    List<Product> prodList = new ArrayList<Product>();
                    for(CartEntry ce : items)
                    {
                        prodList.add(new Product("p" + ce.getpId(), "test", "prod" + ce.getpId(), (int)ce.getpId(), ce.getpId() + 0.12f, ce.getQuantity()));
                        result = new DummyResultSet(prodList);
                        k = ce.getQuantity();
                        System.out.println(k);
                    }
    
                    st=conn.createStatement();
                    rs=st.executeQuery(query);          
                    querystatus=true;
    arr.add(rs);// Add it to list
    arr.add(result);
                    return arr; // Return the List
                }
                catch(Exception e)
                {
                    querystatus=false;
                }
            }
    

    在接收函数时这样做:-

     ArrayList arr = getdata(query, test,items);
    
    
            ResultSet rs = (ResultSet)arr.get(0);
            ResultSet result = (ResultSet)arr.get(1);
    

    【讨论】:

    • 但是我打电话给ResultSet rs = getdata(query, test, items);这样的东西,那我该怎么办? ArrayList arry[] = getdata(query, test, items); 还是别的什么?
    【解决方案4】:

    您可以使用ResultSet 数组或ResultSet List 返回多个ResultSet。看看下面使用ResultSet[]的例子。

    public ResultSet[] getdata(String query, boolean test, List<CartEntry> items)
    {
        int k;
            try
            {
                Connection conn;
                Statement st;
                ResultSet[] rs=new ResultSet[2];
                List<Product> prodList = new ArrayList<Product>();
                for(CartEntry ce : items)
                {
                    prodList.add(new Product("p" + ce.getpId(), "test", "prod" + ce.getpId(), (int)ce.getpId(), ce.getpId() + 0.12f, ce.getQuantity()));
                    rs[1] = new DummyResultSet(prodList);
                    k = ce.getQuantity();
                    System.out.println(k);
                }
    
                st=conn.createStatement();
                rs[0]=st.executeQuery(query);          
                querystatus=true;
    
            }
            catch(Exception e)
            {
                querystatus=false;
            }
           return rs;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多