将普通sql查询的将结果集转换指定的对象,然后对象存在list中并返回

package com.epsoft.util;
import java.lang.reflect.Method;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 通用查询,将普通sql查询的将结果集转换指定的对象,然后对象存在list中并返回;
 * 调用方法:UtilQueryBS.getQueryInfoByManulSQL(sql,Bean)
 * 传入值为一个sql字符串,一个要转换的Bean对象(可以是:Bean对象,package包 + Bean类名,Bean.class);
 * 
 * @author wangb2
 * 
 */
public class UtilQueryObj<T> {
 
 /**
  * 查询语句
  */
 private String querySQL;
 
 /**
  * 数据库连接
  */
 private Connection conn;
 /**
  * 要转换成的Bean对象
  */
 private Class<?> cla;
 private T obj;
 PreparedStatement stmt = null;
 
 /**
  * 预编译sql参数表
  */
 List<Map<String,String>> e = null;
 
 public UtilQueryObj() {
  super();
 }
 /**
  * 执行查询,
  * 
  * @return wangb2
  * @throws AppException
  */
 @SuppressWarnings("unchecked")
 public List<T> query() throws SQLException {
  ResultSet rs = null;
  ResultSetMetaData rsmd = null;
  List<T> list = null;
  int cols;
  try {
   stmt = conn.prepareStatement(querySQL);
   if(e==null){
   }else{
    for (Map<String, String> t : e) {
     Integer index =Integer.parseInt(t.get("index").toString());
     String type = t.get("type").toString();
     String value = t.get("value");
     
     if ( type.equalsIgnoreCase("String")) {
      stmt.setString(index, value.toString());
     } else if (type.equalsIgnoreCase("Long")) {
      stmt.setLong(index, Long.parseLong(value));
     } else if (type.equalsIgnoreCase("Double")) {
      stmt.setDouble(index, Double.parseDouble(value));
     } else if (type.equalsIgnoreCase("Integer") || type.equalsIgnoreCase("int")) {
      stmt.setInt(index,Integer.parseInt(value));
     } else if (type.equalsIgnoreCase("Boolean")) {
      stmt.setBoolean(index,Boolean.parseBoolean(value));
     } else if (type.equalsIgnoreCase("Float")) {
      stmt.setFloat(index,Float.parseFloat(value));
     } else if (type.equalsIgnoreCase("Date")) {
      stmt.setDate(index,stringToDate(value));
     }
    }
   }
   rs = stmt.executeQuery();
   rsmd = rs.getMetaData();
   cols = rsmd.getColumnCount();
   list = new ArrayList<T>();
   /*
    * 将每一行的结果集转换成指定类对象
    */
   while (rs.next()) {
    // 并实例化成对象
    obj = (T) cla.newInstance();
    for (int j = 1; j <= cols; j++) {
     String colName = iniStr((rsmd.getColumnName(j)).toLowerCase());
     try{
      // 通过getter确定bean属性的数据类型
      Method met = cla.getMethod("get" + colName);
      // 取得属性的数据类型
      Class<?> p = met.getReturnType();
      //获取set
      met = obj.getClass().getMethod("set" + colName, p);
      // 根据属性的数据类型来判断该用哪种数据类型取值,并将值存入对象属性中
      if (p == String.class) {
       met.invoke(obj, rs.getString(j));
      } else if (p == Long.class || p == long.class) {
       met.invoke(obj, rs.getLong(j));
      } else if (p == Double.class || p == double.class) {
       met.invoke(obj, rs.getDouble(j));
      } else if (p == Integer.class || p == int.class) {
       met.invoke(obj, rs.getInt(j));
      } else if (p == Blob.class) {
       met.invoke(obj, rs.getBlob(j));
      } else if (p == Boolean.class || p == boolean.class) {
       met.invoke(obj, rs.getBoolean(j));
      } else if (p == Byte.class || p == byte.class) {
       met.invoke(obj, rs.getByte(j));
      } else if (p == Short.class || p == short.class) {
       met.invoke(obj, rs.getShort(j));
      } else if (p == Object.class) {
       met.invoke(obj, rs.getObject(j));
      } else if (p == Float.class || p == float.class) {
       met.invoke(obj, rs.getFloat(j));
      } else if (p == java.sql.Date.class) {
       met.invoke(obj, rs.getDate(j));
      } else if (p == java.util.Date.class) {
       met.invoke(obj, rs.getDate(j));
      } else if (p == Clob.class) {
       met.invoke(obj, rs.getClob(j));
      }
     }catch (NoSuchMethodException e) {
      System.err.println("");
     }
    }
    list.add(obj);
   }
  } catch (Exception e) {
   e.printStackTrace();
  } 
  return list;
 }
 /**
  * 处理set属性方法名,首字母为大写
  * 
  * @param old
  * @return
  */
 public String iniStr(String old) {
  return old.substring(0, 1).toUpperCase() + old.substring(1);
 }

 /**
  * @param connection
  */
 public void setConnection(Connection connection) {
  conn = connection;
 }
 /**
  * @param string
  */
 public void setQuerySQL(String string) {
  querySQL = string;
 }
 public Class<?> getCla() {
  return cla;
 }
 public void setCla(Class<?> cla) {
  this.cla = cla;
 }
 /**
  * 类入口,通过调用,将返回一个list集合 查询的结果集将转换为指定的对象, 结果集对象存入list中返回
  * 
  * @param sql
  *            查询的sql语句
  * @param cla
  *            结果集转换的对象
  * @return list
  * @throws SQLException 
  */
 public static<T> List<T> getQueryInfoByManulSQL(String sql, Class<T> cla,Connection connection) throws SQLException {
  UtilQueryObj<T> query = new UtilQueryObj<T>();
  query.setConnection(connection);
  query.setQuerySQL(sql);
  query.setCla(cla);
  List<T> list = query.query();
  return list;
 }
 /**
  * 类入口,通过调用,将返回一个list集合 查询的结果集将转换为指定的对象, 结果集对象存入list中返回
  * 
  * @param sql
  *            查询的sql语句
  * @param cla
  *            结果集转换的对象
  * @return list 当使用预编译sql时传入,结构为,List<Map<String,String>>,
  *          Map<String,String>中应包含 index 预编译的索引,type 这个值是什么类型的,value 值;可也使用toMap方法组装
  *  
  * @throws SQLException 
  */
 public static<T> List<T> getQueryInfoByManulSQL(String sql, Class<T> cla,Connection connection,List<Map<String,String>> lp) throws SQLException {
  UtilQueryObj<T> query = new UtilQueryObj<T>();
  query.setConnection(connection);
  query.setQuerySQL(sql);
  query.e=lp;
  query.setCla(cla);
  List<T> list = query.query();
  return list;
 }
 /**
  * 类入口,通过调用将返回一个list集合 查询的结果集将转换为指定的对象, 结果集对象存入list中返回
  * 
  * @param sql
  *            查询的sql语句
  * @param objName
  *            结果集转换的对象
  * @return list
  * @throws SQLException 
  */
 public static<T> List<T> getQueryInfoByManulSQL(String sql, Object objName,Connection connection) throws SQLException {
  UtilQueryObj<T> query = new UtilQueryObj<T>();
  query.setConnection(connection);
  query.setQuerySQL(sql);
  query.setCla(objName.getClass());
  List<T> list = query.query();
  return list;
 }
 /**
  * 类入口,通过调用将返回一个list集合 查询的结果集将转换为指定的对象, 结果集对象存入list中返回
  * 
  * @param sql
  *            查询的sql语句
  * @param className
  *            结果集转换的对象
  * @return list
  * @throws ClassNotFoundException
  * @throws SQLException 
  */
 public static<T> List<T> getQueryInfoByManulSQL(String sql, String className,Connection connection) throws 
   ClassNotFoundException, SQLException {
  UtilQueryObj<T> query = new UtilQueryObj<T>();
  query.setConnection(connection);
  query.setQuerySQL(sql);
  query.setCla(Class.forName(className));
  List<T> list = query.query();
  return list;
 }
 /**
  * 
  * @param index 预编译的索引
  * @param type 这个值是什么类型的
  * @param value 值
  * @return
  */
 public static Map<String,String> toMap(String index,String type,String value){
  Map<String,String> map = new HashMap<String,String>();
  map.put("index", index);
  map.put("type", type);
  map.put("value", value);
  return map;
  
 }
 
 public static java.sql.Date stringToDate(String str) {
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  try {
   java.util.Date d = sdf.parse(str);
   return new java.sql.Date(d.getTime());
  } catch (ParseException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return null;
 }
}

你可能感兴趣的:(java,jdbc,通用)