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());
//这里使用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", "sh@126.com");
- 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)"));
- }
- }
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", "sh@126.com");
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.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;
- }
- }
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;
}
}