Java - 在arraylist中存储select语句的结果是好还是坏的方法?

时间:2015-04-09 05:30:51

标签: java arraylist

我刚刚开始在java中学习SQL Server 2008。所以我想知道使用这种方法是否合适?我实现了一个通用的arraylist方法,它将从数据库中获取值。

public ArrayList<String> get(){
    Connection conn = null;
    PreparedStatement stmt = null;
    ResultSet rs = null;
    ArrayList<String> a = new ArrayList<String>();
    try {

        // Register JDBC driver
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        conn = DriverManager.getConnection("jdbc:sqlserver://localhost; database = Sample; Integratedsecurity = true");
        String  sql = "Select * from products";
        stmt = conn.prepareStatement(sql);
        // Extract all the records to see the updated records
         rs  = stmt.executeQuery();
        while (rs.next()) {
            // Retrieve data by column name in your database
          a.add(rs.getString("ProductName"));

        }
        rs.close();
        } catch (SQLException se) {
            se.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    return a;
}

这个是好还是不好?然后在显示它..

ArrayList<String> a = new ArrayList<String>();
        String productName = !request.getParameter("productName").isEmpty() ? request.getParameter("productName") : "Empty";
        d.addProduct(productName);
        a = d.get();

        Iterator<String> it = a.iterator();

        while(it.hasNext()){%>
            <% String baba = (String)it.next(); %>
            <p>Product:  <%= baba %></p>
        <%} %>

我想知道这样做是否有任何良好的设置并且更容易理解?任何帮助/建议将不胜感激!谢谢。

4 个答案:

答案 0 :(得分:1)

如果您只是为单个属性检索简单的字符串,那么您的建议将完成这项工作。但是,如果要使用数字或其他数据类型,则可能会遇到麻烦。您还需要重复迭代ResultSet以检索其他属性。

我使用以下内容:

ArrayList<LinkedHashMap<String, Object>>

ArrayList为结果集中的每一行存储LinkedHashMap。 LinkedHashMap将每个属性名称(String键)映射到其对应的行值(Object值)。这给了我一个有序的结果列表,我可以按名称检索每一行的每个属性。使用Object而不是String允许我根据需要转换结果。我一次性完成所有这些。

以下演示了如何填充列表:

public Collection<String, Object> storeResults(ResultSet resultSet)
{
  LinkedHashMap<String, Object> attValues = null;
  ResultSetMetadata attValuesData = resultSet.getMetaData();
  int attsInRow = attValuesData.getColumnCount();
  ArrayList<LinkedHashMap<String, Object>> qryRslts = new ArrayList<>();

  while (resultSet.next())
  {
    attValues = new LinkedHashMap<>();

    /*
     * Loop through attributes and store values in attValues.
     * NOTE:  Column numbering starts at 1!!!
     */
    for (int attIndex = 1; attIndex <= attsInRow; attIndex++)
      attValues.put(attValuesData.getColumnLabel(attIndex),
                    resultSet.getObject(attIndex));

    qryRslts.add(attValues);
  }

  return qryRslts;
}

JDBC非常冗长,需要仔细处理资源,因此如果您打算编写大量可与数据库通信的软件,请考虑将常用功能(如上所述)抽象到自己的实用程序类和包中再利用。如果你不想解决这个问题,请考虑长期使用Hibernate。

答案 1 :(得分:0)

我过去做过类似的事情,因为“更容易处理”查询结果。随着岁月的流逝,我转过身去,因为它的代码多于真正需要的代码。这也使事情变得更加复杂。

在您的方法中,您不存储数据库返回的数据类型。它只是'String'。我过去也这样做过 - 我不建议那样......

所以我的建议是:在第一种方法中使用纯jdbc功能。如果您了解并使用了一段时间,请查看jpa。

答案 2 :(得分:0)

为什么不使用自动将结果绑定到某个对象的hibernate可能是ArrayList<SomeBean>

此外,如果需要,这将是一次很好的体验并值得学习。网上有很多东西,堆栈溢出本身就足够了。

答案 3 :(得分:0)

这很好。

即使您有更大的结果集行,该方法仍然可以正常工作。然后,您可以将每一行转换为某种对象,并将其添加到数组列表中。

如果由于内存限制而无法检索所有行,那么它可能无法正常工作,但您仍然会添加要返回此类集合的行。