在我的java应用程序中,它似乎在我的查询中使用参数到数据库,我需要利用PreparedStatement。 但同时,我想在前进/后退模式下使用语句的结果集(可滚动) PreparedStatement似乎没有提供设置可滚动模式 声明似乎没有提供参数。
看起来像一个基本的问题..但是没有什么东西跳出来(除了使用Statement和构造没有参数的SQL)。真的没有办法为Statement提供参数。或者有一个可滚动的预备语句吗?我错过了什么吗?
conn = Utility.getConnection();
tmpSQL = "SELECT * FROM " + baseTable + " WHERE " + filterCriteria
+ " ORDER BY " + sortCriteria;
//method 1
Statement stmt = conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
rset = stmt.executeQuery(tmpSQL); //not using any parameters!
//method 2
PreparedStatement pStatement = conn.prepareStatement(tmpSQL); //not scrollable!
if (params != null)
for (int i = 0; i < params.size(); i++) {
pStatement.setString(i + 1,
((Parameter) params.get(i)).getStringValue());
}
rset = pStatement.executeQuery();
答案 0 :(得分:6)
使用
PreparedStatement pStatement = conn.prepareStatement(tmpSQL,
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
然后要在ResultSet中获取记录数,请使用rset.last()
,然后使用rset.getRow()
。然后使用rset.beforeFirst()
将光标放回原来的位置。
答案 1 :(得分:1)
可滚动性主要取决于底层数据库。即使JDBC有一种向后滚动的方法,它也没有实现,例如在Oracle JDBC驱动程序中。
我建议避免滚动结果集。实际上,即使它适用于某些数据库,实现效率也很低。在GUI上使用效率也很低,因为每次滚动都会触发数据库操作,这很慢。
通常的方法是将所有行加载到容器(例如List&lt; ...&gt;)并处理该行,如果您有适度的行数(例如最多1000行)。如果你有更多的行,那么:
要获取记录计数,请使用select count(*)执行单独的语句。 然后执行另一个选择以实际读取记录并获取它们(仅向前)。
比读取所有记录要快得多。