0

好吧,我有这个方法,我不确定如何处理它的一部分,它是评论以感叹号开头的地方:“// !!!!这是我关心的部分......”

public Person getPersonFromRS(ResultSet rs) throws SQLException, NoSuchMethodException,
    IllegalAccessException, IllegalArgumentException, InvocationTargetException
{
  Person person = new Person();

  // getting the fiels and methods of the class Person
  Field[] fields = person.getClass().getDeclaredFields();
  Method[] methods = Person.class.getClass().getDeclaredMethods();
  String setter = "set";

  // just ignoring these fields of the class
  for (Field field : fields) {
    if (field.getName().equals("nul") || field.getName().equals("pairMarriages")
        || field.getName().equals("pairMarriage_Date") || field.getName().equals("pairBiography")) {
      continue;
    }

    // getting the value from resultSet as string
    String value = "";
    try {
      value = rs.getString(field.getName());
    } catch (Exception e) {
      System.err.println("Error with getting the column " + field.getName() + " from database");
      continue;
    }

    // if value is not null and the string inside not NULL, set the value to the person
    if (!(value == null))
      System.out.println("THE RETRIEVED VALUE: " + value);

    if ((!(value == null)) && !value.equals(nul)) {
      // methodName = setParameter
      String methodName = setter + field.getName();
      System.out.println("\nmethod Name: " + methodName);

      Method method = null;
      try {
        System.out.println("The field type is " + field.getType());
        method = person.getClass().getDeclaredMethod(methodName, field.getType());
      } catch (Exception e) {
        System.err.println(e);
        continue;
      }

      // !!!! this is the part that concerns me, what's the best way to handle this part in order
      // to avoid this flood for every type?
      // determining the type of the value to set in
      Type type = field.getType();
      if (field.getType() == String.class) {
        method.invoke(person, value);
      } else if (field.getType() == long.class) {
        method.invoke(person, Long.parseLong(value));
      } else if (field.getType() == int.class) {
        method.invoke(person, Integer.parseInt(value));
      } else if (field.getType() == PersonDate.class) {
        PersonDate date = new PersonDate(value);
        method.invoke(person, date);
      }
    }
  }
  return person;
}

有没有一种最佳的方法来做到这一点,而不是像这样处理每一个参数类型?我的意思是这对我来说似乎是开销?

4

2 回答 2

1

您可以先从ResultSet. 这map包含具有相应值的列名。

Map<String, String> map = new HashMap<>();
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
for (int column = 1; column <= columnCount; column++) {
    map.put(metaData.getColumnName(column), rs.getString(column));
}
return map;

然后您可以将其map用于. 这将需要使用类的方法,它是Apache Commons BeanUtils的一部分。populatePersonpopulateBeanUtils

Person person = new Person();
BeanUtils.populate(person, map);

这个类有:

通过反射填充 JavaBeans 属性的实用方法。

您可以根据需要修改查询以填充所需的字段。

于 2012-05-11T16:21:08.967 回答
1

switch 语句会更干净,但除非你想加入真正的 ORM 解决方案,如 JDO、JPA、hibernate 等等……你将不得不这样做。你有什么顾虑?如果你说“开销”是指 CPU 周期,那么你应该更关心你正在做的所有反射,而不是一堆 if/else 语句。如果您关心的是维护,是的,这将是很多代码。也就是说,如果您只映射十几种类型......这并不是什么大问题。除了使用现成的 ORM 工具之外,这里实际上没有任何捷径。

于 2012-05-11T16:13:36.020 回答