Spring框架学习[JdbcTemplate封装Jdbc](十)

2014-11-24 03:05:49 · 作者: · 浏览: 12
r) { ((ParameterDisposer) csc).cleanupParameters(); } //关闭CallableStatement JdbcUtils.closeStatement(cs); //释放数据库连接 DataSourceUtils.releaseConnection(con, getDataSource()); } }

(2).CallableStatement的call方法:

[java] view plaincopyprint //CallableStatement调用数据库的存储过程 public Map call(CallableStatementCreator csc, List declaredParameters) throws DataAccessException { final List updateCountParameters = new ArrayList (); final List resultSetParameters = new ArrayList (); final List callParameters = new ArrayList (); //遍历声明的参数 for (SqlParameter parameter : declaredParameters) { //如果参数是结果参数 if (parameter.isResultsParameter()) { //如果参数是返回结果集类型,则将参数添加到结果集参数集合中 if (parameter instanceof SqlReturnResultSet) { resultSetParameters.add(parameter); } //如果参数不是返回结果集类型,则将参数添加到更新数目参数集合中 else { updateCountParameters.add(parameter); } } //如果参数不是结果参数,则将参数添加到调用参数集合中 else { callParameters.add(parameter); } } //调用CallableStatement的execute方法,第二个参数是实现了//CallableStatementCallback接口的匿名内部类,用于回调 return execute(csc, new CallableStatementCallback >() { //真正调用jdbc操作的方法 public Map doInCallableStatement(CallableStatement cs) throws SQLException { //CallableStatement执行jdbc调用,如果是返回结果为结果集则为//ture,如果执行返回结果不是结果集则返回false boolean retVal = cs.execute(); //获取CallableStatement执行后数据库中被更新的记录数 int updateCount = cs.getUpdateCount(); if (logger.isDebugEnabled()) { logger.debug("CallableStatement.execute() returned '" + retVal + "'"); logger.debug("CallableStatement.getUpdateCount() returned " + updateCount); } //创建一个用于返回指向结果的集合 Map returnedResults = createResultsMap(); //如果CallableStatement执行的返回结果结果是结果集,或者 //CallableStatement执行的更新操作,数据库中有记录被更新 if (retVal || updateCount != -1) { //将存储过程调用结果提取成结果集集合 returnedResults.putAll(extractReturnedResults(cs, updateCountParameters, resultSetParameters, updateCount)); } //如果CallableStatement执行的返回结果不是结果集,且不是更新操作, //则将存储过程的输出参数提取为结果集 returnedResults.putAll(extractOutputParameters(cs, callParameters)); return returnedResults; } }); }