您的位置:首页 > 数据库

jdbc sql 的执行结果resultset 包装为List

2008-09-06 09:30 465 查看



public class DTOPopulator ...{




    public static List populate(ResultSet rs,Class clazz) throws Exception...{


        ResultSetMetaData metaData = rs.getMetaData(); //取得结果集的元元素


        int colCount = metaData.getColumnCount();          //取得所有列的个数


        List ret = new ArrayList();                                       //存放返回结果的容器


        Field[] fields = clazz.getDeclaredFields();               //取得业务对象的属性


        




        while(rs.next())...{


            Object newInstance = clazz.newInstance();   //构造业务对象实例


                            //将结果集中每一条记录,每一个字段取出,根据命名规则,对对应的业务对象的属性进行赋值




            for(int i=1;i<=colCount;i++)...{  //对于该记录的每一列




                try...{


                    Object value = rs.getObject(i);




                    for(int j=0;j<fields.length;j
c79b
++)...{


                        Field f = fields[j];




                        if(f.getName().equalsIgnoreCase(metaData.getColumnName(i).replaceAll("_","")))...{


                            BeanUtils.copyProperty(newInstance,f.getName(),value);


                        }


                    }




                }catch (Exception e) ...{


                    // TODO: handle exception


                    e.printStackTrace();


                }


            }


            ret.add(newInstance);


        }


        return ret;


    } 
ResultSetMetaData rsmt=rs.getMetaData();是什么意思?答:得到结果集(rs)的结构信息,比如字段数、字段名等。

 String类的replaceAll()方法,第一个参数是一个正则表达式,对于"[abc]abc"字符串,进行replaceAll("[abc]","1");替换之后的结果是:[111]111,正则表达式[abc]表示a,b,c的任何字符.

replaceAll

public  replaceAll( regex,
 replacement)
使用给定的 replacement 字符串替换此字符串匹配给定的的每个子字符串。
此方法调用的 str.replaceAll(regex, repl) 形式产生与以下表达式完全相同的结果:


Pattern
.
compile
(regex).
matcher
(str).
replaceAll
(repl)

参数:
regex
- 用来匹配此字符串的正则表达式
返回:
得到的 String
抛出:
PatternSyntaxException
- 如果正则表达式的语法无效
Class
类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该
Class
对象。基本的 Java 类型(
boolean
byte
char
short
int
long
float
double
)和关键字
void
也表示为
Class
对象。

Class
没有公共构造方法。
Class
对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的
defineClass
方法自动构造的

getDeclaredFields

public [] getDeclaredFields()
throws 

返回
Field
对象的一个数组,这些对象反映此
Class
对象所表示的类或接口所声明的所有字段,包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。返回数组中的元素没有排序,也没有任何特定的顺序。如果该类或接口不声明任何字段,或者此
Class
对象表示一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组。
newInstance()
          创建此 Class 对象所表示的类的一个新实例。  

22

平时我们使用jdbc的时候经常需要把resultset-->List,以被其他层调用,其实我们使用o/r开源工具Torque,hibernate就有类似包装好的,非常好用.

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; //返回方法
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.List;
import org.apache.log4j.Logger;
import com.scitel.crms.business.dao.*;

/**
 *
 * <p>Title:运用类反射机制来实现 </p>
 * <p>Description:持久化层DAO层简化:通用查询类 </p>
 */

public class QueryUtil extends BasicDAO {

  private static Logger log = Log.getLog(QueryUtil.class);
  private Connection con = null;
  private PreparedStatement pstmt = null;
  private ResultSet rs = null;

  /**
   * 完成ResultSet对象向List对象为集合的对象的转化
   * @param sql,指定的查询Sql
   * @param className,Sql相对应的JavaBean/FormBean类的名字:具体的Vo值对象或ActionForm
   * @Return:以类className为一条记录的结果集,
   * 完成ResultSet对象向List对象为集合的className对象的转化
   */
  public List Select(String sql, String className) {
    List arr = null; //数组来处理
    try {
      con = DBTool.getDAOConnection(); //取得数据库连接
      pstmt = con.prepareStatement(sql);
      rs = pstmt.executeQuery(); //执行查询
      String recordValue = ""; //构造返回的结果集
      Object c1 = null;
      arr = new ArrayList();
      ResultSetMetaData rsmd = rs.getMetaData(); //取得数据表中的字段数目,类型等返回结果
      //是以ResultSetMetaData对象保存
      int columnCount = rsmd.getColumnCount(); //列的总数
      while (rs.next()) {
        c1 = Class.forName(className).newInstance(); //类的实例化
        for (int i = 1; i <= columnCount; i++) {
          if (rs.getString(rsmd.getColumnName(i)) != null) {
            recordValue = rs.getString(rsmd.getColumnName(i));
          } else {
            recordValue = "";
          }

          Method
              m = c1.getClass().getMethod(getSetMethodName(rsmd.getColumnName(i)),
                                          new Class[] {recordValue.getClass()});
          m.invoke(c1, new Object[] {recordValue});
        }
        log.info("取得ActionForm或VO中的set方法" +
                 getSetMethodName(rsmd.getColumnName(1)));
        arr.add(c1);

      }

    } catch (SQLException ex) {

    } catch (ClassNotFoundException e) {

    } catch (NoSuchMethodException e) {

    } catch (InvocationTargetException e) {

    } catch (IllegalAccessException e) {

    } catch (InstantiationException e) {
    } finally {

      release(rs, pstmt, con); //释放资源
    }
    return arr;

  }

   //在JavaBean封装的商业逻辑中调用Select 方法,然后在JSP页面上显示出来:
   //Function:取得用户列表
  //Para:
  //Return:返回用户列表
  public List getUsers(){
      List ret=null;
      DatabaseManage db=new DatabaseManage();
      String sql=" select usr_id,usr_name "
          +" from users " ;
      ret=db.Select(sql," com.mcsky. webis.system.UsersActionForm");
      return ret;
  }
 
  public static void main(String[] args) {
    //方法测试通过
    String sql =
        "select chkr_code,chkr_name,chkr_value chkr_regular from checkrule "; //查询告警用户过滤设置明细
    QueryUtil util = new QueryUtil();
    List arr = null;
    arr = util.Select(sql, "com.scitel.crms.web.form.TestActionForm");
    System.out.println("集合大小------>>>>>>>" + arr.size());
    //System.out.println("集合大小------>>>>>>>"+arr.toArray().toString());

  }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息