Java回调机制,利用回调写的JDBC访问例子(一)

2014-11-24 01:45:28 · 作者: · 浏览: 7

首先说说为什么要用到回调这个方式,

我们在日常生活和工作中,有一种情况是这样的,做一件事,但是这件事中有些步骤是不确定如何做的,但是可以先约定好怎么做.对于程序来说,就是有一段业务,其中有几段小逻辑不确定如何做,但是我们可以先定义好一些方法(统一的参数和返回值)对应这些逻辑, 具体这些逻辑的实现交给具体执行的代码去实现.

下面举个例子,JDBC 访问,假设我们都用PreparedStatement来处理SQL, 我们都要初始化连接,初始化PreparedStatement,封装PreparedStatement插入SQL参数,执行SQL,获得ResultSet,封装ResultSet成我们要的对象,关闭连接,其中封装PreparedStatement插入SQL参数和封装ResultSet成我们要的对象是不确定的,我们就可以把这2步定义成回调函数,教给具体执行代码去做.

根据上面说的,我们可以定一个JdbcCallback接口来定义这个回调函数,

Java代码

package com.balance.easycalendar.dao.template;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.List;

import com.balance.easycalendar.to.BaseTO;

public interface JdbcCallback {

public List packResult(ResultSet rs) throws SQLException;

public void packParams(PreparedStatement stmt) throws SQLException;

}

再定义一个JdbcCallbackTemplate来执行具体的方法,其中引用一个JdbcCallback来完成不确定的步骤,

Java代码

package com.balance.easycalendar.dao.template;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.util.List;

import com.balance.easycalendar.dao.exception.DAOException;

import com.balance.easycalendar.to.BaseTO;

import com.balance.easycalendar.util.MessageProperties;

public class JdbcCallbackTemplate {

private JdbcCallback temp;

public void setTemp(JdbcCallback temp) {

this.temp = temp;

}

protected String url;

protected String username;

protected String password;

protected String driver;

private PreparedStatement stmt = null;

private Connection con = null;

public JdbcCallbackTemplate(){

MessageProperties pro = MessageProperties.getInstance("jdbc.properties");

url = pro.getValue("db.url");

driver = pro.getValue("db.driver");

username = pro.getValue("db.username");

password = pro.getValue("db.password");

}

public List query(String sql) throws DAOException{

try{

Class.forName(driver);

con = DriverManager.getConnection(url, username, password);

stmt = con.prepareStatement(sql);

temp.packParams(stmt);

ResultSet rs = stmt.executeQuery();

return temp.packResult(rs);

}catch(Exception e){

throw new DAOException(e);

}finally{

try{

stmt.close();

con.close();

}catch(Exception e){

e.printStackTrace();

}

}

}

public boolean excute(String sql) throws DAOException{

try{

Class.forName(driver);

con = DriverManager.getConnection(url, username, password);

stmt = con.prepareStatement(sql);

temp.packParams(stmt);

return stmt.execute();

}catch(Exception e){

throw new DAOException(e);

}finally{

try{

stmt.close();

con.c