今天看了下Spring的源码——关于JDBC的"薄"封装,Spring 用一个Spring JDBC模板类来封装了繁琐的JDBC操作。下面仔细讲解一下Spring JDBC框架。

一、首先看一下为什么要对JDBC进行封装?

传统的JDBC API实现比较底层,不管用户执行一个复杂的数据库操作还是一个简单的数据库查询操作,都有一个模板可以使用:捕获或抛出异常—获取连接—创建Statement或PreparedStatement—执行数据库操作—获取结果(ResultSet)—其他操作—处理异常—关闭ResultSet—关闭Statement或PreparedStatement—关闭连接。这样的重复操作会让人比较有结构感的同时也消耗了大量的时间。既然所有的数据库操作都可以引用这一模板。那Spring就对JDBC API进行了一层"薄"封装,让程序员脱离繁琐的结构而只编写各个数据库操作程序中的核心部分:CRUD。通过在配置文件中配置数据源来获取连接。这样就减少了那些在传统JDBC编程中的重复编程,让这部分重复交由Spring JDBC容器来处理。

二、Spring JDBC封装是怎样的?

Spring JDBC是提供了一个数据库操作的模板类JdbcTemplate来进行封装的。org.springframework.jdbc.core.JdbcTemplate extends JdbcAccessor implements JdbcOperations 。下面我们来具体看一下这个封装类:

1、JdbcAccessor 是一个抽象类,实现了InitializingBean接口。InitializingBean接口实现了对BeanFactory中的所有属性设置后的响应。JdbcAccessor实现InitializingBean的唯一方法afterPropertiesSet来对设置数据源和其他的日志信息和异常信息和是否是LazyInit(懒加载)。

2、JdbcOperations是一个接口。这个接口定义了一个JDBC操作的集合,多数用回调来对操作进行定义。下面就是其中的方法定义,基本上也可以作为SpringJDBC的文档进行阅读。

操作 JdbcOperations 方法定义 
处理简单连接Connection Object execute(ConnectionCallback action)
处理静态查询Statement

Object execute(StatementCallback action)

void execute(String sql)

Object query(String sql, ResultSetExtractor rse)

void query(String sql, RowCallbackHandler rch)

List query(String sql, RowMapper rowMapper)

Object queryForObject(String sql, RowMapper rowMapper)

Object queryForObject(String sql, Class requiredType)

Map queryForMap(String sql)

long queryForLong(String sql)

int queryForInt(String sql)

List queryForList(String sql, Class elementType)

List queryForList(String sql)

SqlRowSet queryForRowSet(String sql)

int update(String sql)

int[] batchUpdate(String[] sql)

处理PreparedStatement

Object execute(PreparedStatementCreator psc, PreparedStatementCallback action)

Object execute(String sql, PreparedStatementCallback action)

Object query(PreparedStatementCreator psc, ResultSetExtractor rse)

Object query(String sql, PreparedStatementSetter pss, ResultSetExtractor rse)

Object query(String sql, Object[] args, int[] argTypes, ResultSetExtractor rse)

Object query(String sql, Object[] args, ResultSetExtractor rse)

void query(PreparedStatementCreator psc, RowCallbackHandler rch)

void query(String sql, PreparedStatementSetter pss, RowCallbackHandler rch)

void query(String sql, Object[] args, int[] argTypes, RowCallbackHandler rch)

void query(String sql, Object[] args, RowCallbackHandler rch)

List query(PreparedStatementCreator psc, RowMapper rowMapper)

List query(String sql, PreparedStatementSetter pss, RowMapper rowMapper)

List query(String sql, Object[] args, int[] argTypes, RowMapper rowMapper)

List query(String sql, Object[] args, RowMapper rowMapper)

Object queryForObject(String sql, Object[] args, int[] argTypes, RowMapper rowMapper)

Object queryForObject(String sql, Object[] args, RowMapper rowMapper)

Object queryForObject(String sql, Object[] args, int[] argTypes, Class requiredType)

Object queryForObject(String sql, Object[] args, Class requiredType)

Map queryForMap(String sql, Object[] args, int[] argTypes)

Map queryForMap(String sql, Object[] args)

long queryForLong(String sql, Object[] args, int[] argTypes)

long queryForLong(String sql, Object[] args)

int queryForInt(String sql, Object[] args, int[] argTypes)

int queryForInt(String sql, Object[] args)

List queryForList(String sql, Object[] args, int[] argTypes, Class elementType)

List queryForList(String sql, Object[] args, Class elementType)

List queryForList(String sql, Object[] args, int[] argTypes)

List queryForList(String sql, Object[] args)

SqlRowSet queryForRowSet(String sql, Object[] args, int[] argTypes)

SqlRowSet queryForRowSet(String sql, Object[] args)

int update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder)

int update(String sql, PreparedStatementSetter pss)

int update(String sql, Object[] args, int[] argTypes)

int update(String sql, Object[] args)

int[] batchUpdate(String sql, BatchPreparedStatementSetter pss)

处理callable Statement

Object execute(CallableStatementCreator csc, CallableStatementCallback action)

Object execute(String callString, CallableStatementCallback action)

Map call(CallableStatementCreator csc, List declaredParameters)

上面的所有方法均throws DataAccessException;

3、DataAccessException继承NestedRuntimeException,NestedRuntimeException继承RuntimeException,主要输出异常信息。异常类都不会自己实现太多的方法而是一般调用父类方法来进行实现,只是更细化相应信息的输出和传入相应参数到父类方法进行执行。

4、大家可以看到上述方法很多是用回调来作为参数,而具体在JdbcTemplate中方法的实现还是利用传统的JDBC API中的Connection、Statement、PreparedStatement、ResultSet等类和相应的方法来进行实现回调。

org.springframework-jdbc的更多相关文章

  1. org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection 原因

    org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection 可能出现的原因     ...

  2. org.springframework.jdbc.BadSqlGrammarException

    org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: java.sql.SQLExc ...

  3. org.springframework.jdbc.datasource

    org.springframework.jdbc.datasource.DataSourceUtils /** * Actually obtain a JDBC Connection from the ...

  4. HTTP Status 500 - Request processing failed; nested exception is org.springframework.jdbc.BadSqlGram

    HTTP Status 500 - Request processing failed; nested exception is org.springframework.jdbc.BadSqlGram ...

  5. 错误:org.springframework.jdbc.support.SQLErrorCodesFactory - SQLErrorCodes loaded

    使用spring+mybatis整合时报错:org.springframework.jdbc.support.SQLErrorCodesFactory - SQLErrorCodes loaded 错 ...

  6. jdbc连接oracle时报错 Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableC

    错误: Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; ...

  7. 使用Oracle数据库时的org.springframework.jdbc.BadSqlGrammarException:

    org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: java.sql.SQLExc ...

  8. org.springframework.jdbc.UncategorizedSQLException

    org.springframework.jdbc.UncategorizedSQLException: StatementCallback; uncategorized SQLException fo ...

  9. org.springframework.jdbc.UncategorizedSQLException: Error attempting to get column 'alarmGroup' from result set. Cause: java.sql.SQLException: Error

    异常展示: org.springframework.jdbc.UncategorizedSQLException: Error attempting to get column 'alarmGroup ...

  10. 解决:No qualifying bean of type [org.springframework.jdbc.core.JdbcTemplate] found for dependency

    错误: Description: Field jdbcTemplate in com.gwd.dao.impl.IUserDaoImpl required a bean of type 'org.sp ...

随机推荐

  1. 简单的SpringCloud 熔断Hystrix

    pom配置 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId> ...

  2. pl/sql 实例解析 01

    1. 合并 firstname, lastname. 1: declare 2: v_first_name varchar2(255); 3: v_last_name varchar2(255); 4 ...

  3. linux输入法

    sudo apt-get install fcitx-table-wbpy安装fcitx 中文是灰色的就拖到第一个 桌面右上角有个设置,可以添加拼音 拼音特别难用

  4. 运动规划(Motion Planning)

    相关介绍: https://mp.weixin.qq.com/s?__biz=MzA5MDE2MjQ0OQ==&mid=2652786406&idx=1&sn=f937dd6a ...

  5. 【BZOJ】1596: [Usaco2008 Jan]电话网络(树形dp+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1596 一开始交了个貌似正确的dp,wa了. 我只考虑了儿子覆盖的情况,没有考虑父亲QAQ 那么我们要 ...

  6. 【BZOJ】3396: [Usaco2009 Jan]Total flow 水流 (最大流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3396 裸的最大流跑过.. #include <cstdio> #include < ...

  7. abp项目如何按业务功能模块横向分割?

    1.为什么要做分层? 请先看项目分层的最后结构: 2.设计的初衷 项目较大,且主题鲜明,分为:BI模块.DM-用户洞察模块.Manage-应用管理模块.Report应用分析报表模块,大模块之间并无依赖 ...

  8. Linux USB 鼠标输入驱动具体解释

    平台:mini2440 内核:linux 2.6.32.2 USB设备插入时.内核会读取设备信息,接着就把id_table里的信息与读取到的信息做比較.看是否匹配,假设匹配.就调用probe函数. U ...

  9. python update from 2.6 to 2.7

    1 .wget http://python.org/ftp/python/2.7.3/Python-2.7.3.tar.bz2 2.tar -jxvf Python-2.7.3.tar.bz2 &am ...

  10. Java transient关键字使用小记(转)

    哎,虽然自己最熟的是Java,但很多Java基础知识都不知道,比如transient关键字以前都没用到过,所以不知道它的作用是什么,今天做笔试题时发现有一题是关于这个的,于是花个时间整理下transi ...