SlideShare a Scribd company logo
次世代 Dao フレームワーク Doma 2009 年 9 月 12 日 中村年宏 (http://d.hatena.ne.jp/taedium)
自己紹介 中村 (taedium) http:// d.hatena.ne.jp/taedium S2Container 、 S2Dao 、 Slim3 のコミッタ S2JDBC-Gen コードジェネレーション データベースリファクタリング S2Dao 高速化対応(データベースのメタデータを不要に) Slim3-Gen apt と ant によるコードジェネレーション JPA の入門書執筆 Seasar2 と Hibernate で学ぶ JPA 入門
アジェンダ Doma の概要 apt Doma の戦略 ロードマップとまとめ
アジェンダ Doma の概要 apt Doma の戦略 ロードマップとまとめ
Doma とは? Domain Oriented MApping framework ドメイン指向マッピングフレームワーク ドメインとは? 値の定義域(値がとりうる範囲)のこと、またはそれを表すクラス 体重:  0 から 500 の数値、単位は kg  ->  Weight クラス 都市名 :アルファベットの文字列 ->  CityName クラス Dao フレームワーク S2Dao 、 S2JDBC 、 Hibernate のよいところを取り入れた O/R マッパー データベースの型とドメインをマッピング、ドメインを String や Integer など一般的な値型にマッピング SQL ファイルの実行と、 SQL の自動生成の 2 パターンに対応 ただし、検索系は SQL ファイルの実行のみ
Doma を利用した構成 address dept emp BusinessLogic ( データの利用者 ) AddressDao DepartmentDao EmployeeDao update insert select Doma SQL EMPLOYEE DEPARTMENT ADDRESS emp 、 dept 、 address はエンティティのインスタンス(ドメインの集合) SQL の生成 SQL ファイルの解析 SQL の発行 DB
ドメインの利点 – タイプセーフ public   void  execute( String  orderNo,  String  customerName,      String  phoneNumber,  String  location,  String  description) {      ... } public   void  execute( OrderNo  orderNo,  CustomerName  customerName,      PhoneNumber  phoneNumber,  Location  location,       Description  description) { ... } ドメインを使わない場合(値型を使用する場合) ドメインを使う場合
ドメインの利点 – 振る舞い String phoneNumber =  "03-1234-5678" ; int areaCode =  PhoneNumberUtil.getAreaCode (phoneNumber); PhoneNumber phoneNumber = new PhoneNumber( "03-1234-5678" ); int areaCode =  phoneNumber.getAreaCode (); ドメインを使わない場合(値型を使用する場合) ドメインを使う場合 Employee id phoneNumber ... Department id phoneNumber ... 振る舞いはエンティティにもたせればいいという考え方があるが、エンティティよりもプロパティにもたせた方がコードの重複が少ない。 同じドメインは複数のエンティティにまたがって使われるため。
ドメインの定義 public   class  PhoneNumber  extends  StringDomain<PhoneNumber> { private   static   final   long   serialVersionUID  = 1L; public  PhoneNumber() { } public  PhoneNumber(String value) { super (value); } public   int  getAreaCode() { ... } } 値型に対応する抽象ドメインクラスを継承して作成。 public なデフォルトコンストラクタが必要。 任意のメソッドをもてる。 必要に応じて定義域をバリデーション。
ドメインのインタフェース public   interface  Domain<V, D  extends  Domain<V, D>> { V get(); void  set(V value); void  setDomain(D other); boolean  isNull(); boolean  isChanged(); void  setChanged( boolean  changed); Class<V> getValueClass(); <R, P, TH  extends  Throwable> R accept(DomainVisitor<R, P, TH> visitor, P p) throws  TH, DomaNullPointerException; } PhoneNumber phoneNumber =  new  PhoneNumber(); phoneNumber.set( &quot;03-1234-5678&quot; ); String value = phoneNumber.get(); PhoneNumber copy =  new  PhoneNumber(); copy.setDomain(phoneNumber); 利用例 ジェネリクスを活用しタイプセーフを実現。
エンティティの定義 @Entity public   interface  Employee {      @Id      Identity id();      Name name();      Salary salary();      @Version      VersionNo version(); } インタフェース! @Entity が必須。 プロパティはフィールドではなくメソッドで定義。 getter/setter が不要で簡潔。 プロパティはもちろんドメインクラス。 アノテーションの名前は JPA にあわせているが、すべて org.seasar.doma のパッケージに属する。
Dao の定義 @Dao (config = AppConfig. class ) public   interface  EmployeeDao {    @Select    Employee selectById(Identity id);    @Select    List<Employee> selectByNames      (List<Name> names);    @Insert    int  insert(Employee employee);    @Update    int  update(Employee employee);    @Delete    int  delete(Employee employee); } やっぱりインタフェース! @Dao が必須。 データソースやデータベースの方言の指定は config に指定するクラスの中で設定。 クエリの種類はすべてアノテーションで明示。 メソッド名に制約はなし。
サンプルコード – 追加 Employee employee =  new  Employee_(); employee.id().set(99); employee.name().set( &quot;test&quot; ); employee.salary().set(300); EmployeeDao  dao  =  new  EmployeeDao_(); dao .insert(employee); insert into EMPLOYEE (ID, NAME, SALARY, VERSION) values (99, 'test', 300, 1) Java コード SQL のログ エンティティも Dao も実装クラスを new すれば OK 。
サンプルコード – 検索  &  更新 EmployeeDao  dao  =  new  EmployeeDao_(); Employee employee =  dao .selectById( new  Identity(1)); employee.name().set( &quot;hoge&quot; ); dao .update(employee); select * from employee where id = 1 update EMPLOYEE set NAME = 'hoge', VERSION = 1 + 1 where ID = 1 and VERSION = 1 select * from employee where id =  /*id*/ 0 selectById に対応する SQL ファイル Java コード SQL のログ Dao は実装クラスを new すれば OK 。
アジェンダ Doma の概要 apt Doma の戦略 ロードマップとまとめ
次世代とは? 旧世代 黒魔術に頼りすぎてしまった時代 限定的に使用すれば少ないコードで効力を発揮するが、一歩誤ると生産性や保守性を損なう技術。アプリケーションで管理されたソースコードをみただけでは挙動がわからない。わかりにくいエラーメッセージが出ることも。 AOP (バイトコードエンハンス) 命名規約 次世代 脱黒魔術 ソースコードのとおりに動く バイトコードエンハンスや命名規約を使った場合と同等のソースコードを生成。 デバッグしやすい 規約は事前にチェックする コンパイルエラーとして扱えば単なる命名規約ではない エラーが起きてもエラーメッセージがわかりやすい
脱黒魔術のためのツール: apt Pluggable Annotation Processing API Java6 から導入されたアノテーション処理のための API javax.annotation.processing   javax.lang.model javax.lang.model.element javax.lang.model.type javax.lang.model.util   コンパイル時に次のことが可能 ソースコードの生成 ソースコードの検証 リソースの参照 リスースの生成
apt の魅力 コンパイル時に自動で実行される コンパイルするだけでよい コンパイル以外で別の処理( ant タスクやプラグインなどで)を実行したり、実行時にオプション指定( java の -javaagent )をする必要がない 開発環境( Eclipse )でも javac でも動作する エラーを早期に検出できる 実行時ではなくコンパイル時に検出 動かさなくても間違いに気づけるため開発効率が高い 実行時の負荷を軽減できる 多くのフレームワークは実行時にクラスのメタ情報を解析しキャッシュするが、 apt を使えば、メタ情報をコンパイル時にあらかじめソースコードにして出力。解析やキャッシュの必要性がない。
Doma における apt の利用 エンティティの検証・実装クラスの生成 Dao の検証・実装クラスの生成 Dto ( JavaBeans )の生成 SQL ファイルの検証 バインド変数 条件式
Doma における apt の利用 – デモ 設定 バリデーション コードジェネレーション
アジェンダ Doma の概要 apt Doma の戦略 ロードマップとまとめ
Doma の戦略 依存ライブラリ Dao SQL ファイル キャッシュ プラガブルな構成 JavaBeans ( DTO )への自動変換
依存ライブラリ 依存ライブラリはなし Seasar2 にも依存していない DI も必須でない new すればいいだけ Doma の jar ( doma-x.x.x.jar )が 1 つがあればいい 他のフレームワークと特定のライブラリが競合するといった問題が発生しない
Dao 構成のわかりやすさ メソッド呼び出しと SQL の発行が 1 対 1 で対応しているのがわかりやすい。 メンテナンスのしやすさ CRUD がどこで行われているのか、すぐに調べられるのが重要。 テストのしやすさ Mock が作りやすい。 Mock ライブラリとの相性。
SQL ファイル 検索系 SQL 意図的に自動生成機能はなし。すべて SQL ファイルを利用。動的な SQL は、 SQL コメントによる条件式で生成。 Java コードに埋め込むのはメンテナンスを難しくするので認めない。 更新系 SQL 基本自動生成。 SQL ファイルの利用も可。 select * from employee where  /* %if  id != null*/ id =  /*id*/ 99 /* %end */ select * from employee select * from employee where id = ? SQL ファイル 実行される SQL   id != null   が成立する場合 実行される SQL   id != null   が成立しない場合
キャッシュ メモリを圧迫する可能性あり キャッシュはできるだけ避けるべき Doma では apt でコンパイル時にメタ情報のクラスを生成するため、キャッシュの必要性がない デフォルトでキャッシュするのは SQL の解析結果のみ(キャッシュの実装は差し替え可能)
プラガブルな構成 差し替えられるところを明確化している ネーミング規約 データベースの方言 SQL ファイルのキャッシュ戦略 JavaBeans へのアクセス方法 ドメインとデータベースの型のマッピング SQL のログ出力とフォーマット方法
JavaBeans ( DTO )への変換 public   class  EmployeeDto          implements  java.io.Serializable { private   static   final   long            serialVersionUID  = 1L; private  java.lang.Integer  id ; private  java.lang.String  name ; private  java.lang.Long  salary ; private  java.lang.Integer  versionNo ; // getter/setter @Entity public   interface  Employee { @Id Identity id(); Name name(); Salary salary(); @Version VersionNo versionNo(); } 自動生成 Employee employee = dao.selectById(new Identity(1)); EmployeeDto dto = new EmployeeDto(); CopyUtil. copy (employee, dto); 相互変換 JavaBeans への変換は容易(他のフレームワークとの連携も OK )
アジェンダ Doma の概要 apt Doma の戦略 ロードマップとまとめ
ロードマップ Eclipse のプラグインの作成 Dao と SQL ファイルの相互遷移 SQL の保存と同時に Dao を再ビルド apt をキック 「 Create Domain Class 」ダイアログ データベースからエンティティと Dao の自動生成 テストのサポート S2Unit を進化させたもの? apt を使った SQL ファイルの検証をさらに賢く 型チェック 異なる型同士の比較をエラーとする。 /*%if name == 1*/   という式で name が StringDomain の場合
まとめ 値型よりもリッチなクラスにメリットがある apt を使って脱黒魔術 コードジェネレーションやバリデーションがコンパイル時に実行できる Doma は、 apt を活用した Dao フレームワーク ドメインというリッチなクラスとデータベースの型をマッピング プラガブルな構成なため、カスタマイズが容易 必要なところでは JavaBeans に変換し、他のフレームワークとの互換性も確保
サイト http://doma.sandbox.seasar.org/ よくある質問 http://doma.sandbox.seasar.org/faq.html ソースリポジトリ http://doma.sandbox.seasar.org/source-repository.html
ご清聴ありがとうございました。

More Related Content

PDF
XS Japan 2008 Citrix Japanese
PDF
【13 C 2】デベロッパーに贈る!M-V-VMパターンで造るWPFアプリケーション
PDF
دليل المعلم لتنمية مهارات التفكير
PDF
PHP超入門@LL温泉
PDF
ICLR2020読み会 Stable Rank Normalization
PDF
Windows 7兼容性系列课程(1):Windows 7兼容性概述
PDF
It Flyer Page08
XS Japan 2008 Citrix Japanese
【13 C 2】デベロッパーに贈る!M-V-VMパターンで造るWPFアプリケーション
دليل المعلم لتنمية مهارات التفكير
PHP超入門@LL温泉
ICLR2020読み会 Stable Rank Normalization
Windows 7兼容性系列课程(1):Windows 7兼容性概述
It Flyer Page08

What's hot (15)

PDF
2. ugc net commerce june 2006 question paper
PDF
ZOZOTOWNのマルチクラウドへの挑戦と挫折、そして未来
PDF
Metadaily80131
PDF
Soilmechanics1
PDF
ミクシィ決算説明資料 FY2008 2Q
PDF
【13-C-4】 「もう業務はとまらない!オフライン機能を使った業務アプリケーションの実例と最新 Curl 情報」
PDF
PDF
テキストマイニングとNLPビジネス
PDF
Table 1
PDF
Cloud Computing - クラウドコンピューティング(会津産学懇話会)
PDF
UGC NET June 2009 PAPER I Solved
PDF
PDF
كيف تكسب مهارة التركيز
PDF
2004 paper ii
PDF
Distribution of PHPCon ElePHPant
2. ugc net commerce june 2006 question paper
ZOZOTOWNのマルチクラウドへの挑戦と挫折、そして未来
Metadaily80131
Soilmechanics1
ミクシィ決算説明資料 FY2008 2Q
【13-C-4】 「もう業務はとまらない!オフライン機能を使った業務アプリケーションの実例と最新 Curl 情報」
テキストマイニングとNLPビジネス
Table 1
Cloud Computing - クラウドコンピューティング(会津産学懇話会)
UGC NET June 2009 PAPER I Solved
كيف تكسب مهارة التركيز
2004 paper ii
Distribution of PHPCon ElePHPant
Ad

Similar to Sc2009autumn 次世代Daoフレームワーク Doma (15)

PDF
GAE/J 開発環境でJDO入門
PPT
Introduction to hibernate
PDF
Software architecture2008 ejbql-quickref
PDF
Jpa Online Final
PDF
Kick Start Jpa
PPT
Spring data
PDF
Simple Jdbc With Spring 2.5
PDF
TXT
Java day9n
PPTX
DOCX
4.3 Hibernate example.docx
PDF
Using the latest Java Persistence API 2 Features - Tech Days 2010 India
PDF
20071113 Msu Vasenin Seminar
PDF
Spring and dependency injection
PDF
Lazy vs. Eager Loading Strategies in JPA 2.1
GAE/J 開発環境でJDO入門
Introduction to hibernate
Software architecture2008 ejbql-quickref
Jpa Online Final
Kick Start Jpa
Spring data
Simple Jdbc With Spring 2.5
Java day9n
4.3 Hibernate example.docx
Using the latest Java Persistence API 2 Features - Tech Days 2010 India
20071113 Msu Vasenin Seminar
Spring and dependency injection
Lazy vs. Eager Loading Strategies in JPA 2.1
Ad

Recently uploaded (20)

PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
KodekX | Application Modernization Development
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Encapsulation theory and applications.pdf
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Review of recent advances in non-invasive hemoglobin estimation
PPTX
Cloud computing and distributed systems.
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PPT
Teaching material agriculture food technology
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Approach and Philosophy of On baking technology
PDF
Machine learning based COVID-19 study performance prediction
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
CIFDAQ's Market Insight: SEC Turns Pro Crypto
Spectral efficient network and resource selection model in 5G networks
Reach Out and Touch Someone: Haptics and Empathic Computing
KodekX | Application Modernization Development
Mobile App Security Testing_ A Comprehensive Guide.pdf
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
MYSQL Presentation for SQL database connectivity
Encapsulation theory and applications.pdf
Chapter 3 Spatial Domain Image Processing.pdf
Review of recent advances in non-invasive hemoglobin estimation
Cloud computing and distributed systems.
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Teaching material agriculture food technology
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
Unlocking AI with Model Context Protocol (MCP)
Approach and Philosophy of On baking technology
Machine learning based COVID-19 study performance prediction
“AI and Expert System Decision Support & Business Intelligence Systems”
Advanced methodologies resolving dimensionality complications for autism neur...

Sc2009autumn 次世代Daoフレームワーク Doma

  • 1. 次世代 Dao フレームワーク Doma 2009 年 9 月 12 日 中村年宏 (http://d.hatena.ne.jp/taedium)
  • 2. 自己紹介 中村 (taedium) http:// d.hatena.ne.jp/taedium S2Container 、 S2Dao 、 Slim3 のコミッタ S2JDBC-Gen コードジェネレーション データベースリファクタリング S2Dao 高速化対応(データベースのメタデータを不要に) Slim3-Gen apt と ant によるコードジェネレーション JPA の入門書執筆 Seasar2 と Hibernate で学ぶ JPA 入門
  • 3. アジェンダ Doma の概要 apt Doma の戦略 ロードマップとまとめ
  • 4. アジェンダ Doma の概要 apt Doma の戦略 ロードマップとまとめ
  • 5. Doma とは? Domain Oriented MApping framework ドメイン指向マッピングフレームワーク ドメインとは? 値の定義域(値がとりうる範囲)のこと、またはそれを表すクラス 体重:  0 から 500 の数値、単位は kg  ->  Weight クラス 都市名 :アルファベットの文字列 ->  CityName クラス Dao フレームワーク S2Dao 、 S2JDBC 、 Hibernate のよいところを取り入れた O/R マッパー データベースの型とドメインをマッピング、ドメインを String や Integer など一般的な値型にマッピング SQL ファイルの実行と、 SQL の自動生成の 2 パターンに対応 ただし、検索系は SQL ファイルの実行のみ
  • 6. Doma を利用した構成 address dept emp BusinessLogic ( データの利用者 ) AddressDao DepartmentDao EmployeeDao update insert select Doma SQL EMPLOYEE DEPARTMENT ADDRESS emp 、 dept 、 address はエンティティのインスタンス(ドメインの集合) SQL の生成 SQL ファイルの解析 SQL の発行 DB
  • 7. ドメインの利点 – タイプセーフ public void execute( String orderNo, String customerName,      String phoneNumber, String location, String description) {      ... } public void execute( OrderNo orderNo, CustomerName customerName,      PhoneNumber phoneNumber, Location location,      Description description) { ... } ドメインを使わない場合(値型を使用する場合) ドメインを使う場合
  • 8. ドメインの利点 – 振る舞い String phoneNumber = &quot;03-1234-5678&quot; ; int areaCode = PhoneNumberUtil.getAreaCode (phoneNumber); PhoneNumber phoneNumber = new PhoneNumber( &quot;03-1234-5678&quot; ); int areaCode = phoneNumber.getAreaCode (); ドメインを使わない場合(値型を使用する場合) ドメインを使う場合 Employee id phoneNumber ... Department id phoneNumber ... 振る舞いはエンティティにもたせればいいという考え方があるが、エンティティよりもプロパティにもたせた方がコードの重複が少ない。 同じドメインは複数のエンティティにまたがって使われるため。
  • 9. ドメインの定義 public class PhoneNumber extends StringDomain<PhoneNumber> { private static final long serialVersionUID = 1L; public PhoneNumber() { } public PhoneNumber(String value) { super (value); } public int getAreaCode() { ... } } 値型に対応する抽象ドメインクラスを継承して作成。 public なデフォルトコンストラクタが必要。 任意のメソッドをもてる。 必要に応じて定義域をバリデーション。
  • 10. ドメインのインタフェース public interface Domain<V, D extends Domain<V, D>> { V get(); void set(V value); void setDomain(D other); boolean isNull(); boolean isChanged(); void setChanged( boolean changed); Class<V> getValueClass(); <R, P, TH extends Throwable> R accept(DomainVisitor<R, P, TH> visitor, P p) throws TH, DomaNullPointerException; } PhoneNumber phoneNumber = new PhoneNumber(); phoneNumber.set( &quot;03-1234-5678&quot; ); String value = phoneNumber.get(); PhoneNumber copy = new PhoneNumber(); copy.setDomain(phoneNumber); 利用例 ジェネリクスを活用しタイプセーフを実現。
  • 11. エンティティの定義 @Entity public interface Employee {      @Id      Identity id();      Name name();      Salary salary();      @Version      VersionNo version(); } インタフェース! @Entity が必須。 プロパティはフィールドではなくメソッドで定義。 getter/setter が不要で簡潔。 プロパティはもちろんドメインクラス。 アノテーションの名前は JPA にあわせているが、すべて org.seasar.doma のパッケージに属する。
  • 12. Dao の定義 @Dao (config = AppConfig. class ) public interface EmployeeDao {    @Select    Employee selectById(Identity id);    @Select    List<Employee> selectByNames      (List<Name> names);    @Insert    int insert(Employee employee);    @Update    int update(Employee employee);    @Delete    int delete(Employee employee); } やっぱりインタフェース! @Dao が必須。 データソースやデータベースの方言の指定は config に指定するクラスの中で設定。 クエリの種類はすべてアノテーションで明示。 メソッド名に制約はなし。
  • 13. サンプルコード – 追加 Employee employee = new Employee_(); employee.id().set(99); employee.name().set( &quot;test&quot; ); employee.salary().set(300); EmployeeDao dao = new EmployeeDao_(); dao .insert(employee); insert into EMPLOYEE (ID, NAME, SALARY, VERSION) values (99, 'test', 300, 1) Java コード SQL のログ エンティティも Dao も実装クラスを new すれば OK 。
  • 14. サンプルコード – 検索 & 更新 EmployeeDao dao = new EmployeeDao_(); Employee employee = dao .selectById( new Identity(1)); employee.name().set( &quot;hoge&quot; ); dao .update(employee); select * from employee where id = 1 update EMPLOYEE set NAME = 'hoge', VERSION = 1 + 1 where ID = 1 and VERSION = 1 select * from employee where id = /*id*/ 0 selectById に対応する SQL ファイル Java コード SQL のログ Dao は実装クラスを new すれば OK 。
  • 15. アジェンダ Doma の概要 apt Doma の戦略 ロードマップとまとめ
  • 16. 次世代とは? 旧世代 黒魔術に頼りすぎてしまった時代 限定的に使用すれば少ないコードで効力を発揮するが、一歩誤ると生産性や保守性を損なう技術。アプリケーションで管理されたソースコードをみただけでは挙動がわからない。わかりにくいエラーメッセージが出ることも。 AOP (バイトコードエンハンス) 命名規約 次世代 脱黒魔術 ソースコードのとおりに動く バイトコードエンハンスや命名規約を使った場合と同等のソースコードを生成。 デバッグしやすい 規約は事前にチェックする コンパイルエラーとして扱えば単なる命名規約ではない エラーが起きてもエラーメッセージがわかりやすい
  • 17. 脱黒魔術のためのツール: apt Pluggable Annotation Processing API Java6 から導入されたアノテーション処理のための API javax.annotation.processing javax.lang.model javax.lang.model.element javax.lang.model.type javax.lang.model.util コンパイル時に次のことが可能 ソースコードの生成 ソースコードの検証 リソースの参照 リスースの生成
  • 18. apt の魅力 コンパイル時に自動で実行される コンパイルするだけでよい コンパイル以外で別の処理( ant タスクやプラグインなどで)を実行したり、実行時にオプション指定( java の -javaagent )をする必要がない 開発環境( Eclipse )でも javac でも動作する エラーを早期に検出できる 実行時ではなくコンパイル時に検出 動かさなくても間違いに気づけるため開発効率が高い 実行時の負荷を軽減できる 多くのフレームワークは実行時にクラスのメタ情報を解析しキャッシュするが、 apt を使えば、メタ情報をコンパイル時にあらかじめソースコードにして出力。解析やキャッシュの必要性がない。
  • 19. Doma における apt の利用 エンティティの検証・実装クラスの生成 Dao の検証・実装クラスの生成 Dto ( JavaBeans )の生成 SQL ファイルの検証 バインド変数 条件式
  • 20. Doma における apt の利用 – デモ 設定 バリデーション コードジェネレーション
  • 21. アジェンダ Doma の概要 apt Doma の戦略 ロードマップとまとめ
  • 22. Doma の戦略 依存ライブラリ Dao SQL ファイル キャッシュ プラガブルな構成 JavaBeans ( DTO )への自動変換
  • 23. 依存ライブラリ 依存ライブラリはなし Seasar2 にも依存していない DI も必須でない new すればいいだけ Doma の jar ( doma-x.x.x.jar )が 1 つがあればいい 他のフレームワークと特定のライブラリが競合するといった問題が発生しない
  • 24. Dao 構成のわかりやすさ メソッド呼び出しと SQL の発行が 1 対 1 で対応しているのがわかりやすい。 メンテナンスのしやすさ CRUD がどこで行われているのか、すぐに調べられるのが重要。 テストのしやすさ Mock が作りやすい。 Mock ライブラリとの相性。
  • 25. SQL ファイル 検索系 SQL 意図的に自動生成機能はなし。すべて SQL ファイルを利用。動的な SQL は、 SQL コメントによる条件式で生成。 Java コードに埋め込むのはメンテナンスを難しくするので認めない。 更新系 SQL 基本自動生成。 SQL ファイルの利用も可。 select * from employee where /* %if id != null*/ id = /*id*/ 99 /* %end */ select * from employee select * from employee where id = ? SQL ファイル 実行される SQL   id != null   が成立する場合 実行される SQL   id != null   が成立しない場合
  • 26. キャッシュ メモリを圧迫する可能性あり キャッシュはできるだけ避けるべき Doma では apt でコンパイル時にメタ情報のクラスを生成するため、キャッシュの必要性がない デフォルトでキャッシュするのは SQL の解析結果のみ(キャッシュの実装は差し替え可能)
  • 27. プラガブルな構成 差し替えられるところを明確化している ネーミング規約 データベースの方言 SQL ファイルのキャッシュ戦略 JavaBeans へのアクセス方法 ドメインとデータベースの型のマッピング SQL のログ出力とフォーマット方法
  • 28. JavaBeans ( DTO )への変換 public class EmployeeDto         implements java.io.Serializable { private static final long          serialVersionUID = 1L; private java.lang.Integer id ; private java.lang.String name ; private java.lang.Long salary ; private java.lang.Integer versionNo ; // getter/setter @Entity public interface Employee { @Id Identity id(); Name name(); Salary salary(); @Version VersionNo versionNo(); } 自動生成 Employee employee = dao.selectById(new Identity(1)); EmployeeDto dto = new EmployeeDto(); CopyUtil. copy (employee, dto); 相互変換 JavaBeans への変換は容易(他のフレームワークとの連携も OK )
  • 29. アジェンダ Doma の概要 apt Doma の戦略 ロードマップとまとめ
  • 30. ロードマップ Eclipse のプラグインの作成 Dao と SQL ファイルの相互遷移 SQL の保存と同時に Dao を再ビルド apt をキック 「 Create Domain Class 」ダイアログ データベースからエンティティと Dao の自動生成 テストのサポート S2Unit を進化させたもの? apt を使った SQL ファイルの検証をさらに賢く 型チェック 異なる型同士の比較をエラーとする。 /*%if name == 1*/  という式で name が StringDomain の場合
  • 31. まとめ 値型よりもリッチなクラスにメリットがある apt を使って脱黒魔術 コードジェネレーションやバリデーションがコンパイル時に実行できる Doma は、 apt を活用した Dao フレームワーク ドメインというリッチなクラスとデータベースの型をマッピング プラガブルな構成なため、カスタマイズが容易 必要なところでは JavaBeans に変換し、他のフレームワークとの互換性も確保
  • 32. サイト http://doma.sandbox.seasar.org/ よくある質問 http://doma.sandbox.seasar.org/faq.html ソースリポジトリ http://doma.sandbox.seasar.org/source-repository.html