DynaClass,DynaBean使用

DynaClass/DynaBean
 这似乎是BeanUtils中最有趣的部分之一了,很简单,简单到光看这两个接口中的方法会不明白
 为什么要设计这两个接口。不过看到ResultSetDynaClass后,就明白了。下面是java doc中的代码:
    ResultSet rs = ...;
    ResultSetDynaClass rsdc = new ResultSetDynaClass(rs);
    Iterator rows = rsdc.iterator();
    while (rows.hasNext())  {
      DynaBean row = (DynaBean) rows.next();
      ... process this row ...
    }
    rs.close();
 原来这是一个ResultSet的包装器,ResultSetDynaClass实现了DynaClass,它的iterator方法返回一个
 ResultSetIterator,则是实现了DynaBean接口。
 在获得一个DynaBean之后,我们就可以用
      DynaBean row = (DynaBean) rows.next();
      System.out.println(row.get("field1")); //field1是其中一个字段的名字
 
 再看另一个类RowSetDynaClass的用法,代码如下:
 String driver="com.mysql.jdbc.Driver";
 String url="jdbc:mysql://localhost/2hu?useUnicode=true&characterEncoding=GBK";
 String username="root";
 String password="";
 
 java.sql.Connection con=null;
 PreparedStatement ps=null;
 ResultSet rs=null;
 try {
 Class.forName(driver).newInstance();
 con = DriverManager.getConnection(url);
 ps=con.prepareStatement("select * from forumlist");
 rs=ps.executeQuery();
 //先打印一下,用于检验后面的结果。
 while(rs.next()){
 System.out.println(rs.getString("name"));
 }
 rs.beforeFirst();//这里必须用beforeFirst,因为RowSetDynaClass只从当前位置向前滚动
 
 RowSetDynaClass rsdc = new RowSetDynaClass(rs);
 rs.close();
 ps.close();
 List rows = rsdc.getRows();//返回一个标准的List,存放的是DynaBean
 for (int i = 0; i <rows.size(); i++) {
 DynaBean b=(DynaBean)rows.get(i);
 System.out.println(b.get("name"));
 }
 } catch (Exception e) {
 e.printStackTrace();
 }
 finally{
 try {
 con.close();
 } catch (Exception e) {
 }
 }
 
 是不是很有趣?封装了ResultSet的数据,代价是占用内存。如果一个表有10万条记录,rsdc.getRows()
 就会返回10万个记录。@_@
 
 需要注意的是ResultSetDynaClass和RowSetDynaClass的不同之处:
 1,ResultSetDynaClass是基于Iterator的,一次只返回一条记录,而RowSetDynaClass是基于
 List的,一次性返回全部记录。直接影响是在数据比较多时ResultSetDynaClass会比较的快速,
 而RowSetDynaClass需要将ResultSet中的全部数据都读出来(并存储在其内部),会占用过多的
 内存,并且速度也会比较慢。
 2,ResultSetDynaClass一次只处理一条记录,在处理完成之前,ResultSet不可以关闭。
 3,ResultSetIterator的next()方法返回的DynaBean其实是指向其内部的一个固定
 对象,在每次next()之后,内部的值都会被改变。这样做的目的是节约内存,如果你需要保存每
 次生成的DynaBean,就需要创建另一个DynaBean,并将数据复制过去,下面也是java doc中的代码:
    ArrayList results = new ArrayList(); // To hold copied list
    ResultSetDynaClass rsdc = ...;
    DynaProperty properties[] = rsdc.getDynaProperties();
    BasicDynaClass bdc =
      new BasicDynaClass("foo", BasicDynaBean.class,
                         rsdc.getDynaProperties());
    Iterator rows = rsdc.iterator();
    while (rows.hasNext()) {
      DynaBean oldRow = (DynaBean) rows.next();
      DynaBean newRow = bdc.newInstance();
      PropertyUtils.copyProperties(newRow, oldRow);
      results.add(newRow);
    }
 
 事实上DynaClass/DynaBean可以用于很多地方,存储各种类型的数据。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值