普通网友 2010-01-30 14:56
浏览 209
已采纳

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封装类的话,发个给我,感激不尽,谢谢!
  • 写回答

7条回答 默认 最新

  • louhui_2005 2010-01-31 22:59
    关注

    [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]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥15 Python爬取指定微博话题下的内容,保存为txt
  • ¥15 vue2登录调用后端接口如何实现
  • ¥65 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?