2014-07-05 77 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()'方法到這個? –