java beanlisthandler_模拟apache commons dbutils 实现自己的BeanListHandler(回调应用)

首先dbcp相关的jar包和MySQL的驱动包导入到项目中。

dbcp.properties配置文件如下,并放到项目根目录下。

driverClassName=com.mysql.jdbc.Driver

url=jdbc:mysql:///testdb?useUnicode=true&characterEncoding=UTF8&useOldAliasMetadataBehavior=true

username=root

password=root

maxActive=3

获取数据源工具类:

packagecom.tpf.utils;importjava.io.InputStream;importjava.util.Properties;importjavax.sql.DataSource;importorg.apache.commons.dbcp.BasicDataSourceFactory;public classDbcpDataSourceUtils {privateDbcpDataSourceUtils(){}private staticDataSource ds;static{try{//读取资源文件

InputStream in = DataSourceUtils.class.getClassLoader().getResourceAsStream("dbcp.properties");//读取资源对象

Properties prop = newProperties();

prop.load(in);//创建ds

ds = newBasicDataSourceFactory().createDataSource(prop);

}catch(Exception e){throw newRuntimeException(e.getMessage(),e);

}

}//返回整个池对象

public staticDataSource getDatasSource(){returnds;

}

}

第一步:定义回调接口(回调规范),dbutils中的回调接口(回调规范)是 ResultSetHandler

ad584d607d161411ba9f157d2b0d3d54.png

我们自己的回调接口如下:

packagecom.tpf.callback.beanlisthandler;importjava.sql.ResultSet;/*** 定义回调规范

*

Title:MyHandler

*

Description:

*

Company: www.vfinance.cn

*@authortianpengfei

*@param

* @date 2016年8月10日 下午1:57:40*/

public interface MyHandler{

T handler(ResultSet rs);

}

第二步:定义接口实现类,dbutils中实现了如下:

a45eef48cb498a0a829aad7d739e77c7.png

这里我们先实现BeanListHandler

我们自己的MyBeanListHandler如下:

packagecom.tpf.callback.beanlisthandler.impl;importjava.lang.reflect.Method;importjava.sql.ResultSet;importjava.sql.ResultSetMetaData;importjava.util.ArrayList;importjava.util.List;importcom.tpf.callback.beanlisthandler.MyHandler;/*** 返回List所有行,都封装到List,适合于查询多个结果

*

Title:MyBeanListHandler

*

Description:

*

Company: www.vfinance.cn

*@authortianpengfei

* @date 2016年8月10日 下午2:39:44

*@param*/

public class MyBeanListHandler implements MyHandler>{private Classcls;public MyBeanListHandler(Classcls) {this.cls =cls;

}

@Overridepublic Listhandler(ResultSet rs) {

List list = new ArrayList();//定义返回类型

try{

ResultSetMetaData rsmd=rs.getMetaData();int cols = rsmd.getColumnCount();//列数

while(rs.next()){

T t= cls.newInstance();//没获取一行就实例化

for (int i = 0; i < cols; i++) {

String colName= rsmd.getColumnName(i+1);

colName=colName.toLowerCase();

String mehtodName= "set" + colName.substring(0,1).toUpperCase() + colName.substring(1).toLowerCase();

String javaType= rsmd.getColumnClassName(i+1);try{

Method mm=cls.getMethod(mehtodName, Class.forName(javaType));

Object val= rs.getObject(i+1);

mm.invoke(t, val);

}catch(Exception e) {throw newRuntimeException(e.getMessage(), e);

}

}

list.add(t);

}

}catch(Exception e) {throw newRuntimeException(e.getMessage(), e);

}returnlist;

}

}

第三步:定义调用类

Dbutils中的是QueryRunner

fa5addd6ccbee12dc32b1515a22b0c91.png

我们自己的MyQueryRunner如下:

packagecom.tpf.callback.beanlisthandler;importjava.sql.Connection;importjava.sql.ResultSet;importjava.sql.Statement;importjavax.sql.DataSource;/*** 定义自己的回调函数 “调用类”

*

Title:MyQueryRunner

*

Description:

*

Company: www.vfinance.cn

*@authortianpengfei

* @date 2016年8月10日 下午2:00:04*/

public classMyQueryRunner {privateDataSource ds ;publicMyQueryRunner() {}publicMyQueryRunner(DataSource ds) {this.ds =ds;

}public T query(String sql, MyHandlermh){

T t= null;

Connection conn= null;try{

conn=ds.getConnection();

Statement st=conn.createStatement();

ResultSet rs=st.executeQuery(sql);

t=mh.handler(rs);

}catch(Exception e) {throw newRuntimeException(e.getMessage(), e);

}returnt;

}

}

User实体

packagecom.tpf.domain;public classUser {privateString id;privateString name;privateString pwd;publicString getId() {returnid;

}public voidsetId(String id) {this.id =id;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}publicString getPwd() {returnpwd;

}public voidsetPwd(String pwd) {this.pwd =pwd;

}

@OverridepublicString toString() {return "User [id=" + id + ", name=" + name + ", pwd=" + pwd + "]";

}

}

第四部:应用测试

@Testpublic voidtest1(){

MyQueryRunner myQueryRunner= newMyQueryRunner(DataSourceUtils.getDateSource());

String sql= "select * from users";

List list = myQueryRunner.query(sql, new MyBeanListHandler(User.class));for(User user : list) {

System.err.println(user);

}

}

打印结果如下:

User [id=001, name=张三, pwd=111]

User [id=002, name=李四, pwd=222]

User [id=003, name=王五, pwd=333]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值