org.springframework-jdbc
今天看了下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的更多相关文章
- org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection 原因
org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection 可能出现的原因 ...
- org.springframework.jdbc.BadSqlGrammarException
org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: java.sql.SQLExc ...
- org.springframework.jdbc.datasource
org.springframework.jdbc.datasource.DataSourceUtils /** * Actually obtain a JDBC Connection from the ...
- 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 ...
- 错误:org.springframework.jdbc.support.SQLErrorCodesFactory - SQLErrorCodes loaded
使用spring+mybatis整合时报错:org.springframework.jdbc.support.SQLErrorCodesFactory - SQLErrorCodes loaded 错 ...
- 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; ...
- 使用Oracle数据库时的org.springframework.jdbc.BadSqlGrammarException:
org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: java.sql.SQLExc ...
- org.springframework.jdbc.UncategorizedSQLException
org.springframework.jdbc.UncategorizedSQLException: StatementCallback; uncategorized SQLException fo ...
- 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 ...
- 解决: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 ...
随机推荐
- springBoot文档地址
文档: https://www.gitbook.com/book/qbgbook/spring-boot-reference-guide-zh/details 配置: http://docs.spri ...
- 简单说明什么是递归?什么情况会使用?并使用java实现一个简单的递归程序。
解答: 1)递归做为一种算法在程序设计语言中广泛应用.是指函数/过程/子程序在运行过程中直接或间接调用自身而产生的重入现象. 2)递归算法一般用于解决三类问题: a.数据的定义是按递归定义的.(Fib ...
- 更改MVC注册Areas的顺序,掌控Areas的运作
[转自:http://www.cnblogs.com/dozer/archive/2010/04/14/change-order-of-MVC-Areas.html] 一.前言 首先,有人要问,为什么 ...
- CentOS7.1 安装Liberty之环境准备(1)
一.基础平台 1.一台装有VMware的windows系统(可联网) 2.CentOS 7.1 64bit镜像 二.最小化安装两台CentOS 7.1 的虚拟机controller.compute1, ...
- 可以输入也可以下拉选择的select
网址:http://www.helloweba.com/view-blog-348.html 示例:http://www.helloweba.com/demo/2016/editable-select ...
- 修改Chem 3D模型的化学键属性的方法有哪些
很多的用户在绘制化学图形过程中发现很多的图形都是立体结构的,这个时候就需要用Chem3D,它是ChemOffice的核心组件之一,在绘制立体模型和计算化学数据方面具有不可替代的作用.虽然ChemDra ...
- sql 存储过程调用函数
/****************************************************************************** ** Name: usp_biz_Con ...
- 自己搭建v,p,n过程
安装dockeryum install -y docker把docker设置为服务systemctl enable docker.service启动dockersystemctl start dock ...
- memcache的内存管理机制
Memcache使用了Slab Allocator的内存分配机制:按照预先规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题Memcache的存储涉及到slab,page,chunk三 ...
- work_log
机房搬迁 1. 虚拟机-à实体机 2. ldap 服务器 3. 考勤数据服务器 4. glpi 权限管理. 5. 备份脚本. 6. 试验jira重新启动. Luke--- 1,报价文档,相关技术者,技 ...