LazyDynaBean
它实现一个动态的Bean,可以直接往里面加入属性,作为一个JavaBean一样使用,也可以用上面的BeanUtils或get/set方法进行操作,而不用事先定义一个标准的JavaBean类.
记得在J2ee设计模式中有一种Value Object的模式,用于在MVC各层之间传递数据,避免直接传递大业务对象引起的性能问题,为了避免在项目中出现很多Bean类,在书中提供了一个动态Value Object的实现(通过扩展Map)。
这里LazyDynaBean则可以作为一种更加成熟、稳定的实现来使用。
//这里使用LazyDynaMap,它是LazyBean的一个轻量级实现 LazyDynaMap dynaBean1 = new LazyDynaMap(); dynaBean1.set("foo", "bar"); // simple dynaBean1.set("customer", "title", "Mr"); // mapped dynaBean1.set("address", 0, "address1"); // indexed System.out.println(dynaBean1.get("address",0)); Map myMap = dynaBean1.getMap(); // retrieve the Map System.out.println(myMap.toString());
上面的例子可以看到,它可以在set时自动增加bean的property(既赋值的同时增加Bean中的property),
同时也支持3中类型的property,并且LazyDynaMap还可以导出为map。
对于这个类还有两个重要的Field要注意:
(1) returnnull——指定在get方法使用了一个没有定义过的property时,DynaBean的行为。
//设为ture。若Bean中没有此字段,返回null,默认为false。若Bean中没有此字段,自动增加一个
dynaBean1.setReturnNull(true);
System.out.println(dynaBean1.get("aaa"));//此时返回null
(2) Restricted——指定是否允许改变这个bean的property
//默认为false,允许增删和修改
dynaBean1.setRestricted(true);
dynaBean1.set("test","error");//这里会出错!
通过设置这两个属性,可以防止意外修改DynaBean的property。在设计架构时,你可以在后台从数据表或xml文件自动产生DynaBean,在传到控制层和表示层之前设置上述属性使其Bean结构不允许修改,如此就不可能无意中修改Bean包含的属性……这样既可以享用它的便利,有可以防止由此引入的错误可能。
以下附上上几个 LazyDynaBean 的使用示例:
(1)普通bean
import java.util.GregorianCalendar; import org.apache.commons.beanutils.LazyDynaBean; import org.apache.commons.beanutils.BeanUtils; public class BeanUtilsExample2 { //动态创建属性 public static void main(String args[]) throws Exception { LazyDynaBean hh = new LazyDynaBean(); hh.set("country", "中国"); hh.set("city", "北京"); hh.set("postCode", "100120"); hh.set("addr", "aaaaaaa"); LazyDynaBean bb = new LazyDynaBean(); bb.set("phone", "home", "11011011"); bb.set("phone", "office", "111111"); bb.set("email", "[email protected]"); bb.set("address", 0, hh); bb.set("birthDate", new GregorianCalendar(1990, 3, 29).getTime()); LazyDynaBean tt = new LazyDynaBean(); tt.set("userId", new Long(8888888)); tt.set("gggg", "施杨"); tt.set("password", "sgsgsgsg"); tt.set("dddd", bb); System.out.println(BeanUtils.getProperty(tt, "gggg")); System.out.println(BeanUtils.getProperty(tt, "dddd.birthDate")); System.out.println(BeanUtils.getProperty(tt, "dddd.address[0].addr")); System.out .println(BeanUtils.getProperty(tt, "dddd.phone(office)")); } }
(2)、连接Mysql数据库
import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Iterator; import org.apache.commons.beanutils.DynaBean; import org.apache.commons.beanutils.ResultSetDynaClass; public class BeanUtilsExample3 { public static void main(String args[]) throws Exception { Connection conn = getConnection(); PreparedStatement ps = conn .prepareStatement("select id,title,time from guestbook2 order by id desc"); ResultSet rs = ps.executeQuery(); ResultSetDynaClass rsdc = new ResultSetDynaClass(rs);//重点,二次封装,对连接对象有依赖 Iterator itr = rsdc.iterator(); while (itr.hasNext()) { DynaBean bean = (DynaBean) itr.next(); System.out.print(bean.get("id") + "\t"); System.out.print(bean.get("title") + "\t"); System.out.println(bean.get("time")); } conn.close(); } private static Connection getConnection() { String url = "jdbc:mysql://localhost:3306/guestbook"; String username = "root"; String password = "hicc"; Connection conn = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(url, username, password); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } }
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Iterator; import org.apache.commons.beanutils.DynaBean; import org.apache.commons.beanutils.RowSetDynaClass; public class BeanUtilsExample4 { public static void main(String args[]) throws Exception { Connection conn = getConnection(); PreparedStatement ps = conn .prepareStatement("select id,title,time from guestbook2 order by id desc"); ResultSet rs = ps.executeQuery(); RowSetDynaClass rsdc = new RowSetDynaClass(rs); //重点,与ResultSetDynaClass的区别 conn.close();//重点,关闭连接后仍能读取 Iterator itr = rsdc.getRows().iterator(); while (itr.hasNext()) { DynaBean bean = (DynaBean) itr.next(); System.out.print(bean.get("id") + "\t"); System.out.print(bean.get("title") + "\t"); System.out.println(bean.get("time")); } } private static Connection getConnection() { String url = "jdbc:mysql://localhost:3306/guestbook"; String username = "root"; String password = "hicc"; Connection conn = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(url, username, password); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return conn; } }