看到有多麻烦了吧,但是请注意,以上的代码存在严重的缺陷,因为没有任何处理异常的代码,加入异常代码意味着我们还需要增加一些代码,这种重复的劳动使得程序员的工作像是傻瓜一样。记得我们在代码自动化中的自动化原则吗?对于重复性的劳动,我们应该使其自动化。
如何进行呢?注意,我们发现,除了SQL语句的不同以及记录集的处理不同以外,大部分的查询代码都没有太大的差别,所以我们的目标就是抽取共同的部分,而把特定的部分留给开发人员自己。
那么,一个框架该做些什么呢?回忆框架的定义,框架就是定义一组的抽象体,及其抽象体之间的协作,并提供扩展。在JDBC中,抽象体有Datasource、Connection 、PreparedStatement、ResultSet、Statement、SQLException。所以,建立框架的第一步就是分析这些抽象体的行为,哪些是共同的,哪些是专有的。使用spring框架,最终的JDBC客户端代码是这样的:
JdbcTemplate template = new JdbcTemplate(dataSource);
final List names = new LinkedList();
template.query("SELECT USER.NAME FROM USER",
new RowCallbackHandler() {
public void processRow(ResultSet rs) throws SQLException {
names.add(rs.getString(1));
}
});
首先,代码创建了一个JdbcTemplate实例,这是核心的JDBC的封装器,我们在后面可以看到它的部分实现。然后,通过给JdbcTemplate的query方法传入一个sql语句和一个回调的匿名类来完成填充names的操作。可以看到,客户端需要做的事情包括获得一个Datasource、提供一个sql Statement、以及一个具体的处理方法。这些动作每个客户端都不相同,但是对于Connection、PreparedStatement、Statement、SQLException的处理,基本上都是类似的。接下来我们就看看JdbcTemplate内部的做法:
public void query(String sql, RowCallbackHandler callbackHandler) throws DataAccessException {
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
con = DataSourceUtils.getConnection(this.dataSource);
ps = con.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
文章来源于领测软件测试网 https://www.ltesting.net/