Сравните это с моим кодом:
Connection con = null;
PreparedStatement pStmt = null;
ResultSet rs = null;
try
{
con = ds.getConnection();
pStmt = con.prepareStatement("SELECT ....");
rs = pStmt.executeQuery();
while (rs.next()) {
Item item = new Item();
item.setItemNo(rs.getString("item_id"));
...
items.add(item);
}
}
finally {
rs = DBUtil.close (rs);
pStmt = DBUtil.close (rs);
con = DBUtil.close (rs);
}
Вот как выглядит close()
:
public static ResultSet close (ResultSet rs) {
try {
if (rs != null)
rs.close ();
} catch (SQLException e) {
e.printStackTrace ();
// Or use your favorite logging framework.
// DO NOT THROW THIS EXCEPTION OR IT WILL
// HIDE EXCEPTIONS IN THE CALLING METHOD!!
}
return null; // Make sure no one uses this anymore
}
[РЕДАКТИРОВАТЬ] Вам нужно будет скопировать этот код для других типов.
Я также переместил все это в вспомогательный класс с именем DBOp
, поэтому мне просто нужно переопределить processRow(ResultSet row)
для выполнения фактической обработки, и я могу опустить весь этот шаблонный код. В Java 5 конструктор DBOp
читает:
public DBOp (Logger log, DataSource ds, String sql, Object... param)
Я передаю логгер, чтобы я мог показать, какой экземпляр фактически опрашивает данные.