模拟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
获取数据源工具类:
package com.tpf.utils; import java.io.InputStream;
import java.util.Properties; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSourceFactory; public class DbcpDataSourceUtils {
private DbcpDataSourceUtils(){}
private static DataSource ds;
static{
try{
//读取资源文件
InputStream in = DataSourceUtils.class
.getClassLoader().getResourceAsStream("dbcp.properties");
//读取资源对象
Properties prop = new Properties();
prop.load(in);
//创建ds
ds = new BasicDataSourceFactory().createDataSource(prop);
}catch(Exception e){
throw new RuntimeException(e.getMessage(),e);
}
}
//返回整个池对象
public static DataSource getDatasSource(){
return ds;
}
}
第一步:定义回调接口(回调规范),dbutils中的回调接口(回调规范)是 ResultSetHandler

我们自己的回调接口如下:
package com.tpf.callback.beanlisthandler; import java.sql.ResultSet; /**
* 定义回调规范
* <p>Title:MyHandler </p>
* <p>Description: </p>
* <p>Company: www.vfinance.cn </p>
* @author tianpengfei
* @param <T>
* @date 2016年8月10日 下午1:57:40
*/
public interface MyHandler<T> {
T handler(ResultSet rs);
}
第二步:定义接口实现类,dbutils中实现了如下:

这里我们先实现BeanListHandler
我们自己的MyBeanListHandler如下:
package com.tpf.callback.beanlisthandler.impl; import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List; import com.tpf.callback.beanlisthandler.MyHandler; /**
* 返回List<Bean>所有行,都封装到List,适合于查询多个结果
* <p>Title:MyBeanListHandler </p>
* <p>Description: </p>
* <p>Company: www.vfinance.cn </p>
* @author tianpengfei
* @date 2016年8月10日 下午2:39:44
* @param <T>
*/
public class MyBeanListHandler<T> implements MyHandler<List<T>>{ private Class<T> cls; public MyBeanListHandler(Class<T> cls) {
this.cls = cls;
} @Override
public List<T> handler(ResultSet rs) {
List<T> list = new ArrayList<T>();//定义返回类型
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 new RuntimeException(e.getMessage(), e);
}
}
list.add(t);
}
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
return list;
} }
第三步:定义调用类
Dbutils中的是QueryRunner

我们自己的MyQueryRunner如下:
package com.tpf.callback.beanlisthandler; import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement; import javax.sql.DataSource; /**
* 定义自己的回调函数 “调用类”
* <p>Title:MyQueryRunner </p>
* <p>Description: </p>
* <p>Company: www.vfinance.cn </p>
* @author tianpengfei
* @date 2016年8月10日 下午2:00:04
*/
public class MyQueryRunner {
private DataSource ds ; public MyQueryRunner() {} public MyQueryRunner(DataSource ds) {
this.ds = ds;
} public <T>T query(String sql, MyHandler<T> mh){
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 new RuntimeException(e.getMessage(), e);
}
return t;
}
}
User实体
package com.tpf.domain;
public class User {
private String id;
private String name;
private String pwd;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", pwd=" + pwd + "]";
}
}
第四部:应用测试
@Test
public void test1(){
MyQueryRunner myQueryRunner = new MyQueryRunner(DataSourceUtils.getDateSource());
String sql = "select * from users";
List<User> list = myQueryRunner.query(sql, new MyBeanListHandler<User>(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]
模拟apache commons dbutils 实现自己的BeanListHandler(回调应用)的更多相关文章
- 高性能jdbc封装工具 Apache Commons DbUtils 1.6(转载)
转载自原文地址:http://gao-xianglong.iteye.com/blog/2166444 前言 关于Apache的DbUtils中间件或许了解的人并不多,大部分开发人员在生成环境中更多的 ...
- Apache Commons DbUtils 快速上手
原文出处:http://lavasoft.blog.51cto.com/62575/222771 Hibernate太复杂,iBatis不好用,JDBC代码太垃圾,DBUtils在简单与优美之间取得了 ...
- 写一个ORM框架的第一步(Apache Commons DbUtils)
新一次的内部提升开始了,如果您想写一个框架从Apache Commons DbUtils开始学习是一种不错的选择,我们先学习应用这个小“框架”再把源代码理解,然后写一个属于自己的ORM框架不是梦. 一 ...
- java JDBC (七) org.apache.commons.dbutils 查询
package cn.sasa.demo1; import java.sql.Connection; import java.sql.SQLException; import java.util.Li ...
- Java连接数据库 #04# Apache Commons DbUtils
索引 通过一个简单的调用看整体结构 Examples 修改JAVA连接数据库#03#中的代码 DbUtils并非是什么ORM框架,只是对原始的JDBC进行了一些封装,以便我们少写一些重复代码.就“用” ...
- 《笔者带你剖析Apache Commons DbUtils 1.6》(转)
前言 关于Apache的DbUtils中间件或许了解的人并不多,大部分开发人员在生成环境中更 多的是依靠Hibernate.Ibatis.Spring JDBC.JPA等大厂提供的持久层技术解决方案, ...
- java JDBC (六) org.apache.commons.dbutils 增删改
dbutils是apache封装了JDBC的工具类,比mysql-connector更方便些 下载地址:http://commons.apache.org/proper/commons-dbutils ...
- java.lang.ClassNotFoundException: org.apache.commons.dbutils.QueryRunner
七月 28, 2017 11:06:33 下午 org.apache.catalina.core.StandardWrapperValve invoke严重: Servlet.service() fo ...
- java.lang.ClassNotFoundException: org.apache.commons.dbutils.ResultSetHandle
原因是这两个地方都得导入dbutils的jar包,一般出错是因为WEB-INF下没有导入包,记得导入,然后buildPath即可
随机推荐
- .NET面试题目
简单介绍下ADO.NET和ADO主要有什么改进? 答:ADO以Recordset存储,而ADO.NET则以DataSet表示,ADO.NET提供了数据集和数据适配器,有利于实现分布式处理,降低了对数据 ...
- XMLHttpRequest对象用法
xmlhttprequest is what? 用户后台与服务器交换数据. 可以在不重新加载页面的情况下更新网页: 在页面已加载后从服务器请求数据: 在页面已加载后从服务器接收数据: 在后台向服务器发 ...
- 扫描内网活跃的ip
网段内活跃的ip:nmap -sP 10.10.30.0/24|grep for|awk '{print $5}'
- Matlab的标记分水岭分割算法
1 综述 Separating touching objects in an image is one of the more difficult image processing operation ...
- 关于malloc函数的动态分配问题
malloc函数动态分配了一个整型的内存空间,让abc都指向刚申请的空间,所以只有最后一个赋值语句的值保留在了空间里 #include<stdio.h> main() { int *a,* ...
- git常使用命令整理
1.git撤销本地所有修改(tracked和untracked) . git clean -df . git reset --hard 第一个命令只删除所有untracked的文件,如果文件已经被tr ...
- Codeforces Good Bye 2016 D 模拟搜索?
给出烟花的爆炸方式和爆炸次数 问最后有多少个格子会被炸到 如果dfs的话会超时... 利用模拟每一层来搜索..? 思想就是一开始有一个爆炸点向上 然后模拟完第一段 会产生一个爆炸点 朝两个方向 就用v ...
- ADO.Net读取器获取数据库数据
string str = Configuration.ConfigurationManager.AppSettings[str].ToString(); string sql = "sele ...
- PBOC2.0协议中电子存折/电子钱包中圈存交易流程
通过圈存交易,持卡人可将其在银行相应账户上的资金划入电子存折或电子钱包中.这种交易必须在金融终端上联机进行并要求提交个人识别码(PIN)(无论电子存折还是电子钱包应用). 交易流程图如下: 1.1 发 ...
- asp.net mvc 在视图中获取控制器与动作的名称
获取 controller 名称: ViewContext.RouteData.Values["controller"].ToString(); 获取 action 名称: Vie ...