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

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

(3).Statement的更新方法:

[java] view plaincopyprint //静态sql的更新方法 public int update(final String sql) throws DataAccessException { Assert.notNull(sql, "SQL must not be null"); if (logger.isDebugEnabled()) { logger.debug("Executing SQL update [" + sql + "]"); } //实现了StatementCallback和SqlProvider接口的内部类,Statement //的execute方法回调 class UpdateStatementCallback implements StatementCallback , SqlProvider { //Statement的execute方法更新操作时回调方法,真正执行jdbc操作的方法 public Integer doInStatement(Statement stmt) throws SQLException { //Statement执行jdbc的更新操作,返回影响行数 int rows = stmt.executeUpdate(sql); if (logger.isDebugEnabled()) { logger.debug("SQL update affected " + rows + " rows"); } return rows; } public String getSql() { return sql; } } //调用Statement的execute方法 return execute(new UpdateStatementCallback()); }

通过对Statement相关处理的方法源码分析,我们可以看出execute方法是核心方法,在execute方法中,主要获取数据库连接和创建Statement,同时当执行完jdbc操作之后释放连接和资源等数据库操作的通用流程,所有的查询,更新等具体操作均是通过向execute方法传递合适的回调参数来使用execute方法中的数据库通用流程和资源,真正执行jdbc操作的方法由具体的回调内部类来实现。

4.JdbcTemplate处理PreparedStatement的相关方法实现:

(1).处理PreparedStatement的execute方法:

[java] view plaincopyprint //PreparedStatement处理sql语句的execute方法 public T execute(String sql, PreparedStatementCallback action) throws DataAccessException { //将sql语句封装成为SimplePreparedStatementCreator,调用处理//PreparedStatement的方法 return execute(new SimplePreparedStatementCreator(sql), action); } //处理PreparedStatement public T execute(PreparedStatementCreator psc, PreparedStatementCallback action) throws DataAccessException { Assert.notNull(psc, "PreparedStatementCreator must not be null"); Ass