一、业务阐述
在开发中查询的数据库结果集,既要连接数据库、执行数据库操作、关闭数据库,还要把结果集的记录人为的设置到自己封装的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;
- public class DBUtil {
-
- public static void rollBack(Connection con){
- try {
- con.rollback();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
- public static List<Map<String, Object>> executeQuery(Connection con, String sql) throws SQLException{
- PreparedStatement pst = null;
- ResultSet rs = null;
- try {
- pst = con.prepareStatement(sql);
- rs = pst.executeQuery();
- return getListFromRsLowerCase(rs);
- }finally{
- closeRs(rs);
- closePst(pst);
- }
- }
-
- public static List<Object> executeQuery(Connection con, String sql, Class<?> c) throws SQLException{
- PreparedStatement pst = null;
- ResultSet rs = null;
- try {
- pst = con.prepareStatement(sql);
- rs = pst.executeQuery();
- return getListFromRs(rs, c);
- }finally{
- closeRs(rs);
- closePst(pst);
- }
- }
-
- public static List<Map<String, Object>> getListFromRs(ResultSet rs) throws SQLException{
- ResultSetMetaData md = rs.getMetaData();
- int columns = md.getColumnCount();
- int i;
- List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
- while(rs.next()){
- Map<String, Object> map = new HashMap<String, Object>();
- for(i = 0; i < columns; i++){
- map.put(md.getColumnName(i + 1), getValueByType(rs, md.getColumnType(i + 1), md.getColumnName(i + 1)));
- }
- list.add(map);
- }
- return list;
- }
-
- public static List<Map<String, Object>> getListFromRsLowerCase(ResultSet rs) throws SQLException{
- ResultSetMetaData md = rs.getMetaData();
- int columns = md.getColumnCount();
- int i;
- List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
- while(rs.next()){
- Map<String, Object> map = new HashMap<String, Object>();
- for(i = 0; i < columns; i++){
- map.put(md.getColumnName(i + 1).toLowerCase(), getValueByType(rs, md.getColumnType(i + 1), md.getColumnName(i + 1)));
- }
- list.add(map);
- }
- return list;
- }
-
- public static List<Map<String, Object>> getListFromRsUpperCase(ResultSet rs) throws SQLException{
- ResultSetMetaData md = rs.getMetaData();
- int columns = md.getColumnCount();
- int i;
- List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
- while(rs.next()){
- Map<String, Object> map = new HashMap<String, Object>();
- for(i = 0; i < columns; i++){
- map.put(md.getColumnName(i + 1).toUpperCase(), getValueByType(rs, md.getColumnType(i + 1), md.getColumnName(i + 1)));
- }
- list.add(map);
- }
- return list;
- }
-
- public static List<Object> getListFromRs(ResultSet rs, Class<?> c) throws SQLException{
- List<Object> list = new ArrayList<Object>();
- try {
- while(rs.next()){
- Object o = initObjectFromRsIfExist(rs, c);
- list.add(o);
- }
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (InstantiationException e) {
- e.printStackTrace();
- }
- return list;
- }
-
- public static Object getFirstObjectFromRs(ResultSet rs, Class<?> c) throws SQLException{
- Object o = null;
- try {
- o = initObjectFromRsIfExist(rs, c);
- } catch (InstantiationException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- return o;
- }
-
- private static Object getValueByType(ResultSet rs, int type, String name) throws SQLException{
- switch(type){
- case Types.NUMERIC:
- return rs.getLong(name);
- case Types.VARCHAR:
-
-
-
- return rs.getString(name);
- case Types.DATE:
-
-
-
- return rs.getDate(name);
- case Types.TIMESTAMP:
- return rs.getTimestamp(name).toString().substring(0,rs.getTimestamp(name).toString().length()-2);
- case Types.INTEGER:
- return rs.getInt(name);
- case Types.DOUBLE:
- return rs.getDouble(name);
- case Types.FLOAT:
- return rs.getFloat(name);
- case Types.BIGINT:
- return rs.getLong(name);
- default:
- return rs.getObject(name);
- }
- }
-
- private static boolean rsContainsFields(ResultSet rs, String fieldName) throws SQLException{
- ResultSetMetaData md = rs.getMetaData();
- for(int i = 0; i < md.getColumnCount(); i++){
- if(md.getColumnName(i + 1).equalsIgnoreCase(fieldName)){
- return true;
- }
- }
- return false;
- }
-
- private static Object initObjectFromRs(ResultSet rs, Class<?> c) throws InstantiationException, SQLException, IllegalAccessException{
- Object o = c.newInstance();
- Method[] methods = o.getClass().getMethods();
- for(Method m: methods){
- if(m.getName().startsWith("set")){
- try {
- m.invoke(o, getParamValueFromRs(rs, m));
- } catch (IllegalArgumentException e) {
- throw new RuntimeException("IllegalArgumentException:" + e + "\nMethods:" + m.getName());
- } catch (InvocationTargetException e) {
- throw new RuntimeException("InvocationTargetException:" + e + "\nMethods:" + m.getName());
- }
- }
- }
- return o;
- }
-
- private static Object initObjectFromRsIfExist(ResultSet rs, Class<?> c) throws SQLException, IllegalAccessException, InstantiationException{
- Object o = c.newInstance();
- Method[] methods = o.getClass().getMethods();
- String field;
- for(Method m: methods){
-
- field = m.getName().substring(3);
-
-
- if(m.getName().startsWith("set") && rsContainsFields(rs, field)){
- try {
- m.invoke(o, getParamValueFromRs(rs, m));
- } catch (IllegalArgumentException e) {
- throw new RuntimeException("IllegalArgumentException:" + e + "\nMethods:" + m.getName());
- } catch (InvocationTargetException e) {
- throw new RuntimeException("InvocationTargetException:" + e + "\nMethods:" + m.getName());
- }
- }
- }
- return o;
- }
-
- private static Object getParamValueFromRs(ResultSet rs, Method m) throws SQLException
- {
- String fieldName = m.getName().substring(3);
- Type type = m.getGenericParameterTypes()[0];
- return getValueFromRs(rs, fieldName, type);
- }
-
- private static Object getValueFromRs(ResultSet rs, String fieldName, Type t) throws SQLException{
- String type = t.toString();
- try{
- if(type.equals("int") || type.equals("class java.lang.Integer")){
- return rs.getInt(fieldName);
- }else if(type.equals("float") || type.equals("class java.lang.Float")){
- return rs.getFloat(fieldName);
- }else if(type.equals("double") || type.equals("class java.lang.Double")){
- return rs.getDouble(fieldName);
- }else if(type.equals("long") || type.equals("class java.lang.Long")){
- return rs.getLong(fieldName);
- }else if(type.equals("class java.lang.String")){
- return rs.getString(fieldName);
- }else if(type.equals("class java.sql.Timestamp")){
- return rs.getTimestamp(fieldName);
- }else if(type.equals("class java.sql.Date")){
- return rs.getDate(fieldName);
- }else if(type.equals("class java.sql.Time")){
- return rs.getTime(fieldName);
- }
- }catch(SQLException e){
- throw new SQLException("SQLException when get field:" + fieldName + "\n" + e);
- }
- throw new RuntimeException("getValueFromRsByField fail, field type is:" + type + ",field name is:" + fieldName);
- }
-
- public static void closeRs(ResultSet... rss){
- for(ResultSet rs: rss){
- if(rs != null){
- try {
- rs.close();
- } catch (SQLException e) {
- }
- }
- }
- }
-
- public static void closePst(Statement... psts){
- for(Statement pst: psts){
- if(pst != null){
- try {
- pst.close();
- } catch (SQLException e) {
- }
- }
- }
- }
-
- public static void closeCon(Connection... cons){
- for(Connection con: cons){
- if(con != null)
- {
- try {
- con.close();
- } catch (SQLException e) {
- }
- }
- }
- }
- }
连接Oracle数据库类
- package com.hewen.dao.manage;
-
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.SQLException;
- /***
- * 这个是连接Oracle数据库
- * @author Administrator
- *
- */
- public class DBTest {
- public static Connection getCon() throws SQLException{
- try {
- Class.forName("oracle.jdbc.driver.OracleDriver");
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- return null;
- }
- String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
- String user = "avls";
- String password = "1";
-
- return DriverManager.getConnection(url, user, password);
- }
- }
封装的dao类
运行的结果
- [{vehiclestate=待命状态(对应现场返回), vehicle_id=2, interphoneid=null, deletetime=null, number_plate=苏B10001, regdate=null, initdistance=0, superviser=null, style=null, number_plate_type_id=4, tel=null, buydate=2010-02-26, isdeleted=0, kind_id=1, channelno=1, usedate=2010-02-26, remark=null, sn=陆震,(822)22911,13771000789, last_update_time=2010-02-26, interphoneno=null, color=null, tel2=null, stamp=2010-02-26, lastmaintaintime=null, def_flag=null}, {vehiclestate=待命状态(对应现场返回), vehicle_id=3, interphoneid=null, deletetime=null, number_plate=苏B90003, regdate=null, initdistance=0, superviser=杨兴华, style=面包车, number_plate_type_id=4, tel=22916, buydate=2010-02-26, isdeleted=0, kind_id=3, channelno=1, usedate=2010-02-26, remark=null, sn=陆震,(822)22911,13771000789, last_update_time=2010-02-26, interphoneno=null, color=白, tel2=13151000793, stamp=2010-02-26, lastmaintaintime=null, def_flag=null}]
-
- vehicle:vehicle_id: 2 numberPlate: 苏B10001 deleteDate: null
- vehicle:vehicle_id: 3 numberPlate: 苏B90003 deleteDate: null
-
- [vehicle_id: 2 numberPlate: 苏B10001 deleteDate: null,
- vehicle_id: 3 numberPlate: 苏B90003 deleteDate: null]
从数据库得到的结果集存放到List集合中
原文:http://www.cnblogs.com/wangfeng520/p/5457277.html