ユーザ用ツール

サイト用ツール


java:s2dao

S2Dao

Seasar2のアスペクト機能を使ったDAOフレームワーク。インターフェースとビーンの定義だけでDAOを実装できる。

Linux上のMySQLでSQLエラー

Linux上のMySQLはテーブル名の大文字小文字を区別する。S2Daoによるテーブル名自動取得では大文字小文字を区別した正しいテーブル名が取得できないので、TABLEアノテーションでテーブル名を明示する。(S2DaoのバグかJDBCのバグ、あるいは複合バグらしい?よくわからない)

参考:不完全なSQLが生成される

環境:S2Dao 1.0.35 + MySQL 4.1 + Connector/J 5.0.3 + Tomcat 5.0.28

複数のデータソースを使う

DAO毎に別のデータソースを参照できる。

データソース毎に名前空間を切り、それぞれの名前空間下でデータソースコンポーネント作成し、DAOインターセプターを適用する。

参考S2Daoで複数データソースを使う その2

INSERT直後のid取得

以下のコードのように、INSERT直後にAuto Incrementで発行されたID値を取得するためには、メソッドにj2ee.requireTxアスペクトを適用する必要がある。トランザクションが効かないMyISAMでも必要。

class Sample {
    public void createHoge() {
        Hoge hoge = new Hoge();
        dao.insert(hoge);
        int id = hoge.getId();    // j2ee.requiredTxなしの場合、0。
    }
}

j2ee.requiredTxを適用するメソッドは、DAO自体のinsertでも、DAOの呼び出し元のcreateHogeでも良い。

参考:S2Dao+MySQLでIDアノテーションが設定できない

S2DaoTestCase

S2Daoに対するユニットテストを支援するツール

  • データベースにデータを入れてテストする。
  • テストデータをエクセル表で管理できる。
  • 予想結果もエクセルで管理可能。
  • DBを汚さずにDBテストが可能(テストメソッドにトランザクションを掛けて、テスト後に自動的にロールバックする。ただしMyISAMはトランザクションが無いのでデータが置き換わってしまう)

使い方

以下のデータを用意

  • テスト用データの入ったエクセルファイル
  • SELECT文の予想結果が入ったエクセルファイル(オプション)
  • テスト対象のDAOクラス
  • テストクラス

エクセルファイル

  • クラスパスに置く
  • シート一枚が1テーブルに対応

HogeDaoクラスのテストコード

// wait a minute.
public Class HogeDaoTest {
  private HogeDao dao;       // テストターゲット
 
  protected void setUp() {
    include("test.dicon");  // テストクラスと同じディレクトリにあればファイル名だけで良い(らしい)
  }
 
  /**
   * findAllメソッドのテスト 
   * テスト名の最後にTxを付けると、トランザクションが有効になる
   */
  public void testFindAllTx() {
    // テストデータをDBにインサート(setUpでコレをやらないのは、このテストメソッドがトランザクション境界だから!)
  readXlsAllReplaceDb("TestData.xls");
  
    // DAO実行
    List<Hoge> actual = dao.findAll();
 
    // 結果予想データをエクセルから読み込む
  DataSet expected = readXls("findAll_TestExpected.xls");
 
  // 比較、DataSetはListと直接比較可能。
    assertEquals(expected, actual)
 
    // テスト終了後、自動ロールバック
  }
}

Eclipse上で管理しているExcelファイルについて

ソースフォルダ上に設置しているExcelを変更したとき、クラスパス上のExcelファイルが更新されない場合がある。プロジェクトをCleanして、リビルドすると良い。

java/s2dao.txt · 最終更新: 2007/10/01 07:59 by 127.0.0.1