首先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
获取数据源工具类:
packagecom.tpf.utils;importjava.io.InputStream;importjava.util.Properties;importjavax.sql.DataSource;importorg.apache.commons.dbcp.BasicDataSourceFactory;public classDbcpDataSourceUtils {privateDbcpDataSourceUtils(){}private staticDataSource ds;static{try{//读取资源文件
InputStream in = DataSourceUtils.class.getClassLoader().getResourceAsStream("dbcp.properties");//读取资源对象
Properties prop = newProperties();
prop.load(in);//创建ds
ds = newBasicDataSourceFactory().createDataSource(prop);
}catch(Exception e){throw newRuntimeException(e.getMessage(),e);
}
}//返回整个池对象
public staticDataSource getDatasSource(){returnds;
}
}
第一步:定义回调接口(回调规范),dbutils中的回调接口(回调规范)是 ResultSetHandler
我们自己的回调接口如下:
packagecom.tpf.callback.beanlisthandler;importjava.sql.ResultSet;/*** 定义回调规范
*
Title:MyHandler
*
Description:
*
Company: www.vfinance.cn
*@authortianpengfei
*@param
* @date 2016年8月10日 下午1:57:40*/
public interface MyHandler{
T handler(ResultSet rs);
}
第二步:定义接口实现类,dbutils中实现了如下:
这里我们先实现BeanListHandler
我们自己的MyBeanListHandler如下:
packagecom.tpf.callback.beanlisthandler.impl;importjava.lang.reflect.Method;importjava.sql.ResultSet;importjava.sql.ResultSetMetaData;importjava.util.ArrayList;importjava.util.List;importcom.tpf.callback.beanlisthandler.MyHandler;/*** 返回List所有行,都封装到List,适合于查询多个结果
*
Title:MyBeanListHandler
*
Description:
*
Company: www.vfinance.cn
*@authortianpengfei
* @date 2016年8月10日 下午2:39:44
*@param*/
public class MyBeanListHandler implements MyHandler>{private Classcls;public MyBeanListHandler(Classcls) {this.cls =cls;
}
@Overridepublic Listhandler(ResultSet rs) {
List list = new ArrayList();//定义返回类型
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 newRuntimeException(e.getMessage(), e);
}
}
list.add(t);
}
}catch(Exception e) {throw newRuntimeException(e.getMessage(), e);
}returnlist;
}
}
第三步:定义调用类
Dbutils中的是QueryRunner
我们自己的MyQueryRunner如下:
packagecom.tpf.callback.beanlisthandler;importjava.sql.Connection;importjava.sql.ResultSet;importjava.sql.Statement;importjavax.sql.DataSource;/*** 定义自己的回调函数 “调用类”
*
Title:MyQueryRunner
*
Description:
*
Company: www.vfinance.cn
*@authortianpengfei
* @date 2016年8月10日 下午2:00:04*/
public classMyQueryRunner {privateDataSource ds ;publicMyQueryRunner() {}publicMyQueryRunner(DataSource ds) {this.ds =ds;
}public T query(String sql, MyHandlermh){
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 newRuntimeException(e.getMessage(), e);
}returnt;
}
}
User实体
packagecom.tpf.domain;public classUser {privateString id;privateString name;privateString pwd;publicString getId() {returnid;
}public voidsetId(String id) {this.id =id;
}publicString getName() {returnname;
}public voidsetName(String name) {this.name =name;
}publicString getPwd() {returnpwd;
}public voidsetPwd(String pwd) {this.pwd =pwd;
}
@OverridepublicString toString() {return "User [id=" + id + ", name=" + name + ", pwd=" + pwd + "]";
}
}
第四部:应用测试
@Testpublic voidtest1(){
MyQueryRunner myQueryRunner= newMyQueryRunner(DataSourceUtils.getDateSource());
String sql= "select * from users";
List list = myQueryRunner.query(sql, new MyBeanListHandler(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]