从db代码中删除样板

时间:2009-07-02 07:14:47

标签: java jdbc

似乎每次我想执行数据库查询时,我都要编写以下内容:

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) { }
}

这真的是最好的方法吗?有没有办法至少减少一些混乱?

编辑:正如一些评论指出的那样,这段代码不够长

5 个答案:

答案 0 :(得分:11)

是的,使用Spring JDBCTemplate类(http://static.springsource.org/spring/docs/2.0.x/reference/jdbc.html)。

或者,如果您不使用Spring复制他们在您自己的代码中使用的模板模式。

答案 1 :(得分:8)

如果您已有数据源,则可以使用Spring JdbcTemplate

  • 大大减少了样板代码
  • 有一个很好的sql exception hierarchy来处理特定运行时异常的常见数据库问题
  • (稍后进一步使用Spring)使用声明式事务管理

如果它看起来太沉重,你可以为'样板部件'实现一些实用程序类和方法。在这种情况下,研究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)

我会使用hibernateJPA来减少混乱......