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

2014-11-24 03:05:49 · 作者: · 浏览: 5
ms,new RowCallbackHandler(){ public void processRow(ResultSet rs)throws SQLException{ person.setName(rs.getString("username")); person.setPassword(rs.getString("passwd")); person.setAddress(rs.getString("address")); } }); return person; } }

2.Spring JdbcTemplate的工作流程:

通过1中的小例子,我们可以总结出SpringJdbcTemplate的工作流程如下:

(1).配置数据源:

Spring中,将管理数据库连接的数据源当作普通Java Bean一样在Spring IoC容器中管理,当应用使用数据源时Spring IoC容器负责初始化数据源。

(2).将数据源注入JdbcTemplate:

JdbcTemplate中dataSource属性用于注入配置的数据源,Spring IoC容器通过依赖注入将配置的数据源注入到Spring对Jdbc操作的封装类JdbcTemplate中。

(3).应用中使用JdbcTemplate:

注入了数据源的JdbcTemplate就可以在应用中使用了,应用中对数据源的增删改查等操作都可以使用JdbcTemplate对外提供的方法操作数据库

3.JdbcTemplate处理Statement的相关方法实现:

JdbcTemplate的execute方法是JdbcTemplate的核心方法,是JdbcTemplate调用jdbc进行查询,添加,删除和更新操作的基础方法,在execute方法中,主要实现对数据库的基本操作,如:获取数据库连接;根据应用对数据库的需要创建数据库的Statement;对数据库操作进行回调;处理数据库异常;关闭数据库连接等等。JdbcTemplate中有真的Jdbc中Statement、PreparedStatement和CallableStatement处理的execute方法,首先我们分析处理Statement的相关方法:

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

[java] view plaincopyprint //execute方法执行的是输入的sql语句,且没有返回值的 public void execute(final String sql) throws DataAccessException { if (logger.isDebugEnabled()) { logger.debug("Executing SQL statement [" + sql + "]"); } //内部类,实现类StatementCallback和SqlProvider接口,执行sql语句的回调类 class ExecuteStatementCallback implements StatementCallback , 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()); } }