学习笔记-刘伟javabean视频教程(下部)

学习笔记-刘伟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.


你可能感兴趣的:(学习笔记-刘伟javabean视频教程(下部))