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可以用于很多地方,存储各种类型的数据。
分享到:
相关推荐
java.lang.NoClassDefFoundError: org/apache/commons/beanutils/DynaBean java.lang.NoClassDefFoundError: org/apache/commons/codec/DecoderException java.lang.NoClassDefFoundError: org/apache/commons/lang/...
java.lang.NoClassDefFoundError: org/apache/commons/beanutils/DynaBean java.lang.NoClassDefFoundError: org/apache/commons/codec/DecoderException java.lang.NoClassDefFoundError: org/apache/commons/...
java.lang.NoClassDefFoundError: org/apache/commons/beanutils/DynaBean java.lang.NoClassDefFoundError: org/apache/commons/codec/DecoderException java.lang.NoClassDefFoundError: org/apache/commons/lang/...
我们可以使用 BasicDynaClass 的构造函数来定义属性,并指定 DynaBean 的基础类型(默认为 BasicDynaBean 或者自定义实现 DynaClass 接口的类)。 在实际使用中,例如处理一组基本报表信息,我们可能需要创建一个 ...
2. **DynaClass接口**:DynaClass是描述DynaBean结构的接口,包含了DynaBean的所有属性信息。它的实现类如BasicDynaClass和WrapDynaClass负责创建和管理DynaBean的属性定义。在创建DynaBean实例之前,我们需要先定义...
01.JEPLUS新特性(系统功能).mp4 02.JEPLUS新特性(数据源讲解).mp4 ...19.JEPLUS数据库操作DynaBean.mp4 20.Excel导入技巧.mp4 21.定时任务、流程事件灵活运用.mp4 22.对接第三方数据库使用案例.mp4
在java中使用json需要引入以下六个jar包,分别为: commons-lang-2.4.jar commons-collections-3.2.1.jar commons-beanutils-1.8.3.jar json-lib-2.4-jdk15.jar ezmorph-1.0.6.jar commons-logging-1.1.3.jar ...
开发者可以使用`DynaClass`来创建不需预先定义的DynaBean实例。 5. **Introspector**: 这个模块提供了对JavaBean的元数据(如属性、构造函数和方法)的深入洞察。通过`describe()`方法,开发者可以获取Bean的完整...
java.lang.NoClassDefFoundError: org/apache/commons/beanutils/DynaBean commons-collections.jar 不加这个包 java.lang.NoClassDefFoundError: org/apache/commons/collections/map/ListOrderedMap commons-...
同样,缺少`ezmorph-1.0.6.jar`会导致`net.sf.ezmorph.Morpher`类无法找到,而`commons-beanutils-1.8.0.jar`对于`DynaBean`类的使用至关重要。 在实际使用中,将Java对象转换为JSON格式,可以通过JSON库提供的API...
java.lang.NoClassDefFoundError: org/apache/commons/beanutils/DynaBean commons-collections.jar 不加这个包 java.lang.NoClassDefFoundError: org/apache/commons/collections/map/ListOrderedMap commons-...
`DynaClass`和`DynaProperty`是支持DynaBean的类,它们提供了动态管理属性的能力。 6. **国际化支持**: BeanUtils也支持国际化(i18n)和本地化(l10n)功能,可以通过`MessageResources`类来处理不同地区的消息...
java.lang.NoClassDefFoundError: org/apache/commons/beanutils/DynaBean commons-collections-3.2.2.jar 不加这个包 java.lang.NoClassDefFoundError: org/apache/commons/collections/map/ListOrderedMap commons...
**MorphDynaBean**是ezmorph库中的一个类,实现了`org.apache.commons.beanutils.DynaBean`接口。这个接口允许在运行时动态地添加、删除和获取属性,提供了一种灵活的方式来处理和操作对象。`MorphDynaBean`可以接收...
有丰富的MINA通信软件开发经验,现在已经有成熟的底层框架(结合了反射、DynaBean、Spring等多种技术),可以实现程序自动对上位机和下位机之间的通信协议进行解析,并在国网公司智能电网的大型项目中使用。...
如果没有它,你可能会遇到`java.lang.NoClassDefFoundError: org/apache/commons/beanutils/DynaBean`的错误。 2. **commons-collections.jar**: 包含了集合操作的各种实用工具类,如`ListOrderedMap`,在处理JSON...
- **DynaBean/DynaClass/DynaProperty**:提供了动态Bean的支持。 - **BasiceDyanBean/BasicDynaClass**:基本的动态Bean实现。 - **WrapDynaBean/WrapDynaClass/ConvertingWrapDynaBean**:提供了包装动态Bean的...
这两个库常常一起使用,因为BeanUtils在处理Bean属性时,可以利用Collections库中的工具类进行更复杂的操作。例如,当需要批量设置一个Bean集合的相同属性时,可以先用Collections的函数处理集合,然后再通过...
对于更复杂的情况,如转换Java的类实例,可能需要实现`Serializable`接口或使用自定义的转换逻辑。 ```java JSONObject obj = new JSONObject(); obj.put("name", "John"); obj.put("age", 30); // 或者,对于复杂...