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

2014-11-24 03:05:49 · 作者: · 浏览: 4
llback, SqlProvider { //JdbcTemplate中真正执行输入的sql语句的地方 public Object doInStatement(Statement stmt) throws SQLException { stmt.execute(sql); return null; } //获取输入的sql语句 public String getSql() { return sql; } } //调用通用的处理静态sql语句的execute方法 execute(new ExecuteStatementCallback()); }//通用的处理静态sql语句public T execute(StatementCallback action) throws DataAccessException { Assert.notNull(action, "Callback object must not be null"); //根据配置的数据源获取数据库连接 Connection con = DataSourceUtils.getConnection(getDataSource()); Statement stmt = null; try { Connection conToUse = con; //如果JdbcTemplate指定了本地连接,则将获取到的数据库连接转换为本地连接 if (this.nativeJdbcExtractor != null && this.nativeJdbcExtractor.isNativeConnectionNecessaryForNativeStatements()) { conToUse = this.nativeJdbcExtractor.getNativeConnection(con); } //创建Statement stmt = conToUse.createStatement(); applyStatementSettings(stmt); Statement stmtToUse = stmt; //如果JdbcTemplate指定了本地连接,则将Statement转换为本地Statement if (this.nativeJdbcExtractor != null) { stmtToUse = this.nativeJdbcExtractor.getNativeStatement(stmt); } //调用ExecuteStatementCallback类的doInStatement回调方法,执行sql语句 T result = action.doInStatement(stmtToUse); handleWarnings(stmt); //返回执行结果 return result; } catch (SQLException ex) { //产生异常,则关闭Statement JdbcUtils.closeStatement(stmt); stmt = null; //释放数据库连接 DataSourceUtils.releaseConnection(con, getDataSource()); con = null; //将数据库异常封装为Spring异常向调用者抛出 throw getExceptionTranslator().translate("StatementCallback", getSql(action), ex); } finally { //关闭Statement,释放数据库连接 JdbcUtils.closeStatement(stmt); DataSourceUtils.releaseConnection(con, getDataSource()); } }

Execute方法是JdbcTemplate执行jdbc操作的核心,其他的方法都是通过调用execute方法来操作数据库。

(2). Statement的查询方法:

JdbcTemplate处理Statement的查询方法有很多,但是其中最基本的方法源码如下:

[java] view plaincopyprint //静态sql的查询方法,第二个参数ResultSetExtractor是查询结果集转换器,用于处理查//询得到的结果集 public T query(final String sql, final ResultSetExtractor rse) throws DataAccessException { Assert.notNull(sql, "SQL must not be null"); Assert.notNull(rse, "ResultSetExtractor must not be null"); if (logger.isDebugEnabled()) { logger.debug("Executing SQL query [" + sql + "]"); } //实现了StatementCallback和SqlProvider接口的内部类,用于execute方法回调 class QueryStatementCallback implements StatementCallback , SqlProvider { //execute方法执行查询操作时回调方法,真正执行jdbc操作的方法 public T doInStatement(Statement stmt) throws SQLException { ResultSet rs = null; try { //调用Statement的查询方法 rs = stmt.executeQuery(sql); ResultSet rsToUse = rs; //如果JdbcTemplate指定了本地jdbc提取器,则将查询得到的结果 //集提取为本地结果集 if (nativeJdbcExtractor != null) { rsToUse = nativeJdbcExtractor.getNativeResultSet(rs); } //使用结果集提取器对查询得到的结果集进行处理 return rse.extractData(rsToUse); } finally { //关闭结果集 JdbcUtils.closeResultSet(rs); } } //获取sql public String getSql() { return sql; } } //调用处理Statement的execute方法 return execute(new QueryStatementCallback()); }