1、JdbcTemplate类图
2、JdbcAccessor
{@link org.springframework.jdbc.core.JdbcTemplate}和其他JDBC访问DAO帮助器的基类,定义了诸如DataSource和异常转换器之类的通用属性
3、JdbcOperations
指定一组基本JDBC操作的接口。 由{@link JdbcTemplate}实现。并不经常直接使用,而是一个有用的选项,可增强可测试性,因为它很容易被mocked or stubbed。
4、JdbcTemplate
4.1 执行流程
(1) 根据DataSource获取当前线程数据源绑定的Connection
(2) 创建Statement/PreparedStatement/CallableStatement
(3) 执行回调StatementCallback/PreparedStatementCallback/CallableStatementCallback
(4) 使用ResultSetExtractor提取执行结果
(5) 处理可能的SQL告警是否抛出SQLWarningException
(6) 释放资源
JDBC操作数据库流程大体如上,找出其中可变部分:Statement的创建、返回结果的处理,找出其中通用操作:参数的设置。面向对象适合于解决软件的“可扩展性”问题,找出可变部分,针对可变部分进行封装就有了XXXStatementCreator、XXXStatementCallback、XXXResultSetExtractor。
4.2 Statement创建器
创建各种类型的Statement:PreparedStatementCreator、CallableStatementCreator
4.3 Statement回调处理
Statement创建完之后回调处理:StatementCallback、PreparedStatementCallback、CallableStatementCallback、ConnectionCallback
4.4 预编译Statement参数设置 PreparedStatementSetter
参数设置器:
BatchPreparedStatementSetter
ArgumentPreparedStatementSetter
ArgumentTypePreparedStatementSetter
ParameterizedPreparedStatementSetter
4.5 执行结果提取 ResultSetExtractor
执行结果提取都会转换成ResultSetExtractor来提取结果。
SingleColumnRowMapper
RowMapperResultSetExtractor
SqlRowSet
SqlRowSetResultSetExtractor
RowCallbackHandler
RowCallbackHandlerResultSetExtractor
4.6 execute
public <T> T execute(PreparedStatementCreator psc, PreparedStatementCallback<T> action)
throws DataAccessException {
Assert.notNull(psc, "PreparedStatementCreator must not be null");
Assert.notNull(action, "Callback object must not be null");
if (logger.isDebugEnabled()) {
String sql = getSql(psc);
logger.debug("Executing prepared SQL statement" + (sql != null ? " [" + sql + "]" : ""));
}
// 根据DataSource获取当前线程数据源绑定的Connection
Connection con = DataSourceUtils.getConnection(obtainDataSource());
PreparedStatement ps = null;
try {
// PreparedStatementCreator创建PreparedStatement,不同Statement创建方式不同,抽象Statement的创建
ps = psc.createPreparedStatement(con);
// 准备给定的JDBC语句(或PreparedStatement或CallableStatement)设置参数,例如访存大小,最大行数和查询超时。
applyStatementSettings(ps);
// 执行PreparedStatementCallback,不同Statement执行SQL方式不同,抽象Statement的执行。结果的处理封装在PreparedStatementCallback中
T result = action.doInPreparedStatement(ps);
// 如果我们不忽略警告,则抛出SQLWarningException; 否则,将警告记录在调试级别。
handleWarnings(ps);
return result;
}
catch (SQLException ex) {
// Release Connection early, to avoid potential connection pool deadlock
// in the case when the exception translator hasn't been initialized yet.
if (psc instanceof ParameterDisposer) {
((ParameterDisposer) psc).cleanupParameters();
}
String sql = getSql(psc);
psc = null;
JdbcUtils.closeStatement(ps);
ps = null;
DataSourceUtils.releaseConnection(con, getDataSource());
con = null;
throw translateException("PreparedStatementCallback", sql, ex);
}
finally {
if (psc instanceof ParameterDisposer) {
((ParameterDisposer) psc).cleanupParameters();
}
JdbcUtils.closeStatement(ps);
DataSourceUtils.releaseConnection(con, getDataSource());
}
}
来源:CSDN
作者:只道当时是寻常
链接:https://blog.csdn.net/hjtlovelife/article/details/104515002