2012-07-19 81 views
3

請耐心等待新手問題,因爲我試圖同時學習MyBatis和java。我有一個應用程序,我需要使用線程安全變量。基於一些研究以及我如何使用應用程序的想法,我已經在Vector上定義了CopyOnWriteArrayList。MyBatis SelectList輸出CopyOnWriteArrayList

當我從mybatis sql會話中調用selectList時,有什麼辦法來告訴它創建CopyOnWriteArrayList作爲它的返回而不是ArrayList?無可否認,我的配置代碼是兩行而不是一行,但是我的一些內容表明,有一個更好的方法和/或我不是第一個遇到這個問題的人。

List<Team> teams = session.selectList("getTeamsByGameID", gameID); 
List<Team> arrayListReturn = new CopyOnWriteArrayList<Team>(teams); 
return arrayListReturn; 

由於提前,

回答

6

我知道有兩種方式來處理這個問題。

選項1:使用Mapper類並指定List返回的類型。

定義映射接口:

public interface TeamMapper { 
    CopyOnWriteArrayList<Team> getTeamsByGameID(); 
} 

你的XML映射文件保持不變。代碼來執行所述查詢變更:

TeamMapper m = session.getMapper(TeamMapper.class); 
List<Team> lt = m.getTeamsByGameID(); 
System.out.println(lt.getClass()); 
    //=> prints out "class java.util.concurrent.CopyOnWriteArrayList" 


選項2:創建ResultHandler並傳遞到session.select()方法。

這裏使用ResultHandler接口。該界面要求您覆蓋一個方法,即handleResult,在查詢過程中會給出每個從數據庫返回的結果。

在你的情況,你的ResultHandler看起來是這樣的:

public class TeamResultHandler implements ResultHandler { 

    private List<Team> teams = new CopyOnWriteArrayList<Team>(); 

    @Override 
    public void handleResult(ResultContext rc) { 
    countries.add((Team) rc.getResultObject()); 
    } 

    // provide a getter so you can retrieve it when finished 
    public List<Team> getTeamList() { 
    return teams; 
    } 
} 

而不是使用selectList如你在上面做,你現在會用session.select(String, ResultHandler),像這樣的:

TeamResultHandler rh = new TeamResultHandler(); 
session.select("getTeamsByGameID", rh); 
List<Team> lt = rh.getTeamList(); 
return lt; 

這解決方案比解決方案更冗長(需要額外的類和三行代碼,而不是2),但它只創建一個List,而不是兩個,因此您必須決定哪個最適合您的需求。

此外,ResultHandlers可用於其他事情 - 確保結果按特定方式排序或篩選或其他內容,以防萬一需要。

+0

真的很感激你花時間把這些例子放在一起。我以前見過結果處理程序,但不知道如何使用它。我偶爾無法在MyBatis文檔中找到所需的所有東西。 – 2012-07-24 14:45:10

+0

我發現學習MyBatis的最好方法是做它的各種功能的小例子,然後在面對「我怎麼......?」時保持這些代碼片段的方便。的問題。 MyBatis用戶指南概述了可能性,但並不總是顯示如何使用每個功能。爲此我創建了一組「MyBatis Koans」。如果你不想做koans,你可以看看koan的內容,然後跳到完成的koans,看看如何使用某些功能。鏈接:https://github.com/midpeter444/mybatis-koans – quux00 2012-07-24 22:22:29