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

来源:互联网 发布:外贸网站建设推广优化 编辑:程序博客网 时间:2024/05/21 17:17

对回调函数的理解一直不是很深刻。今天在学习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框架中的查询对回调进行了讲解。不足之处,敬请见谅


0 0
原创粉丝点击