Seasar2のアスペクト機能を使ったDAOフレームワーク。インターフェースとビーンの定義だけでDAOを実装できる。
Linux上のMySQLはテーブル名の大文字小文字を区別する。S2Daoによるテーブル名自動取得では大文字小文字を区別した正しいテーブル名が取得できないので、TABLEアノテーションでテーブル名を明示する。(S2DaoのバグかJDBCのバグ、あるいは複合バグらしい?よくわからない)
環境:S2Dao 1.0.35 + MySQL 4.1 + Connector/J 5.0.3 + Tomcat 5.0.28
DAO毎に別のデータソースを参照できる。
データソース毎に名前空間を切り、それぞれの名前空間下でデータソースコンポーネント作成し、DAOインターセプターを適用する。
以下のコードのように、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に対するユニットテストを支援するツール
以下のデータを用意
エクセルファイル
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) // テスト終了後、自動ロールバック } }
ソースフォルダ上に設置しているExcelを変更したとき、クラスパス上のExcelファイルが更新されない場合がある。プロジェクトをCleanして、リビルドすると良い。