JdbcTemplate的CallBack回调机制很巧妙,算是aop的一种实现吧
使用JdbcTemplate省掉了我们打开和关闭connection的操作,同时需要一提的是在CallBack接口实现类的Connection处于auto-commit状态,在CallBack的实现方法不能进行事物管理。
execute代码
public Object execute(ConnectionCallback action) throws DataAccessException {
Assert.notNull(action, "Callback object must not be null");
Connection con = DataSourceUtils.getConnection(getDataSource());
try {
Connection conToUse = con;
if (this.nativeJdbcExtractor != null) {
// Extract native JDBC Connection, castable to OracleConnection or the like.
conToUse = this.nativeJdbcExtractor.getNativeConnection(con);
}
else {
// Create close-suppressing Connection proxy, also preparing returned Statements.
conToUse = createConnectionProxy(con);
}
return action.doInConnection(conToUse);
}
catch (SQLException ex) {
// Release Connection early, to avoid potential connection pool deadlock
// in the case when the exception translator hasn't been initialized yet.
DataSourceUtils.releaseConnection(con, getDataSource());
con = null;
throw getExceptionTranslator().translate("ConnectionCallback", getSql(action), ex);
}
finally {
DataSourceUtils.releaseConnection(con, getDataSource());
}
}
CallBack是一个接口,其中定义了doInConnection(conn),把要写的逻辑写在此方法中。
我们只需要传入一个conn即可,创建conn是前处理,关闭conn是后处理。 免去了这些繁琐的操作。JdbcTemplate的其它方法也是利用CallBack实现的