Spring5.X JdbcTemplate

百般思念 提交于 2020-02-26 16:49:25

1、JdbcTemplate类图

image.png

 

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());

 }

}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!