模拟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即可
随机推荐
- MSSQL 跨服器调用存储过程
A库 CREATE PROCEDURE [dbo].[A_P_Test] AS BEGIN SELECT * FROM dbo.A_LoadData END B库 在B中调用A库存储过程 注:是同一 ...
- C# Winform 中如何实现音乐播放和视频播放
C# Winform 中如何实现音乐播放和视频播放 namespace WindowsFormsApplication1 { public partial class Form2 : Form { ...
- 不可变字符串NSString
/*字符串的常用方法*/ //1.通常用来把一些基本数据类型和字符串进行拼接 ; float b = 9527.0; NSString *string = [NSString stringWithFo ...
- 集合知识点一 Collection(List)
- C++STL -- vector实现
STL的vector简化实现 本质 vector说到底就是一个动态数组,我们需要做的就是管理动态数组的内存,和元素的增加,删除,移动等. template <typename T> cla ...
- hihoCoder 1184 连通性二·边的双连通分量
#1184 : 连通性二·边的双连通分量 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在基本的网络搭建完成后,学校为了方便管理还需要对所有的服务器进行编组,网络所的老 ...
- 纯Java配置使用slf4j配置log4j
工程目录如下 代码里面用的是slf4j,但是想要用log4j来管理日志,就得添加slf4j本来的jar,然后添加log4j和slf4j箱关联的jar即可. 如果是maven项目的话添加下面的依赖即可 ...
- win7下wndows virtual pc 2007 装xp比新版本的 Windows virtual pc 好用
2007下装xp虚拟机启动快,支持拖放.
- ios-UserDefaults
//单例设计模式 /* 1.单例是一种设计模式 是开发人员在开发过程中总结出来的简单方法 2. 如果某个对象在整个工程中有且只有一个(唯一的)就必须使用单例设计模式创建该对象 3.单例设计模式创建的对 ...
- Oracle数据库的导入导出
1.导出Oracle数据 A.使用命令行导出数据 exp username/password @database file= fullpath(如:D:\data.dmp) full=y B.使用工具 ...