2014-07-05 73 views
0

我在Java中的方法从数据库解析结果泛型集合

ArrayList<Object> nodeList = new ArrayList<Object>(); 

public void parseResults() throws SQLException, ListEmptyException, NoRecognisableCharacterException{ 
//  parses records from a query. ONLY ONE COLUMN 
    while(getResultSet().next()){  
     for(int i = 1; i <= getNumberOfColumns(); i++){ 
      switch(getColumnType()){ 
//According to the datatype, I call the proper method get[DataType] of resultSet 
       case 0:throw new ListEmptyException(); 
       case 4:nodeList.add(getResultSet().getInt(i));break; 
       case 12:nodeList.add(getResultSet().getString(i).trim());break; 
       default:throw new NoRecognisableCharacterException(); 
      } 
     } 
    } 
} 

我被告知不要使用ArrayList<Object>存储不同类型的数据分析一些数据。我必须创建一个实体来解析相应的数据类型。我不想为每种数据类型重载方法(有很多),既不创建单独的类,只改变一个方法get[DataType],也不让switchfor循环内循环,也不根据数据类型具有多个NodeList实例。有没有办法让这种方法适用于每种数据类型?仿制药应该在那种情况下做?先谢谢你。

+0

我不确定我是否理解你的想法,但处理/解析来自数据库的不同数据的正确方法是对从不同表格加载的不同数据使用单独的类。这里的过度统一失败了目的,并没有帮助,也没有使你的代码清洁。 – rossa

回答

1

你可以用你的ResultSet对象,一类是这样的:

public class ObjectWrapper implements Wrapper { 
    private Object wrappedObject; 

    public ObjectWrapper(Object wrappedObject) { 
     this.wrappedObject = wrappedObject; 
    } 

    @SuppressWarnings("unchecked") 
    public <T> T unwrap(Class<T> paramClass) { 
     return (T) wrappedObject; 
    } 

    public boolean isWrapperFor(Class<?> paramClass) { 
     return paramClass.isInstance(wrappedObject); 
    } 

    public static Wrapper wrap(ResultSet rs, int column, int columnType) throws SQLException { 
     if (columnType == 0) { 
      return new EmptyListExceptionWrapper(); 
     } else { 
      return new ObjectWrapper(rs.getObject(column)); 
     } 
    } 
} 

和一个类来管理例外:

public class EmptyListExceptionWrapper implements Wrapper { 
    @Override 
    public <T> T unwrap(Class<T> paramClass) throws SQLException { 
     return null; 
    } 

    @Override 
    public boolean isWrapperFor(Class<?> paramClass) throws SQLException { 
     return false; 
    } 
} 

然后你有一个

ArrayList<Wrapper> wrapper = new ArrayList<Wrapper>; 

您的代码将是:

while(getResultSet().next()){  
    for(int i = 1; i <= getNumberOfColumns(); i++){ 
     wrappers.add(ObjectWrapper.wrap(getResultSet(), i, getColumnType())); 
    } 
} 
+0

这正是我正在寻找的!但是,它会返回像'dataBaseConnection.ObjectWrapper @ 179d3b25'这样的名字......我该如何修复它? –

+0

您应该重写toString方法。 –

+0

所有这些包装类对我来说都是全新的......你会如此善意告诉我如何重写'toString()'方法到这个? –