| public static Row fromValueObject(Object vo) throws Exception { Row row = new Row(); Class type = vo.getClass(); //得到Class用于进行反射处理 Field[] fields = type.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { String name = fields[i].getName(); String methodName = "get" + Character.toUpperCase(name.charAt(0)) + name.substring(1); Method method = type.getMethod(methodName, new Class[] {}); Object value = method.invoke(vo, new Object[] {}); String nameInRow = toInRowName(name);//在此进行值对象中的名称向行对象中的名称转换 row.put(nameInRow, value); } return row; } /** * 将值对象中属性名转换成对应的行对象中的字段名(因为行对象中的字段名 * 在更新数据库时必须与数据库表中字段名完全匹配) * 一般规则为 fsiId ---> fsi_id(现在假设的情况是如果出现有两个单词 * 以上的值对象属性名则数据库表中的字段名一定是有下划线的) * @param voName * @return */ public static String toInRowName(String voName) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < voName.length(); i++) { //遍历voName如果有大写字母则将大写字母转换为_加小写 char cur = voName.charAt(i); if (Character.isUpperCase(cur)) { sb.append("_"); sb.append(Character.toLowerCase(cur)); } else { sb.append(cur); } } return sb.toString(); } } |
Row对象中用了一个HashMap对象存放着对应数据库表中的字段名和对应值,由于Map对象的无序性,所以用了一个vector(当然也可以用List代替)来存放字段名(按用户添加的顺序)这样就可以提供get(int i)方法来顺序取得Map中的值了。要注意的是三个静态辅助方法toValueObject,fromVauleObject,toInRowName。toValueObject方法用于将一个行对象转换为值对象方法中利用了Java的多态和反射机制(请大家参考反射API)。FromValueObject是上一个方法的逆操作,toInRowName方法是实现值对象中的属性名向数据库表中字段名的转换,因为一般在数据库建表时是用的这种形式stu_id,而Java中JavaBean的属性是这样的stuId。
RowSet的代码如下:
| package com.gdrj.util.database; import java.util.*; public class RowSet { private Vector vector = new Vector(); public RowSet() { |
|