Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3252008
  • 博文数量: 530
  • 博客积分: 13360
  • 博客等级: 上将
  • 技术积分: 5473
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-13 13:32
文章分类

全部博文(530)

文章存档

2017年(1)

2015年(2)

2013年(24)

2012年(20)

2011年(97)

2010年(240)

2009年(117)

2008年(12)

2007年(8)

2006年(9)

分类:

2010-02-20 12:03:37

    我们使用DWRUtil本来就是为了图个方便,就象下面代码一样
     List results = (List) qr.query(conn,"SELECT id,username,gender FROM t_user",new BeanListHandler(TUser.class));

    大家都知道,如果数据库中的字段值为null,读取到Javabean后,则对应的属性值也为null,如果使用时不加检测,会引发异常,通常这个异常是会被程序员忽视。

    DWRUtil为我们提供了以下方法进行检测:
        try {
             Class.forName("com.mysql.jdbc.Driver").newInstance();
             conn = DriverManager.getConnection(url, user, pswd);
 
             MapListHandler mlh = new MapListHandler() {
                     public Object handle (ResultSet rs) {
                         SqlNullCheckedResultSet wrapper = new
 SqlNullCheckedResultSet(rs);
                         wrapper.setNullString("--n/a--");
                         wrapper.setNullDate(today);
                         rs =
 ProxyFactory.instance().createResultSet(wrapper);
                         Object returnVal = null;
                         try {
                             System.out.println("*** HERE ***");
                             returnVal = super.handle(rs);
                         } catch (Exception e) {
                             System.out.println(e.getMessage());
                         }
                         return returnVal;
                     }
                 };
 
             QueryRunner run = new QueryRunner();
             List result = (List) run.query(conn, query, mlh);
             Iterator it1 = result.iterator();
             while (it1.hasNext()) {
                 Map map = (Map) it1.next();
                 Set keys = map.keySet();
                 Iterator it = keys.iterator();
                 while (it.hasNext()) {
                     String key = (String) it.next();
                     System.out.println(key + ": " + map.get(key));
                 }
                 System.out.println();
             }

     这个程序代码也变得很复杂了,而且程序变成也不是很清晰,通过对DWRUtil源代码的跟踪调试,发现BeanProcessor.java类的195-210行的代码功能为:通过反射机制,将rs中的值赋给javabean对象。

    for (int i = 1; i < columnToProperty.length; i++) {
            if (columnToProperty[i] == PROPERTY_NOT_FOUND) {
                continue;
            }
            PropertyDescriptor prop = props[columnToProperty[i]];
            Class propType = prop.getPropertyType();

            //根据属性名propType,从rs读取相应的值,赋给value
            Object value = this.processColumn(rs, i, propType);

            //如果属性名propType不为空,value值为null,且该属性类型为基本类型,则赋初值
              基本类型为
              java.lang.Boolean
              java.lang.Character
              java.lang.Byte
              java.lang.Short
              java.lang.Integer
              java.lang.Long
              java.lang.Float
              java.lang.Double
              java.lang.Void

            if (propType != null && value == null && propType.isPrimitive()) {
                value = primitiveDefaults.get(propType);
            }
            //红色部分为本人添加,即如果propType为String,且value值为null,则赋初值为空字符串
            else if(propType != null && propType.getName().equals("java.lang.String") && value == null)
                value="";

            this.callSetter(bean, prop, value);
        }

    大家到apache官方网站上下一个源代码commons-dbutils-1.3-src.zip,解压缩后,将目录org中的所有java源代码复制到自己的项目中,修改以上代码即可。开发的时候,就可以继续写如下代码,不用担心属性值为null了。
       List results = (List) qr.query(conn,"SELECT id,username,gender FROM t_user",new BeanListHandler(TUser.class)); 
   
    这里偷个懒,不重新生成压缩包了。


阅读(2643) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~