使用apache的開源工具dbutils時, 我們可以用QueryRunner很方便地進行數據庫查詢操作,將查到的數據封裝到JavaBean對象中, 或是封裝到存儲多個JavaBean對象的集合框架中. 其中用到的一個重要接口是ResultHandler, 該接口是如何實現對JavaBean對象的封裝的呢? 其原理其實是利用回調函數來完成的.
下面通過一個小例子展示一下如何使用回調函數.
1. 首先定義接口(該接口使用了泛型):
/**
* 定義回調規範
*/
interface IHandler<T>{
T sayHi(String sql);
}
2. 再定義調用類, 其query方法接收一個實現了IHandler接口的對象, 在query方法體內調用IHandler的sayHi方法:
/**
* 定義調用類
*/
class MyRunner {
public <T>T query(String sql,IHandler<T> h){
return h.sayHi(sql);
}
}
3, 測試如何使用回調函數:
public class CallBackMethodDemo {
/**
* 回調函數例子
*/
public static void main(String[] args) {
MyRunner run = new MyRunner();
List<Map<String, Object>> list = run.query("yueyayun...",new IHandler<List<Map<String,Object>>>(){
@Override
public List<Map<String, Object>> sayHi(String sql) {
Map<String,Object> map = new HashMap<String, Object>();
map.put(sql, map);
List<Map<String,Object>> ll = new LinkedList<Map<String,Object>>();
ll.add(map);
ll.add(new HashMap<String, Object>());
return ll;
}
});
System.out.println(list);
}
}
從以上代碼可以看到, 我們可以寫多個實現了IHandler接口的具體類來完成各種的豐富功能, 在調用run.query方法時指定一個完成某項功能的IHandler接口實現類, 達到完成類似ResultHandler的效果.
建議有興趣的同學看看apache的dbutils工具的源碼,
它將有助於你深刻理解回調函數.