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. [Objective-C] 020_ Block

    1.定义和使用Block #import "ViewController.h" @interface ViewController () @end @implementation ...

  2. [SD心灵鸡汤]004.每月一则 - 2015.08

    1.事常与人违,事总在人为. 2.骏马是跑出来的,强兵是打出来的. 3.驾驭命运的舵是奋斗.不抱有一丝幻想,不放弃一点机会,不停止一日努力. 4.如果惧怕前面跌宕的山岩,生命就永远只能是死水一潭. 5 ...

  3. [批处理教程之Shell]002.Linux 常用命令大全

    这一次收集的是比较基础的 Linux 命令,其实 Linux 命令未必每个都要记住,只要在用到时能查阅到需要的命令的用法. 系统信息 *.显示机器的处理器架构(1)arch *.显示机器的处理器架构( ...

  4. php序列化和反序列化学习

    1.什么是序列化 序列化说通俗点就是把一个对象变成可以传输的字符串. 1.举个例子,不知道大家知不知道json格式,这就是一种序列化,有可能就是通过array序列化而来的.而反序列化就是把那串可以传输 ...

  5. Beta冲刺 —— 5.31

    这个作业属于哪个课程 软件工程 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺 作业正文 正文 github链接 项目地址 其他参考文献 无 一.会议内容 1.讨论并解决每个人存在的问 ...

  6. 分享按钮(QQ,微信,微博等)移入动画效果

    ps:最近写的很多博客都是在以前在项目里写过的,之所以现在写出来,最大的目的就是希望自己以后用到的时候比较容易找,而且现在再写一遍,有助于加深印象! 很简单的效果,说先实现方式: 1.图标来自 阿里巴 ...

  7. Java 第十一届 蓝桥杯 省模拟赛 螺旋矩阵

    螺旋矩阵 题目 问题描述 对于一个 n 行 m 列的表格,我们可以使用螺旋的方式给表格依次填上正整数,我们称填好的表格为一个螺旋矩阵. 例如,一个 4 行 5 列的螺旋矩阵如下: 1 2 3 4 5 ...

  8. Java实现 蓝桥杯 基础练习 查找整数

    基础练习 查找整数 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 问题描述 给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个. 输入格式 第一行包含一个整数n ...

  9. Java实现 蓝桥杯VIP 算法提高 复数求和

    算法提高 复数求和 时间限制:1.0s 内存限制:512.0MB 从键盘读入n个复数(实部和虚部都为整数)用链表存储,遍历链表求出n个复数的和并输出. 样例输入: 3 3 4 5 2 1 3 样例输出 ...

  10. Java实现 蓝桥杯VIP 算法提高 格子位置

    算法提高 格子位置 时间限制:1.0s 内存限制:512.0MB 问题描述 输入三个自然数N,i,j (1<=i<=N,1<=j<=N),输出在一个N*N格的棋盘中,与格子(i ...