首先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. hibernate 异常:Unexpected Exception caught setting

    异常信息:Unexpected Exception caught setting 'outHeight' on 'class com.srpm.core.project.seismicFortific ...

  2. 安卓中級教程(9):pathbutton中的animation.java研究(2)

    src/geniuz/myPathbutton/composerLayout.java package geniuz.myPathbutton; import com.nineoldandroids. ...

  3. github搭建静态博客

    p { margin-bottom: 0.1in; line-height: 120% } 1. 创建Repository 创建一个与自己github用户名对应的Repository,例如:abc.g ...

  4. swift-UITableView

    import UIKit class FirstVC: UIViewController,UITableViewDelegate,UITableViewDataSource { var tableVi ...

  5. phpv6_css

    global @charset "utf-8"; /* CSS Document */ /*格式化样式*/ body,div,dl,dt,dd,ul,ol,li,h1,h2,h3, ...

  6. PHP 代码片段记录

    检查URL是否为图片地址 getimagesize() Function check_img($file) { $x = getimagesize($file); switch ($x['mime'] ...

  7. PL/SQL %TYPE和%ROWTYPE的区别【转】

    %TYPE: 定义一个变量,其数据类型与已经定义的某个 数据变量的类型相同,或者与数据库表的某个列的数据类型 相同,这时可以使用%TYPE.         使用%TYPE 特性的优点在于: 1.所引 ...

  8. ActionListener的三种实现方法

    Swing是目前Java中不可缺少的窗口工具组,是用户建立图形化用户界面(GUI)程序的 强大工具.Java Swing组件自动产生各种事件来响应用户行为.如当用户点击按钮或选择菜单项目时,Swing ...

  9. magento搬家

    将原来网站文件中的var文件中的cache和session文件删除,将media中的缓存文件删除.然后将所有文件制作成一个压缩包,以减少文件体积,方便转移. 将压缩包转移到新的服务器域名指向的文件夹, ...

  10. Windbg调试命令详解

    作者:张佩][原文:http://www.yiiyee.cn/Blog] 1. 概述 用户成功安装微软Windows调试工具集后,能够在安装目录下发现四个调试器程序,分别是:cdb.exe.ntsd. ...