1 JdbcTemplate的诞生

JDBC作为Java平台访问关系数据库的标准API,其成功是有目共睹的。为了避免在JDBC API在使用中的种种尴尬局面(几乎程式一样的代码,繁琐的异常处理),Spring框架提出了JdbcTemplate作为数据访问的Helper类。JdbcTemplate是整个Spring数据抽象层提供的所有JDBC API最佳实践的基础,框架内其他更加方便的Helper类以及更高层次的抽象,全部构建于JdbcTemplate之上。概括地说,JdbcTemplate主要关注如下两个事情:

  • 封装所有基于JDBC的数据访问代码,以统一的格式和规范来使用JDBC API。所有基于JDBC的数据访问需求现在全部通过JdbcTemplate进行,从而避免了让繁琐易错的基于JDBC API的数据访问代码散落于系统各处。
  • SQLException所提供的异常信息在框架内进行统一转译,将基于JDBC的数据访问异常纳入Spring自身的异常层次体系中,统一了数据接口的定义,简化了客户端代码对数据访问异常的处理。

2 模版方法模式简介

模版方法模式主要用于对算法或者行为逻辑进行封装,即如果多个类中存在某些相似的算法逻辑或者行为逻辑,可以将这些相似的逻辑提取到模板方法类(抽象类)中实现,然后让相应的子类根据需要实现某些自定义的逻辑。

3 JdbcTemplate的演化

我们可以看一下直接使用JDBC API进行数据访问的,会发现除了小部分的差异以外,几乎都是按照同一个流程下来的:

// 取得数据连接
con = getDataSource().getConnection();
// 根据Connection创建对应的PreparedStatement
ps = con.prepareStatement(..);
// 根据传入的SQL语句或者参数。借助PreparedStatement进行数据库的更新或者查询。
ps.executeUpdate(sql)
// 如果是查询操作,那么可以按如下代码对结果集进行遍历,抽取查询后的结果
ResultSet rs = ps.executeQuery(sql);
while (rs.next()) {
processResultRow(rs);
}
// 关闭相应的PreparedStatement
ps.close(); ps = null;
//处理数据库访问异常
catch(SQLExecption e) {...}
// 关闭数据库连接以避免连接泄漏导致系统崩溃
finally {con.close();}

对于多个DAO中充斥的几乎相同的JDBC代码,我们可以将共有的一些行为提取到模板方法类中,而特有的操作,比如每次执行不同的更新,或者每次针对不同的查询结果进行不同的处理等行为,则放入具体的子类中实现。但是,仅使用模板方式,JdbcTemplate将会顶着abstract的帽子,并不能独立使用,所以,Spring框架还引入了相应的Callback接口定义,以避免每次使用该Helper类的时候都需要进行子类化。该Callback接口的定义为

public interface StatementCallback<T> {
T doInStatement(Statement var1) throws SQLException, DataAccessException;
}

引入该接口后,我们的JdbcTemplate就可以摆脱abstract的帽子,作为一个真正的Helper类来存在了。

public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {
public <T> T execute(StatementCallback<T> action) throws DataAccessException {
Connection con = null;
Statement stmt = null;
try {
con = getConnection();
stmt = con.createStatement();
T result = action.doWithStatement(stmt);
} catch (SQLException e) {
DataAccessException ex = translateSQLException(e);
throws ex;
} finally {
closeStatement(stmt);
releaseConnection(con);
}
}
...// 其他方法定义
}

要想在相应的DAO实现类中使用JdbcTemplate,只需要根据情况提供参数和相应的StatementCallback就行了,如下代码演示了JdbcTemplate原型的使用:

JdbcTemplate jdbcTemplate = ...;
final String sql = "update...";
StatementCallback callback = new StatementCallback() {
public Object doWithStatement(Statement stmt) {
return new Integer(stmt.executeUpdate(sql));
};
JdbcTemplate.execute(callback);
}

这样,开发人员只需要关心doWithStatement中与数据访问有关的东西,对于JDBC底层的细节则不需要过多的考虑。

Spring中的JDBC API的更多相关文章

  1. spring框架总结(04)----介绍的是Spring中的JDBC模板

    1.1  Jdbc模板概述 它是spring框架中提供的一个对象,是对原始Jdbc API对象的简单封装.spring框架为我们提供了很多的操作模板类,入下图所示: 我们今天的主角在spring-jd ...

  2. 【转】在Spring中基于JDBC进行数据访问时怎么控制超时

    http://www.myexception.cn/database/1651797.html 在Spring中基于JDBC进行数据访问时如何控制超时 超时分类 超时根据作用域可做如下层级划分: Tr ...

  3. Spring中使用JDBC

    Spring中的数据库异常体系 使用JDBC(不使用Spring)的时候,我们需要强制捕获SQLException,否则无法使用JDBC处理任何事情.SQLException表示尝试访问数据库的时候出 ...

  4. Spring框架学习(3)spring中使用jdbc

    内容源自:spring中使用jdbc spring dao层中对jdbc进行了封装,使用模板模式的设计模式,通过ioc被动注入的方式将jdbcTemplate这个模板类注入到数据对象中,进行数据库操作 ...

  5. 在Spring中配置jdbc为什么不能用${username}问题

    楼主在spring中配置jdbc时,引用的是dbcp.jar包,在dataSource.properties配置文件中,有mysql用户名,楼主自然的选择了使用username,密码是root, 然后 ...

  6. Spring 中的 JDBC 事务

    Spring 对 JDBC 的支持 JdbcTemplate 简介 •为了使 JDBC 更加易于使用, Spring 在 JDBC API 上定义了一个抽象层, 以此建立一个 JDBC 存取框架. • ...

  7. Spring中的JDBC操作

    一.Spring模板JdbcTemplate 为了使 JDBC 更加易于使用, Spring 在 JDBC API 上定义了一个抽象层, 以此建立一个 JDBC 存取框架JdbcTemplate. 作 ...

  8. 2018.12.25 Spring中JDBCTemplate模版API学习

    1 Spring整合JDBC模版 1.1 spring中土拱了一个可以操作数据库的对象.对象封装了jdbc技术 JDBCTemplateJDBC模板对象 1.2 与DBUtils中的QueryRunn ...

  9. Spring中的Jdbc事务管理

    Spring提供了对事务的声明式事务管理,只需要在配置文件中做一些配置,即可把操作纳入到事务管理当中,解除了和代码的耦合. Spring声明式事务管理,核心实现就是基于Aop. Spring声明式事务 ...

随机推荐

  1. [批处理教程之Shell]001.文本处理

    在计算机科学中,Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器).它类似于DOS下的command和后来的cmd.exe.它接收用户命令,然后调用相应的应用程序. 同时 ...

  2. 离散数学 II(最全面的知识点汇总)

    离散数学 II(知识点汇总) 目录 离散数学 II(知识点汇总) 代数系统 代数系统定义 例子 二元运算定义 运算及其性质 二元运算的性质 封闭性 可交换性 可结合性 可分配性 吸收律 等幂性 消去律 ...

  3. GNS3内网通过cloud与实际网络实现互连互通的实验(使用环回网口)

    一.背景: 在GNS3内构建一个测试网络,该测试网络的设备能够通过cloud访问外部网络设备和Internet网,外部网络也能直接访问GNS3内网的设备. 考虑通过cloud上的环回口连接GNS3内网 ...

  4. Java实现 蓝桥杯VIP 算法训练 摆动序列

    问题描述 如果一个序列满足下面的性质,我们就将它称为摆动序列: 1. 序列中的所有数都是不大于k的正整数: 2. 序列中至少有两个数. 3. 序列中的数两两不相等: 4. 如果第i – 1个数比第i ...

  5. Java实现 LeetCode 203 移除链表元素

    203. 移除链表元素 删除链表中等于给定值 val 的所有节点. 示例: 输入: 1->2->6->3->4->5->6, val = 6 输出: 1->2 ...

  6. Java实现 蓝桥杯 历届试题 最大子阵

    问题描述 给定一个n*m的矩阵A,求A中的一个非空子矩阵,使这个子矩阵中的元素和最大. 其中,A的子矩阵指在A中行和列均连续的一块. 输入格式 输入的第一行包含两个整数n, m,分别表示矩阵A的行数和 ...

  7. [RH134] 12-系统启动

    1.系统启动流程 开机--->BIOS自检(需要检测的设备是否正常)--->磁盘的MBR分区--->BootLoader(引导加载器)加载内核--->识别各分区的文件系统 2. ...

  8. Python快速入门文档

    前言 此文本质为本人学习Python过程中的笔记,部分地方叙述表达可能不够清晰,欢迎留言. (本文适合有一定程序语言基础的读者阅读(最好是c语言)) 一.基本语法 1.框架: (1)以缩进表示层次所属 ...

  9. Cypress系列(14)- 环境变量详解

    如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html 前言 环境变量,其实就是根据环境的变化, ...

  10. 本地配置gitee

    一 下载工具 Git-2.62.0-64-bit.exe 以上工具版本号不需要一样,安装完前两个后重新启动系统,再安装第3个. 二 码云网站注册 https://gitee.com/ 使用邮箱注册 注 ...