今回は、まじめにメモをとったのはDomaだけ。
いやーDomaすごいっす。よく分からないままふらっと入ったけど、非常に面白い。
というわけで、メモを貼り付けておきます。
次世代DaoフレームワークDoma
Domain指向 "Domain"=値の定義域(DB的なドメイン) 引数全部Stringとか、型で情報を表せてないよね String orderNo, String customerName, ... ↓ OrderNumber orderNo, CustomerName customerName, ..... 「振る舞いはエンティティに持たせればよい」というが、エンティティよりもプロパティに持たせた方が、よりDRYにできる! StringDomain<T>を継承して独自ドメインクラスを定義する public class OrderNumber extends StringDomain<OrderNumber> #Generics使いまくり。コード読んだら勉強になりそう。後で読む。 エンティティはインタフェースで!挑戦的。 Daoは @Daoをクラスにつけて、メソッドには@Select, @Insertなどをつける 命名規約という暗黙の了解を避けて、アノテーションによる明示を行う aptで自動生成されるインタフェース名にひげを生やした(接尾辞"_")クラス名をnewするだけでOK. Daoが作るSQLは、変更されたプロパティだけが含まれる 旧世代 黒魔術師が支配する暗黒の世界 AOP(バイトコードエンジニアリング) 命名規約 簡単なモノなら良いが、覚えきれないほどの量になると・・・ 次世代 脱黒魔術 ソースコードの通りに動く 自動生成のメリットは享受する デバッグしやすい エラーが起きてもわかりやすい 白魔術=apt Jav6から導入されたアノテーション処理のためのAPI コンパイル時に、↓が実現できる ソースの生成・検証 リソースの参照・生成 魅力 コンパイル時に自動的に実行される JavaのSDK標準のため、EclipseでもjavacでもOK エラーはコンパイル時に検出できる どうさせる前に気づける 実行時の負荷が軽減できる 動的にメタ情報解析する旧来の黒魔術ではパフォーマンスが不利 デモ #すごすぎる・・・ Domaが求める規約違反をコンパイル時に検出できる コンパイル時にSQLファイルの有無や、パラメタ名の名前誤りがすぐに検出できる 検出されたエラーは、Eclipseのマーカが設定される #emp.name()などのエンティティ命名規約の場合、既存のJavaBeanフレームワークでプロパティとしてアクセスできなくて不便だったりしそう。getName()と書くことはできる? →と思ったら、後述のようにDTO変換で対策済み。 戦略 依存ライブラリなし!!! Domaだけあればよい newするだけでOK。DI不要 Daoパターン S2JDBCはDaoパターンを捨てたけども、やはりDaoはわかりやすい メソッドとSQLが1対1 メンテしやすい テストしやすい Mockが作りやすい SQLファイル 検索SQLの自動生成はない。意図的。自分でSQLファイルに書く。 更新SQLは自動生成。SQLファイルで書いても良い。 キャッシュ メモリ圧迫可能性があるのでキャッシュは避けるべき デフォルトでキャッシュするのはSQLの解析結果のみ プラガブルな構成 ネーミング規約 データベース方言 JavaBeansへのアクセス方法 POJOじゃないのでJavaBeanフレームワークで使えない JvaBeans(DTO)へ変換する方法を提供している DTOの自動生成と、ConvertのためのUtilがある ドメインとDB型のマッピング SQLのログ出力とフォーマット方法 まとめ 値型よりもリッチなクラス(Domain)にメリットがある aptで脱黒魔術 Doma=aptを活用したDaoフレームワーク Q&A トランザクションは? Domaでは対応しない。外側で。 Seasarと連携しているDomaのサンプルがあるので、参考までに。 実績は? 全くないです。 SpringでDomaのDaoを使うには? アンスコ付きのクラスがImpl相当。生成されたクラスをDIコンテナに登録すればOK アンスコを"Impl"に変更することもできる SQLの解析レベルは? 厳密にはやっていない。標準準拠などはしてない。 関連のサポートは? していない。S2Daoのように一発でフラットにとるように考えている。 SQLでJOINしてフラットに取得する。 Domaとしては、テーブルに対応しててもしていなくても全部@Entityをつける前提で考えている。 誤ったデータに対するチェックはどのタイミングで? DBからデータをとるときも、サービスで設定するときも、setterが使われる。 そこでバリデーションすればOK 共通要素はどこで定義する?エンティティは継承できる? 継承ではなく、マップドスーパークラスというのが使える。