3

MyBatisとjavaを同時に学習しようとしているので、初心者の質問には我慢してください。スレッドセーフ変数を使用する必要があるアプリケーションがあります。いくつかの調査とアプリケーションの使用方法に関する私の考えに基づいて、Vector上でCopyOnWriteArrayListを決定しました。

mybatis sqlセッションからselectListを呼び出すとき、ArrayListではなくCopyOnWriteArrayListを戻り値として作成するように指示する方法はありますか?確かに、これを構成するための私のコードは1行ではなく2行ですが、私の中にはもっと良い方法が必要だと言われている、および/または私がこれに遭遇した最初の人ではありません。

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

前もって感謝します、

4

1 に答える 1

7

これを処理する2つの方法を知っています。

オプション 1 : Mapper クラスを使用し、そこに返される List のタイプを指定します。

Mapper インターフェースを定義します。

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このインターフェイスでは、クエリの進行中にデータベースから返される各結果が与えられる1 つのメソッドをオーバーライドする必要があります。

あなたの場合、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 行ではなく 3 行が必要です) が、2 つではなく 1 つのリストしか作成しないため、ニーズに最も適したものを決定する必要があります。

さらに、ResultHandlers は、必要に応じて、結果を特定の方法で並べ替えたり、フィルター処理したり、その他の方法で確実に並べ替えたりするなど、その他の用途にも役立ちます。

于 2012-07-21T21:34:22.330 に答える