基于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框架中查询的实现:
按照上面的说法:
本文只是利用DBUtils框架中的查询对回调进行了讲解。不足之处,敬请见谅
首先对回调函数做一个定义:当方法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框架中的查询对回调进行了讲解。不足之处,敬请见谅
相关文章推荐
- java实现给出分数数组得到对应名次数组的方法
- JAVA 垃圾回收器
- spring mvc
- RxJava简明教程
- Spring MVC 4常用的那些注解 .
- java static
- 远程debug调试(eclipse)之openstack windows
- 快速搭建Spring MVC 4开发环境 .
- MyEclipse 手动安装Velocity 编辑器
- To understand java command
- Java编写一个截取字符串的函数,输入一个为字符串和字节数,输出按字节截取的字符串。要求不能出现截半的情况
- MyEclipse中配置Weblogic
- spring验证事务的代码,用到了mockito
- 十进制有限小数如何以二进制保存而不会变成无限小数
- 【Java】static关键字
- 调用eclipse的JDT编译java源代码
- Drools6.2 Eclipse环境搭建及HelloWord
- Struts2获取request三种方法
- Spring学习之声明式事务处理实例(DriverManagerDataSource注入)
- Java Web中getAttribute和getParameter的区别