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

Struts2+MyBatis+Guiceを使ったアプリケーションの実装例その2です。
統括して全てのActionにトランザクションを設定するのではなく、特定の処理のみに設定する方法となります。

Springと異なり…

必要なところのみにトランザクションの設定を行いますが、基本的なトランザクション設定はMyBatisの定義を使います。

今のところトランザクション管理はJTA、JDBCから選択することができます。
今回は単純にJDBCを選択(ω・
JDBCの選択方法は次のように、enviromentの子要素にあるtransactionManager要素で設定します。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <settings>
    <setting name="defaultExecutorType" value="REUSE"/>
  </settings>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC">
      </transactionManager>
      <dataSource type="JNDI">
        <property name="data_source" value="java:comp/env/jdbc/localDB"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="./sqldefs.xml"/>
  </mappers>
</configuration>



JDBCで設定する=トランザクションの制御をコードで記述することになります。

旧来のJDBCの記述に近いですね

ActionクラスでDAOの設定をします。
Guice経由で取得します。

public class GuiceSampleAction extends ActionSupport {
  @Inject
  private SimpleDAO dao;

  @Action("")
  public String multi() throws Exception {
    dao.insert("testInsert_mysql", "struts2guice");
    return "success";
  }
}


…と、Actionクラスは非常に単純です。ではトランザクションのロールバック等を記述する場所はどこかと言うと、DAOクラスになります。

DAOクラス

Guice経由でMyBatisのインスタンスを取得します。
取得方法は前回の[Struts2.2.1+MyBatis3+Guice2.0を使った単純な実装例(1)]一緒です

@Singleton
public class SimpleDAO {

  Injector injector = Guice.createInjector(
      new XMLMyBatisModule.Builder()
        //.setClassPathResource("mybatis-config.xml")
        .create()

    );
  SqlSessionManager sessionManager = 
    injector.getInstance(SqlSessionManager.class);

public void sample() throws Exception {
    try {
      sessionManager.insert("testInsert_mysql", "first");
      sessionManager.insert("testInsert_mysql", "second");
      sessionManager.insert("testInsert_mysql", "third");

      sessionManager.commit();
    } catch (Exception e) {
      session.rollback();
      throw e;
    }
  }
}



…そう、try~catchで囲い、commit()、rollback()でトランザクションの操作を行う方法です。Springのトランザクション境界設定では、メソッド名の正規表現で一致するメソッドにのみトランザクション管理を自動的に行う設定を行いましたが、Guiceで一番単純な実装方法として、この旧来の方法で可能になります。

また、単一SQLを投げる場合や検索処理であれば、毎回トランザクション設定で処理を囲む理由はありませんので、try~catchは不要です。

どちらも一長一短ではありますが、簡単に実装するのであればこの程度の記述で問題ありません。

しかしSpringのように統括した設定をしたい場合は…?

これは次回以降の予定ですが、次の2通りの方法があります。
・JTAを使った設定にする
・ActionとDAOに中間クラス層を設定し、そのクラスでトランザクション管理をします(try~catchを実際に行う共通層で全て行う)



loading...