似乎每次我想执行数据库查询时,我都要编写以下内容:
Connection conn = null;
Statement stmt = null;
ResultSet rset = null;
try {
conn = dataSource.getConnection();
stmt = conn.prepareStatement(sql);
// ...set stmt params
rset = stmt.executeQuery();
while(rset.next()) {
// Do something interesting
}
} finally {
try { if (rset != null) rset.close(); } catch(SQLException e) { }
try { if (stmt != null) stmt.close(); } catch(SQLException e) { }
try { if (conn != null) conn.close(); } catch(SQLException e) { }
}
这真的是最好的方法吗?有没有办法至少减少一些混乱?
编辑:正如一些评论指出的那样,这段代码不够长 。
答案 0 :(得分:11)
是的,使用Spring JDBCTemplate类(http://static.springsource.org/spring/docs/2.0.x/reference/jdbc.html)。
或者,如果您不使用Spring复制他们在您自己的代码中使用的模板模式。
答案 1 :(得分:8)
如果您已有数据源,则可以使用Spring JdbcTemplate:
如果它看起来太沉重,你可以为'样板部件'实现一些实用程序类和方法。在这种情况下,研究JdbcTemplate的源代码应该会有所帮助。
答案 2 :(得分:6)
DbUtils是一个非常有用的框架,我已经将它用于Spring和Hibernate过度杀伤的小型项目。它也可以做一些对象映射。
答案 3 :(得分:4)
制作帮手方法?
public class DBHelper
{
public static Object run(string sql, List params, ResultHandler rhandler)
{
Connection conn = null;
Statement stmt = null;
ResultSet rset = null;
try {
conn = dataSource.getConnection();
stmt = conn.prepareStatement(sql);
int i = 0;
for(Object p in params)
{
stmt.setObject(++i, p);
}
rset = stmt.executeQuery();
return rhandler.handle(rset);
} finally {
try { rset.close(); } catch(Exception e) { }
try { stmt.close(); } catch(Exception e) { }
try { conn.close(); } catch(Exception e) { }
}
}
}
public interface ResultHandler
{
public Object handle(ResultSet)
}
public class Test
{
public static void main(String[] args)
{
String s = (String)DBHelper.run("select * from mytable where col = ?",
Arrays.asList({"foo"}),
new ResultHandler
{
public Object handle(ResultSet r)
{
r.first();
return r.getString("col2");
}
}();
}
}
答案 4 :(得分:0)