学习笔记-刘伟javabean视频教程(下部)
刘伟javabean视频(下部)(第2,3部分为转载):
org.apache.commons.beanutils包的使用
1
BeanUtils.getProperty(bean,property);//从bean中取出属性property的东东
BeanUtils.setProperty(bean,property,object);
BeanUtils.copyProperties(bean1,bean2);//将2的属性赋给1
PropertyUtils与BeanUtils区别:BeanUtils的getProperty方法返回类型为String,而PropertyUtils的返回类型为Object(保持原样).
2
ResultSetDynaClass (Wraps ResultSet in DynaBeans)
一个很普通的DynaBean 的USER CASE就是用它来包装其他原始集合,这些集合不是以JAVABEAN的形式展示的。最常见的情况就是当你请求JDBC驱动查询SQL语句返回java.sql.ResultSet类型的记录的时候,BeanUtils提供了标准的机制来把每一行resultset转变为一个 DynaBean,参照下列:
Connection conn = ...;
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery
("select account_id, name from customers");
Iterator rows = (new ResultSetDynaClass(rs)).iterator();
while (rows.hasNext()) {
DynaBean row = (DynaBean) rows.next();
System.out.println("Account number is " +
row.get("account_id") +
" and name is " + row.get("name"));
}
rs.close();
stmt.close();
RowSetDynaClass (Disconnected ResultSet as DynaBeans)
尽管ResultSetDynaClass是一个用来展示sql查询的很好的技术(当成DynaBean),但是最大的问题就是在MVC的结构之中,我们需要离线的取出查询的所有数据,而ResultSetDynaClass必须保持和数据库相连。
RowSetDynaClass 展示了解决这个问题的不同方法。当你构造这样的实例,那些原始的数据被复制到一系列in-memory 的DynaBeans来代表这些结果。这个技术的优势是,理所当然,你可以立即关闭ResultSet(和他相连的Statement),这些操作都可以在你处理被返回的数据之前。缺点就是,你需要为复制数据所需要的性能和内存买单,而且数据的大小还得让堆内存可以适合。在许多情况下(特别是WEB APPS),这种折衷是有益处的。
额外的方便就是,RowSetDynaClass 被定义为java.io.Serializable的实现,因此它可以被序列化和反序列化。因此RowSetDynaClass展示了一种十分便利的方法来传输SQL结果到远程Java-based 客户端应用程序(比如APPLET).
基本的RowSetDynaClass使用模式如下所示:
Connection conn = ...; // Acquire connection from pool
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT ...");
RowSetDynaClass rsdc = new RowSetDynaClass(rs);
rs.close();
stmt.close();
...; // Return connection to pool
List rows = rsdc.getRows();
...; // Process the rows as desired
WrapDynaBean and WrapDynaClass
3
Lazy DynaBeans(LazyDynaBean, LazyDynaMap and LazyDynaClass)
你钟情于DynaBeans是因为有了它你不必对每个pojo来编码成一个class文件。这样能够实现的原因是因为lazy--延迟加载。是以下的一些特性使得DynaBeans可以lazy:
Lazy property addition (lazy属性添加)---lazy beans 使用 实现了MutableDynaClass 接口的DynaClass,DynaClass提供了添加和删除属性的能力。当set方法调用的时候,Lazy beans 利用这个特性来自动添加DynaClass中没有的属性
Lazy List/Array growth(lazy list/array 增长)---如果一个索引化的属性没有足够的容量来容纳要设置的属性,那么List or Array 将会自动增长。
Lazy List/Array instantiation(Lazy List/Array实例化) ---如果一个索引化的属性并不存在,那么他将会调用 DynaBean的indexed property getter/setter methods(比如 get(name, index) or set(name, index, value))返回一个List 或者一个Array实例。如果一个索引化的属性没有在DynaClass中被定义,那么他将会被自动添加而且生成一个默认的list实现的实例。
Lazy Map instantiation-------if a mapped property doesn't exist then calling the DynaBean's mapped property getter/setter methods (i.e. get(name, key) or set(name, key, value)) results in a new Map being instantiated. If the mapped property has not been defined in the DynaClass then it is automatically added and a default Map implementation instantiated.
Lazy Bean instantiation -------如果一个DynaClass 中的属性被定义成DynaBean 或者普通的bean,但是这个属性并不在DynaBean中存在,那么LazyDynaBean将会采用默认的empty constructor来实例化这个 bean
LazyDynaBean
标准lazy bean 的实现。默认和实现了MutableDynaClass接口的LazyDynaClass相关联---尽管他可以和MutableDynaClass的任何实现一起使用。例子如下:
DynaBean dynaBean = new LazyDynaBean();
dynaBean.set("foo", "bar"); // simple
dynaBean.set("customer", "title", "Mr"); // mapped
dynaBean.set("customer", "surname", "Smith"); // mapped
dynaBean.set("address", 0, addressLine1); // indexed
dynaBean.set("address", 1, addressLine2); // indexed
dynaBean.set("address", 2, addressLine3); // indexed
LazyDynaMap
light wieght (轻量级)DynaBean facade to a Map with all the usual lazy features。之所以是轻量级,是因为他没有和一个包含所有属性的DynaClass相关连。事实上,他亲自实现了DynaClass。一个LazyDynaMap可以用来包装一个存在的map,也可以自己去实例化一个Map实例
例如:
If you need a new Map then to use....
DynaBean dynaBean = new LazyDynaMap(); // create DynaBean
dynaBean.set("foo", "bar"); // simple
dynaBean.set("customer", "title", "Mr"); // mapped
dynaBean.set("address", 0, addressLine1); // indexed
Map myMap = dynaBean.getMap() // retrieve the Map or to use with an existing Map ....
Map myMap = .... // exisitng Map
DynaBean dynaBean = new LazyDynaMap(myMap); // wrap Map in DynaBean
dynaBean.set("foo", "bar");
LazyDynaClass
继承BasicDynaClass并实现MutableDynaClass接口。
Either create a LazyDynaClass first... MutableDynaClass dynaClass = new LazyDynaClass(); // create DynaClass dynaClass.add("amount", java.lang.Integer.class); // add property dynaClass.add("orders", OrderBean[].class); // add indexed property dynaClass.add("orders", java.util.TreeMapp.class); // add mapped property DynaBean dynaBean = new LazyDynaBean(dynaClass); // Create DynaBean with associated DynaClass
or create a LazyDynaBean and get the DynaClass... DynaBean dynaBean = new LazyDynaBean(); // Create LazyDynaBean MutableDynaClass dynaClass = (MutableDynaClass)dynaBean.getDynaClass(); // get DynaClass dynaClass.add("amount", java.lang.Integer.class); // add property dynaClass.add("myBeans", myPackage.MyBean[].class); // add 'array' indexed property dynaClass.add("myMap", java.util.TreeMapp.class); // add mapped property
注意:
MutableDynaClass 有一种受限(Restricted)属性。When the DynaClass is restricted ,no properties can be added or removed from the DynaClass. Neither the LazyDynaBean or LazyDynaMap will add properties automatically if the DynaClass is restricted.