Spring 封装好的模板,封装了数据库存取的基本过程,方便用户。
一、模板方法
Spring JDBCTemplate 从名字来说,这就是一个模板,的确是,它确实实现了涉及模式中的模板模式。如下:
JDBCTemplate 继承了基类 JdbcAccessor 和接口类 JdbcOperation 。在基类 JdbcAccessor 的设计中,对 DataSource 数据源进行管理和配置。在 JdbcOperation 接口中,定义了通过 Jdbc 操作数据库的基本操作方法,而 JdbcTemplate 提供这些接口方法的实现,比如 execute 方法、 query 方法、 update 方法等。
二、使用 JdbcTemplate
JdbcTemplate temp = new JdbcTemplate(datasource); class ExecuteStatementCallback implements StatementCallback<object>,Sqlprovider{ public Object doInStatement(Statement stmt) throws SQLException { //spring封装数据库操作 stmt.execute(); return null; } public String getSql(){ return sql; } } temp.sexecute(new ExecuteStatemnetCallback());
三、JdbcTemplate实现之Execute
以 Execute 为例:
通过上图看到, Execute 方法封装了对数据库的操作,首先取得数据库连接 Connection ,根据应用对数据库操作的需要创建数据库的 Statement ,对数据库操作进行回调,处理数据库异常,最后把数据库 Connection 关闭。
代码:
public void execute(final String sql)throws DataAccessException{ if(logger.isDebugEnabled()){ logger.debug("Executing SQL statement ["+ sql +"]"); } class ExecuteStatementCallback implements StatementCallback<Object>,SqlProvider{ public Object doInStatement(Statement stmt) throws SQLException{ stmt.execute(sql); return null; } public String getSql(){ return sql; } } execute(new ExecuteStatementCallback()); } //使用java.sql.Statement处理静态SQL语句 public <T> T execute(StatementCallback<T> action) throws DataAccessException{ Assert.notNull(action,"Callback object must not be null"); //这里取得数据库的Connection,这个数据库的Connection已经在Spring的事务管理之下 Connection con = DataSourceUtils.getConnection(getDataSource()); Statement stmt = null; try { Connection conToUse = con; if (this.nativeJdbcExtractor != null && this.nativeJdbcExtractor.isNativeConnectionNecessaryForNativeStatements()) { conToUse = this.nativeJdbcExtractor.getNativeConnection(con); } //创建Statement stmt = conToUse.createStatement(); applyStatementSettings(stmt); Statement stmtToUse = stmt; if (this.nativeJdbcExtractor != null) { stmtToUse = this.nativeJdbcExtractor.getNativeStatement(stmt); } //这里调用回调函数 T result = action.doInStatement(stmtToUse); handleWarnings(stmt); return result; } catch (SQLException ex) { //如果捕捉到异常,把数据库连接释放掉,抛出一个经过Spring转换过的Spring数据库异常 JdbcUtils.closeStatement(stmt); stmt = null; DataSourceUtils.releaseConnection(con, getDataSource()); con = null; throw getExceptionTranslator().translate("StatementCallback",getSql(action),ex); } finally{ JdbcUtils.closeStatement(stmt); //释放数据库链接 DataSourceUtils.releaseConnection(con, getDataSource()); } }
四、总结
通过这种 方式,一方面提高了应用开发的效率,另一方面又为应用开发提供了灵活性。另外 spring 建立的 JDBC 框架中,还涉及了一种更面向对象的方法,相对于 JDBC 模板,这种实现更像是一个简单的 ORM 工具,为应用提供了另外一种选择。
下面继续介绍使用 Spring JDBCTemplate 实现动态建表。
Spring JdbcTemplate框架(1)——基本原理
标签:
查看更多关于Spring JdbcTemplate框架(1)——基本原理的详细内容...