- 作者:xiaoxiao
- 发表时间:2020-12-23 11:01
- 来源:未知
问题的提出
在一个应用程序中,处理JDBC的操作是一个重复率较高的工作。当你在一个JDBC数据源上执行SQL查询时,你通常需要执行下面几个步骤: 1.生成SQL语句 2.获得连接 3.获得一个PreparedStatement对象
4.在PreparedStatement对象中设定需要送入到数据库的值 5.执行SQL语句 6.处理查询结果 除此之外,你还需要处理SQLException异常。如果上面列出的这些步骤分散在程序的各个部分的话,程序中需要多个try/catch块来处理异常。 如果我们仔细看看上面列出的步骤,就会发现在执行不同的SQL语句时,上面这些步骤中涉及到的程序代码变化不会很大:我们使用同样的方法获得数据库连接和PreperedStatement对象;使用setXXX方法来设定PreperedStatement对象中的值;处理SQL查询结果的过程也是基本不变的。在这篇文章中,我们通过定义三个JDBC模型,去除了上述六个步骤中的三个步骤,这样使得整个过程更加简单,而且具有更好的通用性。
查询模型我们定义了一个名叫SQLProcessor的类,在该类中定义了一个executeQuery()方法来执行SQL语句,我们在实现这个方法的时候尽量保持代码的简洁性,并且传递尽可能少的参数给该方法。下面是该方法的定义:
public Object[] executeQuery(String sql, Object[] pStmntValues, ResultProcessor processor); |
我们知道在执行SQL语句的JDBC过程中,变化的因素有三个:SQL语句,PreparedStatement对象和如何解释和处理查询结果。在上面的方法定义中,sql中保存的就是SQL语句;pStmntValues对象数组保存的是需要放入preparedStatement对象中的值;processor参数是一个能够处理查询结果的对象,于是我们把JDBC程序涉及到的对象分成了三个部分。下面让我们来看一下executeQuery()和与它相关的一些方法的实现:
public class SQLProcessor { public Object[] executeQuery(String sql, Object[] pStmntValues, ResultProcessor processor) { //获得连接 Connection conn = ConnectionManager.getConnection(); //将SQL语句的执行重定向到handlQuery()方法 Object[] results = handleQuery(sql, pStmntValues, processor, conn); //关闭连接 closeConn(conn); //返回结果 return results; } protected Object[] handleQuery(String sql, Object[] pStmntValues, ResultProcessor processor, Connection conn) { //获得一个preparedStatement对象 PreparedStatement stmnt = null; try { //获得preparedStatement stmnt = conn.prepareStatement(sql); //向preparedStatement中送入值 if(pStmntValues != null) { PreparedStatementFactory.buildStatement(stmnt, pStmntValues); } //执行SQL语句 ResultSet rs = stmnt.executeQuery(); //获得查询结果 Object[] results = processor.process(rs); //关闭preparedStatement对象 closeStmnt(stmnt); //返回结果 return results; //处理异常 } catch(SQLException e) { String message = "无法执行查询语句 " + sql; //关闭所有资源 closeConn(conn); closeStmnt(stmnt); //抛出DatabaseQueryException throw new DatabaseQueryException(message); } } } ... } |