看到有多麻煩了吧,但是請注意,以上的代碼存在嚴重的缺陷,因為沒有任何處理異常的代碼,加入異常代碼意味著我們還需要增加一些代碼,這種重復的勞動使得程序員的工作像是傻瓜一樣。記得我們在代碼自動化中的自動化原則嗎?對于重復性的勞動,我們應該使其自動化。
如何進行呢?注意,我們發現,除了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()) {
文章來源于領測軟件測試網 http://www.kjueaiud.com/