有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我刚刚开始学习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) 个答案

  1. # 1 楼答案

    这很好

    即使结果集的行较大,这种方法也能很好地工作。然后将每一行变成某种对象,并将其添加到数组列表中

    如果由于内存限制,无法检索所有行,但仍要添加要返回到此类集合的行,则可能无法很好地工作

  2. # 2 楼答案

    如果您只是为单个属性检索简单字符串,那么您的建议将起到作用。然而,如果你想处理数字或其他数据类型,你可能会遇到麻烦。您还需要反复迭代ResultSet以检索其他属性

    我使用以下方法:

    ArrayList<LinkedHashMap<String, Object>>
    

    ArrayList为结果集中的每一行存储一个LinkedHashMap。LinkedHashMap将每个属性名(字符串键)映射到对应行的值(对象值)。这给了我一个有序的结果列表,我可以在其中按名称检索每行的每个属性。使用对象而不是字符串可以根据需要转换结果。我一次就搞定了

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

    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非常冗长,需要仔细的资源处理,因此如果您打算编写大量的与数据库对话的软件,请考虑将常见的功能(如上述)抽象成它自己的实用类(ES)和包以供重用。如果你不想惹那么多麻烦,从长远来看,一定要考虑使用Hibernate

  3. # 3 楼答案

    为什么不使用hibernate自动将结果绑定到某个对象(可能是^{

    此外,这将是一个很好的经验,值得学习,如果需要的话。网上有很多东西,也许stackoverflow本身就足够了

  4. # 4 楼答案

    为了“更容易处理”查询结果,我过去也做过类似的事情。随着时间的推移,我不再使用它,因为它的代码比实际需要的更多。这也让事情变得更复杂

    在您的方法中,不存储数据库返回的数据类型。这只是“字符串”。我过去也这么做过——我不建议

    所以我的建议是:在第一种方法中使用纯jdbc功能。如果你明白这一点,并使用了一段时间,看看jpa