今天看了下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等类和相应的方法来进行实现回调。

Spring JDBC模板类—org.springframework.jdbc.core.JdbcTemplate(转)的更多相关文章

  1. 开涛spring3(7.2) - 对JDBC的支持 之 7.2 JDBC模板类

    7.2  JDBC模板类 7.2.1  概述 Spring JDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDB ...

  2. (转)JDBC模板类。

    Spring JDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDBC模板类是第一种工作模式. JdbcTempl ...

  3. spring3:对JDBC的支持 之 JDBC模板类

    7.2  JDBC模板类 7.2.1  概述 Spring JDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDB ...

  4. Spring中的JDBC模板类入门

    1.Spring框架中提供了很多持久层的模板类来简化编程,使用模板类编写程序会变的简单 2.提供了JDBC模板,Spring框架提供的 *JdbcTemplate类 3.Spring框架可以整合Hib ...

  5. [原创]java WEB学习笔记109:Spring学习---spring对JDBC的支持:使用 JdbcTemplate 查询数据库,简化 JDBC 模板查询,在 JDBC 模板中使用具名参数两种实现

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  6. 创建JDBC模板简化代码、JDBC应用的事务管理以及连接池的作用

    一.创建JDBC模板简化代码 一个简单的查询.要做这么一大堆事情,并且还要处理异常,我们不防来梳理一下: 1.获取connection  2.获取statement  3.获取resultset  4 ...

  7. JDBC工具类—如何封装JDBC

    “获得数据库连接”操作,将在以后的增删改查所有功能中都存在,可以封装工具类JDBCUtils.提供获取连接对象的方法,从而达到代码的重复利用. 该工具类提供方法:public static Conne ...

  8. Java学习笔记43(Spring的jdbc模板)

    在之前的学习中,我们执行sql语句,需要频繁的开流,关流比较麻烦,为了更加的简化代码,我们使用Spring 的jdbc模板jdbcTemplate来简化我们的代码量:需要导入的包有: 我们在之前的dr ...

  9. 演示Spring框架的JDBC模板的简单操作

    1. 步骤一:创建数据库的表结构 create database spring_day03; use spring_day03; create table t_account( id int prim ...

随机推荐

  1. BAT常问问题总结以及回答(多线程回答一)

    多线程 什么是线程?     进程概念:进程是指运行中的应用程序,每个进程都有自己独立的地址空间(内存空间),比如用户点击桌面的IE浏览器,就启动了一个进程,操作系统就会为该进程分配独立的地址空间.当 ...

  2. struts1——静态ActionForm与动态ActionForm

    在struts1中,我们能够使用ActionForm来获取从client端提交上来的数据.并通过action配置中的name属性.将某个ActionForm配置到某次请求应答的Action中.作为本次 ...

  3. 【HDU 1847】 Good Luck in CET-4 Everybody!

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=1847 [算法] 我们知道,每一种状态,要么必胜,要么必败 记忆化搜索即可 [代码] #includ ...

  4. Node.js:模块系统

    ylbtech-Node.js:模块系统 1.返回顶部 1. Node.js模块系统 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的 ...

  5. A - George and Accommodation

    Problem description George has recently entered the BSUCP (Berland State University for Cool Program ...

  6. Absolute Horizontal And Vertical Centering In CSS

    Quick CSS Trick: How To Center an Object Exactly In The Center Centering in CSS: A Complete Guide Ab ...

  7. 计算机二级考试Access教程

    本教程对编程语言各种要点进行详细的讲解介绍,从基础知识到实用技术功能,内容涵盖了从数组,类等基本概念到多态.模板等高级概念.教程本着实用的原则,每一小节都结合了可以笔试.面试的常见程序实例,以便从第一 ...

  8. MySQL数据库的使用流程,代码解释+Hibernate连接数据库

    数据库的使用流程: 1.注册驱动: 2.用DriverManager.getConnection方法获得连接对象con: A方法:  3.用连接对象的createStatement()方法,获得可以执 ...

  9. Ext未定义问题解决

    做的项目用到EXT.NET,调试时候没问题,发布到IIS上出现EXT未定义,把项目的应用程序池改为Classic 模式就可以了.

  10. 简明git教程(单人版本)

    最近开始写一个比较大的东西,所以需要用到git,之前一直在用金山快盘和乌龟搭建的SVN,最近想尝试一下git 1.安装 Ubuntu: sudo apt-get install git 老版本的Ubu ...