一、业务阐述
在开发中查询的数据库结果集,既要连接数据库、执行数据库操作、关闭数据库,还要把结果集的记录人为的设置到自己封装的DAO中等一系列的重复代码。
本文主要是想解决:用户只需要得到数据库连接,写sql语句,自己封装dao,其余的操作由封转的小框架解决这些重复的工作,用户得到的只是一个集合List。
List里面的元素有集合Map其中key是数据库中的字段类型,value是字段类型对应的值这个函数
DBUtil.executeQuery(con, sql)
List还提供集合元素存放的是dao对象,一条数据库记录对应一个dao对象,此函数是
DBUtil.executeQuery(con, sql,Vehicle.class)
以下提供源码的叙述
二、源码解说
测试类
package com.hewen.dao.manage;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
public class Main
{
public static void main(String[] args)
{
Connection con;
try {
con = DBTest.getCon();
} catch (SQLException e) {
e.printStackTrace();
return;
}
PreparedStatement pst = null;
ResultSet rs = null;
String sql = "select * from t_vehicle t where t.vehicle_id<4";
/**
* 该方法用到的技术是通过结果集的列属性的性质得到,没有用到反射机制
* 这个测试用例也是把查询的结果集放到List集合
* 里面的元素是集合Map,key是数据库中的字段类型,value是
* 字段类型对应的值,
* 查询的结果如:[{KIND_ID=1, DEF_FLAG=null, CHANNELNO=1, SN=陆震,(822)22911,13771000789,
* BUYDATE=2010-02-26, DELETETIME=null, STAMP=2010-02-26, REGDATE=null, ISDELETED=0,
* VEHICLE_ID=2, NUMBER_PLATE=苏B10001, VEHICLESTATE=待命状态(对应现场返回), USEDATE=2010-02-26,
* INTERPHONENO=null, NUMBER_PLATE_TYPE_ID=4, TEL2=null, STYLE=null, COLOR=null,
* INTERPHONEID=null, LASTMAINTAINTIME=null, INITDISTANCE=0, LAST_UPDATE_TIME=2010-02-26,
* REMARK=null, TEL=null, SUPERVISER=null},
* {KIND_ID=3, DEF_FLAG=null, CHANNELNO=1, SN=陆震,
* (822)22911,13771000789, BUYDATE=2010-02-26, DELETETIME=null, STAMP=2010-02-26,
* REGDATE=null, ISDELETED=0, VEHICLE_ID=3, NUMBER_PLATE=苏B90003,
* VEHICLESTATE=待命状态(对应现场返回), USEDATE=2010-02-26, INTERPHONENO=null,
* NUMBER_PLATE_TYPE_ID=4, TEL2=13151000793, STYLE=面包车, COLOR=白, INTERPHONEID=null,
* LASTMAINTAINTIME=null, INITDISTANCE=0, LAST_UPDATE_TIME=2010-02-26, REMARK=null,
* TEL=22916, SUPERVISER=杨兴华}]
*/
try {
List list=DBUtil.executeQuery(con, sql);
System.out.println(list);
} catch (SQLException e) {
e.printStackTrace();
}
/**
* 这个测试用例只是把查询的结果集中的某一条记录映射到了dao对象中,
* 查询的结果如:
* vehicle:vehicle_id: 2 numberPlate: 苏B10001 deleteDate: null
vehicle:vehicle_id: 3 numberPlate: 苏B90003 deleteDate: null
*/
/* try {
pst = con.prepareStatement(sql);
rs = pst.executeQuery();
while(rs.next()){
Vehicle r = (Vehicle) DBUtil.getFirstObjectFromRs(rs, Vehicle.class);
System.out.println("vehicle:" + r);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
DBUtil.closeRs(rs);
DBUtil.closePst(pst);
DBUtil.closeCon(con);
}*/
/**
* 方法是用的反射机制
* 这个测试用例是测试executeQuery函数,把查询的结果集放到List集合
* 并且集合元素存放的是dao对象,一条数据库记录对应一个dao对象,
* 打印出来的结果如:
* [vehicle_id: 2 numberPlate: 苏B10001 deleteDate: null,
* vehicle_id: 3 numberPlate: 苏B90003 deleteDate: null]
*
*/
/* try {
List list=DBUtil.executeQuery(con, sql,Vehicle.class);
System.out.println(list);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
}
}
封装dao DBUtil类
package com.hewen.dao.manage;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/***
* 注意利用查询出数据库的一条记录映射到相应的dao中,写相应的dao一定要注意字段,一定
* 要与数据库的记录字段相对应,大小写可以忽略,但是字段不一致就返回错误的数据
*
*