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

2014-11-24 03:05:49 · 作者: · 浏览: 11
cute() 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; } }); }

通过上面对CallableStatement相关处理方法的源码分析我们可以看到,execute方法基本和Statement和PreparedStatement是相同的,不同之处在于CallableStatement是通过jdbc调用数据库的存储过程,对于输入输出参数的组装,以及返回结果的处理方面有些特殊处理。

6.JdbcTemplate通过DataSourceUtils获取数据库连接:

JdbcTemplate的execute方法中通过DataSourceUtils.getConnection(getDataSource());获取数据库连接,下面我们就分析DataSourceUtils类获取数据库连接的实现过程:

[java] view plaincopyprint //获取数据库连接的入口方法 public static Connection getConnection(DataSource dataSource) throws CannotGetJdbcConnectionException { try { //通过doGetConnection方法来获取数据库连接 return doGetConnection(dataSource); } catch (SQLException ex) { throw new CannotGetJdbcConnectionException("Could not get JDBC Connection", ex); } } //获取数据库连接 public static Connection doGetConnection(DataSource dataSource) throws SQLException { Assert.notNull(dataSource, "No DataSource specified"); //把数据库连接放到事务管理器中管理 //通过TransactionSynchronizationManager中定义的线程局部 //变量(threadlocal)来和线程绑定数据库连接 ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource); //如果TransactionSynchronizationManager中已有与当前线程绑定的数据库连接 if (conHolder != null && (conHolder.hasConnection() || conHolder.isSynchronizedWithTransaction())) { //从当前线程线程局部变量中获取数据库连接 conHolder.requested(); //如果当前线程局部变量中没有绑定数据库连接,则为当前线程局部变量设置数据库连接 if (!conHolder.hasConnection()) { logger.debug("Fetching resumed JDBC Connection from DataSource"); conHolder.setConnection(dataSource.getConnection()); } //直接返回TransactionSynchronizationManager线程局部变量中的数据库连接 return conHolder.getConnection(); } //如果TransactionSynchronizationManager中没有和当前线程绑定的数据 //库连接,则从Spring配置文件配置的数据源对象中获取数据库连接 logger.debug("Fetching JDBC Connection from DataSource"); Connection con = dataSource.getConnection(); //如果当前线程事务同步是Active的,即在注册之前可以直接使用,避免不必要 //的实例对象创建 if (TransactionSynchronizationManager.isSynchronizationActive()) { logger.debug("Registering transaction synchronization for JDBC Connection"); //在事务中使用同一个数据库连接做jdbc操作,当事务结束后,线程绑定对象 //将被同步移除 ConnectionHolder holderToUse = conHolder; //如果存放数据库连接的线程局部变量为null,则重新创建一个线程局部变量 if (holderToUse == null) { holderToUse = new ConnectionHolder(con); } //如果存放数据库连接的线程局部变量不为null,则将数据库连接存放到线程 //局部变量中 else { holderToUse.setConnection(con); } //请求数据库连接 holderToUse.requested(); //为当前线程注册事务同步 TransactionSynchronizationManager.registerSynchronization( new ConnectionSynchronization(holderToUse, dataSource)); //标记当前数据库连接为事务同步 holderToUse.setSynchronizedWithTransaction(true); if (holderToUse != conHolder) { //将数据源绑定到当前线程局部变量 TransactionSynchronizationManager.bindResource(dataSource, holderToUse); } } return con; }