RELATEED CONSULTING
相关咨询
选择下列产品马上在线沟通
服务时间:9:30-18:00
你可能遇到了下面的问题
关闭右侧工具栏
简化JDBC的数据库访问
  • 作者:zhaozj
  • 发表时间:2020-12-23 11:03
  • 来源:未知

简化JDBC的数据库访问

问题的产生:

    在一些小型应用中,JDBC扮演着一个让人进退两难的角色。    最近我遇到了这样一个问题:项目不大,犯不着使用Hibernate之类的持久化技术,但JDBC带来的大量重复代码着实让维护工作举步维艰。

    传统的数据库Query方法是这样的:

构造SQL语句 -> 从连接池中获取Connection -> 创建Statement -> 执行SQL查询请求 -> 处理ResultSet -> 关闭ResultSet以及Statement -> 释放Connection

    大致的代码如下:

  String SQL = "SELECT name, pass FROM table WHERE id = '"+ id +"'";

  Connection conn = ConnectionPool.getConnection();  Statement stmt = conn.createStatement();  ResultSet rs = stmt.exeQuery(SQL);

  while(rs.next()){    //.......  }

  rs.close();  stmt.close();  ConnectionPool.release(conn);

    这样带来一个问题:由于每次查询都要有这么一个套路,那么一旦改变了获取和释放Connection的策略,维护的工作量是巨大的。    如果你也像我一样想减少Ctrl-c和Ctrl-v的次数,那么请继续看下去吧。

分析:

    事实上我们所关注的只有两个地方        1. 构造SQL语句        2. 处理ResultSet过程    其余部分都是简单的重复,按照重构的原则,因该尽量减少重复的代码,而把更多的注意力集中在对ResultSet的处理上。

    假设我们有一个叫做doQuery的函数,用来统一处理 Query过程。    也许你会想到把构造好的SQL传递给doQuery,然后返回一个ResultSet,再另行处理ResultSet,这样的doQuery看起来会是这样:public ResultSet doQuery (String SQL){    Connection conn = ConnectionPool.getConnection();    Statement stmt = conn.createStatement();    ResultSet rs = stmt.exeQuery(SQL);            stmt.close();        //ResultSet也同时被关闭了    ConnectionPool.release(conn);    return rs;}    看起来不错,但是这样做你是无法处理ResultSet的,因为在Statement关闭的同时ResultSet也被关闭了。所以必须在同一个函数里创建、处理并关闭ResultSet。

解决方案:

    解决方案是把构造好的SQL和处理ResultSet的过程同时传递给doQuery。可是,怎么实现呢?别忘了Java可是OO的。OO的第一大特性是什么?对,封装。我们可以把ResultSet的处理过程封装起来。    具体方法如下: