您的位置:首页 > 编程语言 > Java开发

基于DBUtils中的查询对Java中的回调函数的理解

2015-07-22 15:03 519 查看
对回调函数的理解一直不是很深刻。今天在学习Utils框架的查询方法时候又遇到了这个概念。搜索资料,作出以下整理:

首先对回调函数做一个定义:当方法a调用方法b,而方法b在执行过程中,其中的一些逻辑需要方法a来告知,此时需要a在调用方法b

时将逻辑传入,而Java中是不允许传递java源代码,此时可以使用回调。所谓回调,就是方法a和方法b约定一个接口定义一个方法,方法的名字通常叫做handler方法

将逻辑传入,方法b在执行过程中需要执行a传入的逻辑时,调用接口实现的handler方法即可。此时a调用b时,b回来调用a传入的逻辑,这个过程就叫做回调。

这是DButils框架中查询的操作,底层利用了回调机制。下面利用自己写一个DBUtils框架中查询的实现:
package com.test.dbutils;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.junit.Test;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class DBUtilsQuery {
public void MyQuery() throws Exception {
MyQueryRunner runner = new MyQueryRunner(new ComboPooledDataSource());
runner.query("select * from account where money>?",
new MyResultSetHandler<List<Account>>() {

public List<Account> handle(ResultSet rs)
throws SQLException {
List<Account> list = new ArrayList<Account>();
while (rs.next()) {
Account acc = new Account();
acc.setId(rs.getInt("id"));
acc.setMoney(rs.getInt("money"));
list.add(acc);
}
return list;
}
}, 999);
}
}
}
MyQueryRunner类:

package com.test.dbutils;

import java.sql.Connection;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.sql.DataSource;

import org.apache.commons.dbutils.DbUtils;

public class MyQueryRunner {
private DataSource source = null;
public MyQueryRunner(){

}
public MyQueryRunner(DataSource source) {
this.source = source;
}
public <T> T query(String sql,MyResultSetHandler<T> rs,Object...param) throws Exception{
Connection connection=source.getConnection();
PreparedStatement ps = connection.prepareStatement(sql);
//获取参数元数据
ParameterMetaData metaData = ps.getParameterMetaData();
//获取参数个数
int count  = metaData.getParameterCount();
//设置参数
for (int i = 0; i <=count; i++) {
ps.setObject(i,param[i-1]);
}
//执行查询命令   获取结果集
ResultSet result= ps.executeQuery();
//但是并不知道怎么处理结果集    处理的方法是从DBUtilsQuery类里面传过来的  这里就用到了回调
T t = rs.handle(rs);//rs就是具体实现方法
DbUtils.closeQuietly(connection, ps, result);
return t;

}
}
MyResultSetHandler类:

package com.test.dbutils;

import java.sql.ResultSet;
import java.sql.SQLException;

public interface MyResultSetHandler<T> {
public T handle(ResultSet rs) throws SQLException;

}


按照上面的说法:

MyQuery方法就是a方法,query方法就是b方法,但是query方法中的第二个参数实现了接口MyResultSetHandler


本文只是利用DBUtils框架中的查询对回调进行了讲解。不足之处,敬请见谅
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: