好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Spring JdbcTemplate框架(1)——基本原理

已经能够满足大部分用户擦欧洲哦数据库的需求,但是在使用 JDBC 时,应用必须自己来管理数据库资源。 spring 对数据库操作需求提供了很好的支持,并在原始 JDBC 基础上,构建了一个抽象层,提供了许多使用 JDBC 的模板和驱动模块,为 Spring 应用操作关系数据库提供了更大的便利。

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)——基本原理的详细内容...

  阅读:23次