标签:
JDBC已经能够满足大部分用户擦欧洲哦数据库的需求,但是在使用JDBC时,应用必须自己来管理数据库资源。spring对数据库操作需求提供了很好的支持,并在原始JDBC基础上,构建了一个抽象层,提供了许多使用JDBC的模板和驱动模块,为Spring应用操作关系数据库提供了更大的便利。
Spring封装好的模板,封装了数据库存取的基本过程,方便用户。
Spring JDBCTemplate从名字来说,这就是一个模板,的确是,它确实实现了涉及模式中的模板模式。如下:
JDBCTemplate继承了基类JdbcAccessor和接口类JdbcOperation。在基类JdbcAccessor的设计中,对DataSource数据源进行管理和配置。在JdbcOperation接口中,定义了通过Jdbc操作数据库的基本操作方法,而JdbcTemplate提供这些接口方法的实现,比如execute方法、query方法、update方法等。
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());
以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)——基本原理
标签:
原文地址:http://blog.csdn.net/liutengteng130/article/details/45957573