Spring框架学习[JdbcTemplate封装Jdbc](七)
2014-11-24 03:05:49
·
作者:
·
浏览: 3
eof ParameterDisposer) { ((ParameterDisposer) psc).cleanupParameters(); } String sql = getSql(psc); psc = null; JdbcUtils.closeStatement(ps); ps = null; DataSourceUtils.releaseConnection(con, getDataSource()); con = null; //将jdbc相关异常封装转换为Spring异常向调用者抛出 throw getExceptionTranslator().translate("PreparedStatementCallback", sql, ex); } finally { //清除PreparedStatement的参数 if (psc instanceof ParameterDisposer) { ((ParameterDisposer) psc).cleanupParameters(); } //关闭PreparedStatement JdbcUtils.closeStatement(ps); //释放数据库连接 DataSourceUtils.releaseConnection(con, getDataSource()); } }
(2). PreparedStatement的查询方法:
和Statement类似,JdbcTemplate中PreparedStatement的查询方法也非常多,我们以最基本的查询方法源码为例分析其处理流程:
[java] view plaincopyprint //PreparedStatement查询方法,第一个参数PreparedStatementCreator为封装sql语句的//类,第二个参数PreparedStatementSetter为向PreparedStatement设置参数的类,第三//个参数ResultSetExtractor为处理结果集的类 public
T query( PreparedStatementCreator psc, final PreparedStatementSetter pss, final ResultSetExtractor
rse) throws DataAccessException { Assert.notNull(rse, "ResultSetExtractor must not be null"); logger.debug("Executing prepared SQL query"); //调用PreparedStatement的execute方法,第二个参数为一个实现了//PreparedStatementCallback接口的匿名内部类,被execute回调 return execute(psc, new PreparedStatementCallback
() { //执行jdbc操作的方法 public T doInPreparedStatement(PreparedStatement ps) throws SQLException { ResultSet rs = null; try { //如果PreparedStatement参数不为null,则为PreparedStatement设置参数值 if (pss != null) { pss.setValues(ps); } //执行jdbc查询操作 rs = ps.executeQuery(); ResultSet rsToUse = rs; //如果JdbcTemplate指定了本地jdbc提取器,则将查询得到的结果 //集转换为本地jdbc结果集 if (nativeJdbcExtractor != null) { rsToUse = nativeJdbcExtractor.getNativeResultSet(rs); } //使用配置的结果集处理器提取结果集数据 return rse.extractData(rsToUse); } finally { //关闭结果集 JdbcUtils.closeResultSet(rs); //清除PreparedStatement参数 if (pss instanceof ParameterDisposer) { ((ParameterDisposer) pss).cleanupParameters(); } } } }); }