我们使用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));
这里偷个懒,不重新生成压缩包了。
阅读(2715) | 评论(0) | 转发(0) |