Java回调机制,利用回调写的JDBC访问例子
首先说说为什么要用到回调这个方式,
我们在日常生活和工作中,有一种情况是这样的,做一件事,但是这件事中有些步骤是不确定如何做的,但是可以先约定好怎么做.对于程序来说,就是有一段业务,其中有几段小逻辑不确定如何做,但是我们可以先定义好一些方法(统一的参数和返回值)对应这些逻辑, 具体这些逻辑的实现交给具体执行的代码去实现.
下面举个例子,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 inte易做图ce JdbcCallback {
public List<BaseTO> 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<BaseTO> 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.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
}
这个Template定
补充:软件开发 , Java ,