[ 2751 ] Struts2.2.1+MyBatis3+Guice2.0を使った単純な実装例(1)

タイトル通りです。Struts2にて、Guiceを使ったMyBatis利用例となります。

Struts2にはGuiceプラグインがありますが…

Struts2.2.1で利用できるよう、新たにプラグインがリリースされています。maven2経由でモジュールを取得する場合には、guice-struts2-pluginの2.0を指定します。

<project …>
  …(略)…
  <dependencies>
    <dependency>
      <groupId>com.google.inject.extensions</groupId>
      <artifactId>guice-struts2-plugin</artifactId>
      <version>2.0</version>
      <type>jar</type>
      <scope>compile</scope>
      <exclusions>
        <exclusion>
          <artifactId>xwork</artifactId>
          <groupId>opensymphony</groupId>
        </exclusion>
      </exclusions>
    </dependency>
  </dependencies>
</project>


guice-struts2-plugin.2.0をビルドする際、依存ライブラリにxwork-2.0.0が含まれています。Struts2.2.1ではxwork-core2.2.1が既に存在していますので、ライブラリのインポート除外設定をしています。

DAOクラス=MyBatisを利用

まずはDAOです。このクラスにて、MyBatisを利用してクエリを発行します。もちろんMyBatisへの設定を読み込ませることもします。

// guice
@Singleton
public class DAO {

  Injector injector = Guice.createInjector(
    new XMLMyBatisModule.Builder()
      // XMLMyBatisModuleはXMLからMyBatisの設定を読み込むビルダーです。
      // リソースを指定しない場合、クラスパス直下にある
      // mybatis-config.xmlを読み込みます。
      //.setClassPathResource("mybatis-config.xml")
      .create()
  );
  SqlSessionManager sessionManager = 
    injector.getInstance(SqlSessionManager.class);

  public void delete(String sqlid, Object param) throws Exception {
    sessionManager.delete(sqlid, param);
  }

  public void insert(String sqlid, Object param) throws Exception {
    sessionManager.insert(sqlid, param);
  }

  @SuppressWarnings("unchecked")
  public List<Object> select(String sqlid, Object param)
      throws Exception {
    return sessionManager.selectList(sqlid,param);
  }
…(省略)…
}


クラスの先頭部分にて、GuiceのInjector経由でMyBatisの設定読み込みを行っています。Guice-MyBatisプラグインにはXMLを利用しないで設定できる機能もあります。今回は従来のiBATIS同様に、XMLから設定やSQLをバインドするようにします。

設定の読み込ませ方は非常に単純で、Guice用に作成されたMyBatisのビルダー:XMLMyBatisModule.builder()内にて設定します。

ビルダー:Guice経由でクラス生成する方法を指示するクラス


設定ファイルの場所はsetClassPathResource()で指定します。デフォルトではクラスパス直下のmybatis-config.xmlになります。
トランザクションに関しては、今回は単純な実装ということもあり、次のような制限になっています。

・DAOの1メソッド
=コンテナからコネクションを取得する単位
=トランザクション境界はDAOの1メソッド

ActionクラスにDAOを注入する

Struts2のActionクラスは、至極単純でして…

public class GuiceSampleAction extends ActionSupport {
  private static Logger log = Logger.getLogger(GuiceSampleAction.class);

  // guice
  @Inject
  private DAO dao;

  /**
   * 今回のクラス構成ではdaoにトランザクション境界があるので
   * daoのメソッドが終わるたびにコミットされます。
   * @return
   * @throws Exception
   */
  @Action("insert")
  public String insert() throws Exception {
    log.debug("-- first");
    dao.insert("testInsert_mysql", 128);

    return "success";
  }
}


DAOに対して、Guice経由で取得するよう @Inject を追加するだけ です。
これだけでいいんですねぇ(ω・

サンプルプロジェクト

構築してしまうと非常に単純ではありますね d(ω・
サンプルコードをアップロードしておきますので、感想などをTwitterでいただけると中の人がすごく喜びます。

mybatisGuiceSample.zip

複数のクエリーを1トランザクションにする場合の設定は、また後日ヾ(ω・



loading...