Spring中的JDBC API
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的更多相关文章
- spring框架总结(04)----介绍的是Spring中的JDBC模板
1.1 Jdbc模板概述 它是spring框架中提供的一个对象,是对原始Jdbc API对象的简单封装.spring框架为我们提供了很多的操作模板类,入下图所示: 我们今天的主角在spring-jd ...
- 【转】在Spring中基于JDBC进行数据访问时怎么控制超时
http://www.myexception.cn/database/1651797.html 在Spring中基于JDBC进行数据访问时如何控制超时 超时分类 超时根据作用域可做如下层级划分: Tr ...
- Spring中使用JDBC
Spring中的数据库异常体系 使用JDBC(不使用Spring)的时候,我们需要强制捕获SQLException,否则无法使用JDBC处理任何事情.SQLException表示尝试访问数据库的时候出 ...
- Spring框架学习(3)spring中使用jdbc
内容源自:spring中使用jdbc spring dao层中对jdbc进行了封装,使用模板模式的设计模式,通过ioc被动注入的方式将jdbcTemplate这个模板类注入到数据对象中,进行数据库操作 ...
- 在Spring中配置jdbc为什么不能用${username}问题
楼主在spring中配置jdbc时,引用的是dbcp.jar包,在dataSource.properties配置文件中,有mysql用户名,楼主自然的选择了使用username,密码是root, 然后 ...
- Spring 中的 JDBC 事务
Spring 对 JDBC 的支持 JdbcTemplate 简介 •为了使 JDBC 更加易于使用, Spring 在 JDBC API 上定义了一个抽象层, 以此建立一个 JDBC 存取框架. • ...
- Spring中的JDBC操作
一.Spring模板JdbcTemplate 为了使 JDBC 更加易于使用, Spring 在 JDBC API 上定义了一个抽象层, 以此建立一个 JDBC 存取框架JdbcTemplate. 作 ...
- 2018.12.25 Spring中JDBCTemplate模版API学习
1 Spring整合JDBC模版 1.1 spring中土拱了一个可以操作数据库的对象.对象封装了jdbc技术 JDBCTemplateJDBC模板对象 1.2 与DBUtils中的QueryRunn ...
- Spring中的Jdbc事务管理
Spring提供了对事务的声明式事务管理,只需要在配置文件中做一些配置,即可把操作纳入到事务管理当中,解除了和代码的耦合. Spring声明式事务管理,核心实现就是基于Aop. Spring声明式事务 ...
随机推荐
- [安卓安全] 01.安卓本地数据存储:Shared Preferences安全风险浅析
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- [JavaWeb基础] 023.线程安全(二)
上一篇我们讲解了线程安全的问题,那么要解决线程安全的问题,我们就必须用到线程同步,保证线程之间不互相影响而产生脏数据,下面我们来讲讲具体的实现吧. 首先我们看下例子,我们有个Outputter类,用于 ...
- ISTQB认证测试工程师基础大纲(2019.12.25)
1.本文档目的: 用于生成认证测试员基础级考试题. 本大纲中除了简介和附录外,考核通常包含了所有K1级别的内容,因此,应试者可能会被考到本大纲中要求识别,牢记,或记忆的关键词或概念.在本大纲中,每章开 ...
- data类型的url
所谓"data"类型的Url格式,是在RFC2397中 提出的,目的对于一些"小"的数据,可以在网页中直接嵌入,而不是从外部文件载入.例如对于img这个Ta ...
- 多用户vps管理面板怎么安装,有没有好用的vps管理工具
一.VPS安装VPSMate控制面板步骤 1.使用SSH连接到VPS.使用命令获取VPSMate安装包: wget http://www.vpsmate.org/tools/install.py ...
- 《学习scrapy框架爬小说》的进一步完善
一.完善目标: 1.为方便使用,把小说拼音或英文名,小说输出中文名,第一章节url地址变量化,修改这些参数即可爬取不同的小说. 2.修改settings.py设置文件,配置为记录debug的log信息 ...
- Rocket - interrupts - Crossing
https://mp.weixin.qq.com/s/nSX4prXFb4K5GSUhPtOUCg 简单介绍Crossing的实现. 1. IntXing 这是一个LazyModule: 1) 参数 ...
- Chisel3 - model - UserModule commands
https://mp.weixin.qq.com/s/0ECca6XyFyEri0B4ckOZ4A 介绍UserModule类中,如何管理构建硬件模型所需的命令. 1. _comma ...
- Java实现 LeetCode 519 随机翻转矩阵
519. 随机翻转矩阵 题中给出一个 n 行 n 列的二维矩阵 (n_rows,n_cols),且所有值被初始化为 0.要求编写一个 flip 函数,均匀随机的将矩阵中的 0 变为 1,并返回该值的位 ...
- Java实现 LeetCode 376 摆动序列
376. 摆动序列 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个元素的序列也是摆动序列. 例如, [1,7,4,9,2,5 ...