我刚刚开始在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>
<%} %>
我想知道这样做是否有任何良好的设置并且更容易理解?任何帮助/建议将不胜感激!谢谢。
答案 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)
这很好。
即使您有更大的结果集行,该方法仍然可以正常工作。然后,您可以将每一行转换为某种对象,并将其添加到数组列表中。
如果由于内存限制而无法检索所有行,那么它可能无法正常工作,但您仍然会添加要返回此类集合的行。