首先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. [转]基于Starling移动项目开发准备工作

    最近自己趁业余时间做的flash小游戏已经开发得差不多了,准备再完善下ui及数值后,投放到国外flash游戏站.期间也萌生想法,想把游戏拓展到手机平台.这两天尝试了下,除去要接入ane接口的工作,小游 ...

  2. Python实战:下载鬼灵报告有声小说

    在家无聊,想看看小说,不过看的眼睛痛,就想着下个有声小说来听听.但风上找到的都是要一集一集下,还得重命名,122集啊,点到什么时候. 写个批处理下载的脚本.记录下过程. 一.老套路了,找到下载URL. ...

  3. Django 基本命令

    1. 新建一个 django project django-admin.py startproject project-name 一个 project 为一个项目,project-name 项目名称, ...

  4. MySQL时间戳相互转换

    mysql将时间戳转成常用时间格式 在mysql中,一个时间字段的存储类型是int(11),怎么转化成字符类型,比方存储为13270655222,需要转化为yyyy -mm-dd的形式. 使用 FRO ...

  5. Android课程---如何用网格视图做出手机桌面APP

    activity_test.xml <?xml version="1.0" encoding="utf-8"?> <GridView xmln ...

  6. python学习道路(day12note)(mysql操作,python链接mysql,redis)

    1,针对mysql操作 SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass'); 设置密码 update user set password ...

  7. sleep thread process

    $str = 'w0'; for($w=0;$w<999999;$w++){ $sql = 'INSERT INTO w1 (wint,wchar) VALUES ('.$w.',"' ...

  8. 贪吃蛇的java代码分析(二)

    代码剖析 贪吃蛇是一款十分经典的小游戏,对初入coding的朋友来说,拿贪吃蛇这样一个案例来练手十分合适,并不高的难度和成功后的成就感都是学习所必须的.下面我将依照我当时的思路,来逐步分析实现的整个过 ...

  9. iOS开发UI篇—iPad和iPhone开发的比较

    一.iPad简介 1.什么是iPad 一款苹果公司于2010年发布的平板电脑 定位介于苹果的智能手机iPhone和笔记本电脑产品之间 跟iPhone一样,搭载的是iOS操作系统 2.iPad的市场情况 ...

  10. java 关键字查询时的转义操作

    /** * mysql模糊查询时,如果查询关键字本身包含_和%,需要转义 * * @param queryKey 查询关键字 * @return 转义字符 */ private String conv ...