首先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(回调应用)的更多相关文章

  1. 高性能jdbc封装工具 Apache Commons DbUtils 1.6(转载)

    转载自原文地址:http://gao-xianglong.iteye.com/blog/2166444 前言 关于Apache的DbUtils中间件或许了解的人并不多,大部分开发人员在生成环境中更多的 ...

  2. Apache Commons DbUtils 快速上手

    原文出处:http://lavasoft.blog.51cto.com/62575/222771 Hibernate太复杂,iBatis不好用,JDBC代码太垃圾,DBUtils在简单与优美之间取得了 ...

  3. 写一个ORM框架的第一步(Apache Commons DbUtils)

    新一次的内部提升开始了,如果您想写一个框架从Apache Commons DbUtils开始学习是一种不错的选择,我们先学习应用这个小“框架”再把源代码理解,然后写一个属于自己的ORM框架不是梦. 一 ...

  4. java JDBC (七) org.apache.commons.dbutils 查询

    package cn.sasa.demo1; import java.sql.Connection; import java.sql.SQLException; import java.util.Li ...

  5. Java连接数据库 #04# Apache Commons DbUtils

    索引 通过一个简单的调用看整体结构 Examples 修改JAVA连接数据库#03#中的代码 DbUtils并非是什么ORM框架,只是对原始的JDBC进行了一些封装,以便我们少写一些重复代码.就“用” ...

  6. 《笔者带你剖析Apache Commons DbUtils 1.6》(转)

    前言 关于Apache的DbUtils中间件或许了解的人并不多,大部分开发人员在生成环境中更 多的是依靠Hibernate.Ibatis.Spring JDBC.JPA等大厂提供的持久层技术解决方案, ...

  7. java JDBC (六) org.apache.commons.dbutils 增删改

    dbutils是apache封装了JDBC的工具类,比mysql-connector更方便些 下载地址:http://commons.apache.org/proper/commons-dbutils ...

  8. java.lang.ClassNotFoundException: org.apache.commons.dbutils.QueryRunner

    七月 28, 2017 11:06:33 下午 org.apache.catalina.core.StandardWrapperValve invoke严重: Servlet.service() fo ...

  9. java.lang.ClassNotFoundException: org.apache.commons.dbutils.ResultSetHandle

    原因是这两个地方都得导入dbutils的jar包,一般出错是因为WEB-INF下没有导入包,记得导入,然后buildPath即可

随机推荐

  1. 如何使用sysdba身份通过jdbc连接oracle?

    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); Properties conProps = new ...

  2. npm link 安装本地模块,将本地模块cli化

    第三方学习地址 http://mp.weixin.qq.com/s?__biz=MzAxMTU0NTc4Nw==&mid=2661157390&idx=1&sn=6d96e54 ...

  3. 重置dns

    flusdns

  4. .net手机号码归属地查询

    调用百度 api http://apistore.baidu.com/apiworks/servicedetail/117.html 贴上代码 using Newtonsoft.Json;using ...

  5. mango框架中表分片与数据库分片(分表与分库)

    表分片 表分片通常也被称为分表,散表. 当某张表的数据量很大时,sql执行效率都会变低,这时通常会把大表拆分成多个小表,以提高sql执行效率. 我们将这种大表拆分成多个小表的策略称之为表分片. 先来看 ...

  6. Java中的递归运算

    Java中的递归运算是一种在自己的方法内部调用自己的方法 递归的设计思想是:把一个复杂的问题,分解为若干个等同的子问题,重复执行,直到之问题能够简单到直接求解,这样复杂的问题就得以解决. 递归运算有两 ...

  7. Windows 10 Build 14997中Edge浏览器已默认阻止Flash运行

    在上周末偷跑的 Windows 10 Build 14997 向我们传递了很多信息,新增了蓝光过滤器等功能,并有望装备在即将到来的 Creators Update 中.经过深入发掘,外媒发现新版系统中 ...

  8. Codeforces Good Bye 2016 D 模拟搜索?

    给出烟花的爆炸方式和爆炸次数 问最后有多少个格子会被炸到 如果dfs的话会超时... 利用模拟每一层来搜索..? 思想就是一开始有一个爆炸点向上 然后模拟完第一段 会产生一个爆炸点 朝两个方向 就用v ...

  9. Server-Sent Events(HTML5 服务器发送事件)

    Server-Sent Events简介 Server-Sent Events(SSE)用于网页自动获取服务器上更新的数据,它是一个实时性的机制. 实时性获取数据的解决方案 对于某些需要实时更新的数据 ...

  10. MyBatis学习总结(一)——MyBatis快速入门(转载)

    本文转载自http://www.cnblogs.com/jpf-java/p/6013537.html MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了 ...