jdbc封装求教

我写了个JDBC封装类,现在在使用的过程中遇到点问题,希望各位指教,帮我解决此问题,具体问题如下:

其中的一个方法:[code="java"]
      /**
 * @description 执行查询sql,此处不能关闭statement,原因是如果在finally里关闭了statement,则resultSet也关闭了,怎么才能关闭它呢?
 * @param con
 * @param sql
 * @return
 */
public static ResultSet executeQuery(Connection con,String sql) {
    if(null == con) {
        throw new IllegalArgumentException("the parameter connection[con] is null !");
    }
    Statement stm = null;
    try {
        stm = con.createStatement();
        ResultSet result = stm.executeQuery(sql);
        return result;
    } catch (SQLException e) {
         try {
            con.rollback();
        } catch (SQLException e1) {
            e1.printStackTrace();
        }
        e.printStackTrace();
        getLogger().fatal("执行SQL["+sql+"]时出现异常!具体异常信息为: "+e.getMessage());
    }

[/code]

现在的问题就如注释,我需要在此封装类外使用这个方法,取完ResultSet的值后,需要关闭ResultSet以及Statement,不然创建的太多会大大影响性能。

 请大家帮我看看,给我个解决方法,如果有好的JDBC封装类的话,发个给我,感激不尽,谢谢!

[code="java"]
这样是否可以,只是写了大概代码,省去了异常捕获。核心思想就是JDBC的那些共用部分封装到一个类中,业务代码取数据的部分,以接口的形式传入进来。
/*
*
*此类只把JDBC的一些操作封装起来,没有和业务代码耦合。
*与接口WrapprIface进行一个rs的传递
*/
class DBAccess
{
private Connection conn;
public DBAccess(String ds){
conn = //find datasource and create conn
}
public void query(String sql, ArrayList paramsList, WrapprIface wrapper) {
Preparements statement = conn.preparestatement(sql);
if (paramsList != null && !paramsList.isEmpty())
{
//设置进来参数
statement.set......
}
Result rs = null;
rs = statement.query();
//先这个类里,进行自己的业务逻辑,这样不会和JDBC耦合了。WrapprIface见下面的接口定义
wrapper.wrap(rs);
finally {
closeRsAndStatement(rs, statement);
}
}
private void closeRsAndStatement(Result rs, Statement st) {
//关闭这两个
}
public void closeConnection() {
this.conn.close();
}

}
/**
*根据传入的Rs,取得需要数据,转换为指定的对象,
*其它业务代码调用getRs(),再把指定对象取得。
*/
interface WrapprIface
{
void wrap(Result rs);
T getRs();
}
[/code]

你的关闭顺序错了,要先关闭ResultSet、再关闭statement就没问题了.....

[color=blue]

性能暂不要考虑,考虑下解耦吧。您可以将ResultSet封装成Map对象,返回Map。ResultSet就可以关闭了。

[/color]

可以单独封装一个closeStatement方法和closeResultSet方法,必要的话,在关闭的时候再做一次判断,并且声明异常。

上面的一个很大的缺点是,需要外界主动调用关闭连接的方法,容易忘记。

加finally就可以

应该把取得的RS值取出来,在本类关闭掉他