狠狠撸

狠狠撸Share a Scribd company logo
2
Most read
5
Most read
6
Most read
次世代 Dao フレームワーク  Doma (ドマ) 第 56 回 JavaEE 勉強会 中村年宏  ( http://d.hatena.ne.jp/taedium/)
Doma (ドマ)とは D omain  O riented  MA pping Framework Domain (ドメイン)  =  値の定義域 Doma では String や Integer の定義域をより狭めたものを Domain (ドメイン)と呼ぶ 名前だけだと汎用的だけど、カテゴリとしては Dao フレームワーク( O/R マッパー) Java6 ( JDBC4.0 )対応 他のライブラリに依存していない Seasar プロジェクトの Sandbox で開発中 SVN リポジトリ https://www.seasar.org/svn/sandbox/doma/ SNAPSHOT http://maven.seasar.org/maven2-snapshot/org/seasar/doma/doma/0.9.0-SNAPSHOT/ ドキュメント なし。。。
Doma のコンセプト Domain(ドメイン)中心 宣言的プログラミング コンパイル時のコード自動生成
Domain (ドメイン)中心  -  ドメインとは? @Entity public   class  Employee { @Id private  Integer  id; private  String  name; private  String  phoneNumber; // … } @Entity public  interface Employee { @Id Identity  id(); Name  name(); PhoneNumber  phoneNumber(); // … } よくある一般的なEntity(JPAとか) Doma の Entity カラムの概念ごとにアプリ固有のクラスを作成(あらかじめ用意されたクラスもあり)。 Domain というインタフェースを実装 。
Domain (ドメイン)中心 –  Domain インタフェースとその実装 public   interface  Domain<V, D  extends  Domain<V, D>> { V get(); void  set(V value); void  set(D other); boolean  isNull(); boolean  isNotNull(); 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; } public   class  PhoneNumber  extends   AbstractStringDomain<PhoneNumber>  { private   static   final   long   serialVersionUID  = 1L; public  PhoneNumber() { } public  PhoneNumber(String value) { super (value); } } Domainインタフェース 実装例 String とか Integer のラッパーみたいなもの。 ここでは DB の型とのマッピング情報もたない。 Visitor パターンで RDBMS ごとにマッピング。 抽象クラスが用意されているので通常は継承するだけ。 直接 Domain インタフェースを実装することも可。 好きなメソッドを定義できる。
Domain (ドメイン)中心 – なぜ? 意図を明確に表せる 値に特化したメソッドを持てる PhoneNumber に国番号を扱うメソッドをもつとか ひとつのカラムに複数の意味をもたせたレガシーな設計に対応しやすい より安全 違う型で代入しようとすればコンパイルエラー 要するに、概念が異なるものは違うクラスでリッチに扱おうよということ。
宣言的プログラミング –  Entity の場合 @Entity public   class  Employee { @Id private  Integer id; private  String name; private  String phoneNumber; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } // … } @Entity public   interface  Employee { @Id Identity  id(); Name  name() ; PhoneNumber  phoneNumber() ; // … } よくある一般的なEntity Doma の Entity Doma の Entity はインタフェースで定義する。 メソッドは null を返さない。
宣言的プログラミング –  Dao の場合 @Dao(config = AppConfig.class) public  interface EmployeeDao { @Select(fetchSize = 50) Employee selectById(Identity id); @Insert(excludeNull = true) int insert(Employee employee); } Doma の Dao Doma では、アノテーションでクエリの種別を指定する。フェッチサイズ等の指定もアノテーションで記述できる。 意図が明確。間違いにくい。 @S2Dao(bean = Employee.class) public  interface EmployeeDao { Employee  selectById (Integer id); int  insert (Employee employee); } S2DaoのDao S2Daoでは命名規約でクエリの種別を指定。フェッチサイズなどいくつかの設定は設定ファイルで指定。 + 設定ファイル
コンパイル時のコード生成 Pluggable Annotation Processing API を利用 Java6 から導入された機能 apt と呼ばれることも Javac はもちろん Eclipse も対応している Save したときにコード生成 コードの依存関係をみて賢く生成 エラーメッセージをエディタ上に表示
コンパイル時のコード生成 – 例 @Override public  org.seasar.doma.it.entity.Employee selectById(org.seasar.doma.it.domain.Identity employee_id) { entering(&quot;org.seasar.doma.it.dao.EmployeeDao_&quot;, &quot;selectById&quot;, employee_id); if  (employee_id ==  null ) { throw   new  org.seasar.doma.DomaIllegalArgumentException(&quot;employee_id&quot;, employee_id); } org.seasar.doma.internal.jdbc.query.SqlFileSelectQuery query =  new  org.seasar.doma.internal.jdbc.query.SqlFileSelectQuery(); query.setConfig(config); query.setSqlFilePath(org.seasar.doma.internal.jdbc.sql.SqlFiles.buildPath(&quot;org.seasar.doma.it.dao.EmployeeDao&quot;, &quot;selectById&quot;)); query.addParameter(&quot;employee_id&quot;, employee_id); query.setCallerClassName(&quot;org.seasar.doma.it.dao.EmployeeDao_&quot;); query.setCallerMethodName(&quot;selectById&quot;); query.setQueryTimeout(-1); query.setMaxRows(-1); query.setFetchSize(-1); query.compile(); org.seasar.doma.internal.jdbc.command.SelectCommand<org.seasar.doma.it.entity.Employee> command =  new  org.seasar.doma.internal.jdbc.command.SelectCommand<org.seasar.doma.it.entity.Employee>(query,  new  org.seasar.doma.internal.jdbc.command.EntitySingleResultHandler<org.seasar.doma.it.entity.Employee, org.seasar.doma.it.entity.Employee_>(org.seasar.doma.it.entity.Employee_. class )); org.seasar.doma.it.entity.Employee result = command.execute(); exiting(&quot;org.seasar.doma.it.dao.EmployeeDao_&quot;, &quot;selectById&quot;, result); return  result; } @Select Employee selectById(Identity employee_id); インターフェースのメソッド 生成される実装クラスのコード 実行時にリフレクションやAOPで同等のことをするよりも ?パフォーマンスがいい。 ?挙動を把握しやすい。 デバッグがしやすい(デバッグポイントを置きやすい)のもポイント。 利点
Doma の機能 – 概要 複数 RDBMS 対応 今は HSQLDB 、 Oracle 、 PostgerSQL 、 MySQL 2WaySQL 自動生成  & SQL ファイル Entity リスナー 更新前に汎用的な処理を実行できる タイムスタンプや更新者の設定とか コンパイル時のエラーチェック 規約に外れたものをチェック SQL ファイルの存在チェック コメント式のチェック
Doma の機能 –  SQL 関連 検索系 Dao のメソッドに @Select をつける 自動生成しない。 SQL ファイルとのマッピングのみサポート。 SQL への変換機能あり(ページング、悲観的ロック)。 1 件ずつの処理可能。 更新系 Dao のメソッドに @Insert 、 @Update などをつける 自動生成する。 SQL ファイルへのマッピングも可能。 Update は変更のあったプロパティのみを対象。 バッチ更新にも対応。 プロシージャ  &  ファンクション Dao のメソッドに @Procedure や @Function をつける @Procedure(name=&quot;hoge&quot;) void execute (@In  Name name,  @InOut  Salary salary,  @Out  PhoneNumber phoneNumber); 例
Doma の機能 –  SQL ファイル関連 ファイルは Dao ごとに管理 SQL コメントのルールは S2Dao に似た感じ select * from employee where name =  /*name*/ ’hoge’  select * from employee where  /*%if name. startsWith (“A”)*/  name =  /*name*/ ’hoge’  --else  name isnull /*%end*/   select * from employee where  /* %if  name != null*/  name =  /*name*/ ’hoge’ /* %end */   If 文を使える Method 呼び出し可 else も使える バインド変数はコメントで表す。 メソッドのパラメータ名にあわせる。 @Select selectByName(Name name); Daoのメソッド SQLの例
Doma の機能 –  apt 関連 SQLファイルの存在チェック SQLファイルが必要なDaoメソッドに対応するファイルが存在しない場合はエラーメッセージを表示。 SQLコメントのチェック select * from employee where name =  /*emp_name*/ ’hoge’  @Select selectByName(Name  name ); メソッドのパラメータに存在しない名前がSQLコメントで使用されたらエラー。
デモ Doma は、 Java6 で動作します。 Java5 以前はサポートしてません。 IDE は Eclipse3.5 で動作することを確認しています。( 3.4 だと動かないところあるかも。) apt をサポートしていれば Eclipse でなくても大丈夫だと思います。 Eclipseで動作させるためのポイント Doma の jar をビルドパスに通す。 Doma の jar を ファクトリパス に通す。設定場所は プロジェクト右クリック - Properties - Java Compiler - Annotation Processing ( チェックを入れる )   - Factory Path  (チェックを入れる、 jar を登録する) 動作させるため注意点
まとめ –  Doma の良いところ Domain の利用で意図が明確かつ型安全。 明示的な設定。 命名規約はない。ルールから外れたら apt で通知。 Entity や Dao がすっきり。 apt でコード生成。 SQL を活かす。 2WaySQL 。 検索系は 意図的に 自動生成なし。ページングや悲観的ロック用の SQL への変換機能はあり。 特定のライブラリに依存しない。 S2Dao で問題になっていたことがらの多くを解決している。

More Related Content

What's hot (20)

PDF
Amazon Redshiftへの移行方法と設計のポイント(db tech showcase 2016)
Amazon Web Services Japan
?
PDF
ドメイン駆動で開発する ラフスケッチから実装まで
増田 亨
?
PDF
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
?
PPTX
[20220126] JAWS-UG 2022初頭までに葬ったAWSアンチパターン大紹介
Amazon Web Services Japan
?
PPTX
トランザクションを厂别谤颈补濒颈锄补产濒别にする4つの方法
Kumazaki Hiroki
?
ODP
骋辞のサーハ?サイト?実装におけるレイヤ设计とレイヤ内実装について考える
pospome
?
PDF
ソーシャルゲーム案件における顿叠分割の笔贬笔実装
infinite_loop
?
PDF
ドメイン駆动设计入门
Takuya Kitamura
?
PDF
100%Kotlin ORM Ktormを試してみた
Keita Tsukamoto
?
PDF
jooqってなんて読むの? から始めるO/Rマッハ?ーとSpringBootの世界
Y Watanabe
?
PDF
正しいものを正しく作る塾-设计コース
増田 亨
?
PDF
クラウド环境下における础笔滨リトライ设计
Kouji YAMADA
?
PPTX
颁濒辞耻诲贵谤辞苍迟経由での颁翱搁厂利用
Yuta Imai
?
PDF
Javaコードが速く実?される秘密 - JITコンパイラ??(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
?
PDF
アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...
Google Cloud Platform - Japan
?
PDF
インフラエンシ?ニアの綺丽て?优しい手顺书の书き方
Shohei Koyama
?
PDF
Apache Kuduを使った分析システムの裏側
Cloudera Japan
?
PDF
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
Koichiro Matsuoka
?
PPTX
スキトラ Spring + mybatis
小川 昌吾
?
PDF
Amazon Redshift パフォーマンスチューニングテクニックと最新アップデート
Amazon Web Services Japan
?
Amazon Redshiftへの移行方法と設計のポイント(db tech showcase 2016)
Amazon Web Services Japan
?
ドメイン駆動で開発する ラフスケッチから実装まで
増田 亨
?
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
?
[20220126] JAWS-UG 2022初頭までに葬ったAWSアンチパターン大紹介
Amazon Web Services Japan
?
トランザクションを厂别谤颈补濒颈锄补产濒别にする4つの方法
Kumazaki Hiroki
?
骋辞のサーハ?サイト?実装におけるレイヤ设计とレイヤ内実装について考える
pospome
?
ソーシャルゲーム案件における顿叠分割の笔贬笔実装
infinite_loop
?
ドメイン駆动设计入门
Takuya Kitamura
?
100%Kotlin ORM Ktormを試してみた
Keita Tsukamoto
?
jooqってなんて読むの? から始めるO/Rマッハ?ーとSpringBootの世界
Y Watanabe
?
正しいものを正しく作る塾-设计コース
増田 亨
?
クラウド环境下における础笔滨リトライ设计
Kouji YAMADA
?
颁濒辞耻诲贵谤辞苍迟経由での颁翱搁厂利用
Yuta Imai
?
Javaコードが速く実?される秘密 - JITコンパイラ??(JJUG CCC 2020 Fall講演資料)
NTT DATA Technology & Innovation
?
アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...
Google Cloud Platform - Japan
?
インフラエンシ?ニアの綺丽て?优しい手顺书の书き方
Shohei Koyama
?
Apache Kuduを使った分析システムの裏側
Cloudera Japan
?
PostgreSQLの行レベルセキュリティと SpringAOPでマルチテナントの ユーザー間情報漏洩を防止する (JJUG CCC 2021 Spring)
Koichiro Matsuoka
?
スキトラ Spring + mybatis
小川 昌吾
?
Amazon Redshift パフォーマンスチューニングテクニックと最新アップデート
Amazon Web Services Japan
?

Similar to 次世代顿补辞フレームワーク顿辞尘补 (20)

PDF
Doma SQLテンプレートのしくみ
Toshihiro Nakamura
?
PDF
金魚本読書ノート JPA編
Kazuyoshi Kamitsukasa
?
PDF
Entity Framework
Nakashima Yujiro
?
PPT
闯笔础説明会
Ryo Asai
?
PPT
Gaej Jdo
katsu.taira
?
PPT
S2dao Seminar in tripodworks
tripodworks
?
PDF
Nds#24 単体テスト
Kazumune Katagiri
?
PPT
础辫别虫コアデベロッパーセミナー(础辫别虫コード)071010
stomita
?
PDF
厂别补蝉补谤プロジェクト彻底攻略
takezoe
?
ODP
厂辫谤颈苍驳2概论蔼第1回闯厂鲍骋勉强会
Mitsuhiro Okamoto
?
PDF
クラウド?アプリケーション?モデリングへのアプローチ
Tomoharu ASAMI
?
PPT
Springて?dao 20070413
Funato Takashi
?
PDF
[豆ナイト]Java small object programming
Yuichi Hasegawa
?
PDF
Scala with DDD
潤一 加藤
?
PDF
Spring Data in a Nutshell
Tsuyoshi Miyake
?
PPT
【17-C-2】 クラウド上でのエンタープライズアプリケーション開発
lalha
?
PDF
ADO.NETとORMとMicro-ORM -dapper dot netを使ってみた
Narami Kiyokura
?
PPTX
骋濒补蝉蝉蹿颈蝉丑勉强会(闯补惫补贰贰6について)
Ryo Asai
?
PPTX
pi-15. カプセル化, MVCモデル, オブジェクトのマッピング
kunihikokaneko1
?
PPT
Spring3.1概要 データアクセスとトランザクション処理
土岐 孝平
?
Doma SQLテンプレートのしくみ
Toshihiro Nakamura
?
金魚本読書ノート JPA編
Kazuyoshi Kamitsukasa
?
Entity Framework
Nakashima Yujiro
?
闯笔础説明会
Ryo Asai
?
Gaej Jdo
katsu.taira
?
S2dao Seminar in tripodworks
tripodworks
?
Nds#24 単体テスト
Kazumune Katagiri
?
础辫别虫コアデベロッパーセミナー(础辫别虫コード)071010
stomita
?
厂别补蝉补谤プロジェクト彻底攻略
takezoe
?
厂辫谤颈苍驳2概论蔼第1回闯厂鲍骋勉强会
Mitsuhiro Okamoto
?
クラウド?アプリケーション?モデリングへのアプローチ
Tomoharu ASAMI
?
Springて?dao 20070413
Funato Takashi
?
[豆ナイト]Java small object programming
Yuichi Hasegawa
?
Scala with DDD
潤一 加藤
?
Spring Data in a Nutshell
Tsuyoshi Miyake
?
【17-C-2】 クラウド上でのエンタープライズアプリケーション開発
lalha
?
ADO.NETとORMとMicro-ORM -dapper dot netを使ってみた
Narami Kiyokura
?
骋濒补蝉蝉蹿颈蝉丑勉强会(闯补惫补贰贰6について)
Ryo Asai
?
pi-15. カプセル化, MVCモデル, オブジェクトのマッピング
kunihikokaneko1
?
Spring3.1概要 データアクセスとトランザクション処理
土岐 孝平
?
Ad

Recently uploaded (13)

PDF
SIG-AUDIO 2025 Vol.02 オンラインセミナー 「GDC2025 オーディオ報告会」SIG-Audio_GDC2024_報告会資料_増野さ...
IGDA Japan SIG-Audio
?
PDF
AIツールを使った研究の効率化 Improving Research Efficiency with AI Tools
Tohoku University
?
PDF
論文紹介:Unbiasing through Textual Descriptions: Mitigating Representation Bias i...
Toru Tamaki
?
PDF
SIG-AUDIO 2025 Vol.02 オンラインセミナー 「GDC2025 オーディオ報告会」SIG-Audio_GDC2025_報告会資料_渡辺さ...
IGDA Japan SIG-Audio
?
PDF
第3回デジタル理学疗法研究会学术大会シンポジウム「デジタル理学疗法の组织活用:教育?管理?研究を繋ぐ新たな地平」の讲演资料.
Matsushita Laboratory
?
PDF
渔船に搭载されている电子装备と渔法について冲痴搁颁海洋学研究会冲海の尝罢会発表资料
Yuuitirou528 default
?
PDF
安尾 萌, 北村 茂生, 松下 光範. 災害発生時における被害状況把握を目的とした情報共有システムの基礎検討, 電子情報通信学会HCGシンポジウム2018...
Matsushita Laboratory
?
PDF
マルチAIエージェントの産業界での実践に向けたオープンソース活動の展望 - Japan Regional User Group (RUG) Meet-Up
Kosaku Kimura
?
PDF
安尾 萌, 松下 光範. 環境馴致を計量可能にするための試み,人工知能学会第4回仕掛学研究会, 2018.
Matsushita Laboratory
?
PDF
API認可を支えるKeycloakの基本と設計の考え方 ~ OAuth/OIDCによるAPI保護のベストプラクティス ~
Hitachi, Ltd. OSS Solution Center.
?
PDF
第3回テ?シ?タル理学疗法学会のシンポジウム「デジタル理学疗法の组织活用:教育?管理?研究を繋ぐ新たな地平」での话题提供
Matsushita Laboratory
?
PDF
安尾 萌, 藤代 裕之, 松下 光範. 協調的情報トリアージにおけるコミュニケーションの影響についての検討, 第11回データ工学と情報マネジメントに関する...
Matsushita Laboratory
?
PDF
論文紹介:AutoPrompt: Eliciting Knowledge from Language Models with Automatically ...
Toru Tamaki
?
SIG-AUDIO 2025 Vol.02 オンラインセミナー 「GDC2025 オーディオ報告会」SIG-Audio_GDC2024_報告会資料_増野さ...
IGDA Japan SIG-Audio
?
AIツールを使った研究の効率化 Improving Research Efficiency with AI Tools
Tohoku University
?
論文紹介:Unbiasing through Textual Descriptions: Mitigating Representation Bias i...
Toru Tamaki
?
SIG-AUDIO 2025 Vol.02 オンラインセミナー 「GDC2025 オーディオ報告会」SIG-Audio_GDC2025_報告会資料_渡辺さ...
IGDA Japan SIG-Audio
?
第3回デジタル理学疗法研究会学术大会シンポジウム「デジタル理学疗法の组织活用:教育?管理?研究を繋ぐ新たな地平」の讲演资料.
Matsushita Laboratory
?
渔船に搭载されている电子装备と渔法について冲痴搁颁海洋学研究会冲海の尝罢会発表资料
Yuuitirou528 default
?
安尾 萌, 北村 茂生, 松下 光範. 災害発生時における被害状況把握を目的とした情報共有システムの基礎検討, 電子情報通信学会HCGシンポジウム2018...
Matsushita Laboratory
?
マルチAIエージェントの産業界での実践に向けたオープンソース活動の展望 - Japan Regional User Group (RUG) Meet-Up
Kosaku Kimura
?
安尾 萌, 松下 光範. 環境馴致を計量可能にするための試み,人工知能学会第4回仕掛学研究会, 2018.
Matsushita Laboratory
?
API認可を支えるKeycloakの基本と設計の考え方 ~ OAuth/OIDCによるAPI保護のベストプラクティス ~
Hitachi, Ltd. OSS Solution Center.
?
第3回テ?シ?タル理学疗法学会のシンポジウム「デジタル理学疗法の组织活用:教育?管理?研究を繋ぐ新たな地平」での话题提供
Matsushita Laboratory
?
安尾 萌, 藤代 裕之, 松下 光範. 協調的情報トリアージにおけるコミュニケーションの影響についての検討, 第11回データ工学と情報マネジメントに関する...
Matsushita Laboratory
?
論文紹介:AutoPrompt: Eliciting Knowledge from Language Models with Automatically ...
Toru Tamaki
?
Ad

次世代顿补辞フレームワーク顿辞尘补

  • 1. 次世代 Dao フレームワーク Doma (ドマ) 第 56 回 JavaEE 勉強会 中村年宏 ( http://d.hatena.ne.jp/taedium/)
  • 2. Doma (ドマ)とは D omain O riented MA pping Framework Domain (ドメイン) = 値の定義域 Doma では String や Integer の定義域をより狭めたものを Domain (ドメイン)と呼ぶ 名前だけだと汎用的だけど、カテゴリとしては Dao フレームワーク( O/R マッパー) Java6 ( JDBC4.0 )対応 他のライブラリに依存していない Seasar プロジェクトの Sandbox で開発中 SVN リポジトリ https://www.seasar.org/svn/sandbox/doma/ SNAPSHOT http://maven.seasar.org/maven2-snapshot/org/seasar/doma/doma/0.9.0-SNAPSHOT/ ドキュメント なし。。。
  • 3. Doma のコンセプト Domain(ドメイン)中心 宣言的プログラミング コンパイル時のコード自動生成
  • 4. Domain (ドメイン)中心 - ドメインとは? @Entity public class Employee { @Id private Integer id; private String name; private String phoneNumber; // … } @Entity public interface Employee { @Id Identity id(); Name name(); PhoneNumber phoneNumber(); // … } よくある一般的なEntity(JPAとか) Doma の Entity カラムの概念ごとにアプリ固有のクラスを作成(あらかじめ用意されたクラスもあり)。 Domain というインタフェースを実装 。
  • 5. Domain (ドメイン)中心 – Domain インタフェースとその実装 public interface Domain<V, D extends Domain<V, D>> { V get(); void set(V value); void set(D other); boolean isNull(); boolean isNotNull(); 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; } public class PhoneNumber extends AbstractStringDomain<PhoneNumber> { private static final long serialVersionUID = 1L; public PhoneNumber() { } public PhoneNumber(String value) { super (value); } } Domainインタフェース 実装例 String とか Integer のラッパーみたいなもの。 ここでは DB の型とのマッピング情報もたない。 Visitor パターンで RDBMS ごとにマッピング。 抽象クラスが用意されているので通常は継承するだけ。 直接 Domain インタフェースを実装することも可。 好きなメソッドを定義できる。
  • 6. Domain (ドメイン)中心 – なぜ? 意図を明確に表せる 値に特化したメソッドを持てる PhoneNumber に国番号を扱うメソッドをもつとか ひとつのカラムに複数の意味をもたせたレガシーな設計に対応しやすい より安全 違う型で代入しようとすればコンパイルエラー 要するに、概念が異なるものは違うクラスでリッチに扱おうよということ。
  • 7. 宣言的プログラミング – Entity の場合 @Entity public class Employee { @Id private Integer id; private String name; private String phoneNumber; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } // … } @Entity public interface Employee { @Id Identity id(); Name name() ; PhoneNumber phoneNumber() ; // … } よくある一般的なEntity Doma の Entity Doma の Entity はインタフェースで定義する。 メソッドは null を返さない。
  • 8. 宣言的プログラミング – Dao の場合 @Dao(config = AppConfig.class) public interface EmployeeDao { @Select(fetchSize = 50) Employee selectById(Identity id); @Insert(excludeNull = true) int insert(Employee employee); } Doma の Dao Doma では、アノテーションでクエリの種別を指定する。フェッチサイズ等の指定もアノテーションで記述できる。 意図が明確。間違いにくい。 @S2Dao(bean = Employee.class) public interface EmployeeDao { Employee selectById (Integer id); int insert (Employee employee); } S2DaoのDao S2Daoでは命名規約でクエリの種別を指定。フェッチサイズなどいくつかの設定は設定ファイルで指定。 + 設定ファイル
  • 9. コンパイル時のコード生成 Pluggable Annotation Processing API を利用 Java6 から導入された機能 apt と呼ばれることも Javac はもちろん Eclipse も対応している Save したときにコード生成 コードの依存関係をみて賢く生成 エラーメッセージをエディタ上に表示
  • 10. コンパイル時のコード生成 – 例 @Override public org.seasar.doma.it.entity.Employee selectById(org.seasar.doma.it.domain.Identity employee_id) { entering(&quot;org.seasar.doma.it.dao.EmployeeDao_&quot;, &quot;selectById&quot;, employee_id); if (employee_id == null ) { throw new org.seasar.doma.DomaIllegalArgumentException(&quot;employee_id&quot;, employee_id); } org.seasar.doma.internal.jdbc.query.SqlFileSelectQuery query = new org.seasar.doma.internal.jdbc.query.SqlFileSelectQuery(); query.setConfig(config); query.setSqlFilePath(org.seasar.doma.internal.jdbc.sql.SqlFiles.buildPath(&quot;org.seasar.doma.it.dao.EmployeeDao&quot;, &quot;selectById&quot;)); query.addParameter(&quot;employee_id&quot;, employee_id); query.setCallerClassName(&quot;org.seasar.doma.it.dao.EmployeeDao_&quot;); query.setCallerMethodName(&quot;selectById&quot;); query.setQueryTimeout(-1); query.setMaxRows(-1); query.setFetchSize(-1); query.compile(); org.seasar.doma.internal.jdbc.command.SelectCommand<org.seasar.doma.it.entity.Employee> command = new org.seasar.doma.internal.jdbc.command.SelectCommand<org.seasar.doma.it.entity.Employee>(query, new org.seasar.doma.internal.jdbc.command.EntitySingleResultHandler<org.seasar.doma.it.entity.Employee, org.seasar.doma.it.entity.Employee_>(org.seasar.doma.it.entity.Employee_. class )); org.seasar.doma.it.entity.Employee result = command.execute(); exiting(&quot;org.seasar.doma.it.dao.EmployeeDao_&quot;, &quot;selectById&quot;, result); return result; } @Select Employee selectById(Identity employee_id); インターフェースのメソッド 生成される実装クラスのコード 実行時にリフレクションやAOPで同等のことをするよりも ?パフォーマンスがいい。 ?挙動を把握しやすい。 デバッグがしやすい(デバッグポイントを置きやすい)のもポイント。 利点
  • 11. Doma の機能 – 概要 複数 RDBMS 対応 今は HSQLDB 、 Oracle 、 PostgerSQL 、 MySQL 2WaySQL 自動生成 & SQL ファイル Entity リスナー 更新前に汎用的な処理を実行できる タイムスタンプや更新者の設定とか コンパイル時のエラーチェック 規約に外れたものをチェック SQL ファイルの存在チェック コメント式のチェック
  • 12. Doma の機能 – SQL 関連 検索系 Dao のメソッドに @Select をつける 自動生成しない。 SQL ファイルとのマッピングのみサポート。 SQL への変換機能あり(ページング、悲観的ロック)。 1 件ずつの処理可能。 更新系 Dao のメソッドに @Insert 、 @Update などをつける 自動生成する。 SQL ファイルへのマッピングも可能。 Update は変更のあったプロパティのみを対象。 バッチ更新にも対応。 プロシージャ & ファンクション Dao のメソッドに @Procedure や @Function をつける @Procedure(name=&quot;hoge&quot;) void execute (@In Name name, @InOut Salary salary, @Out PhoneNumber phoneNumber); 例
  • 13. Doma の機能 – SQL ファイル関連 ファイルは Dao ごとに管理 SQL コメントのルールは S2Dao に似た感じ select * from employee where name = /*name*/ ’hoge’ select * from employee where /*%if name. startsWith (“A”)*/ name = /*name*/ ’hoge’ --else name isnull /*%end*/ select * from employee where /* %if name != null*/ name = /*name*/ ’hoge’ /* %end */ If 文を使える Method 呼び出し可 else も使える バインド変数はコメントで表す。 メソッドのパラメータ名にあわせる。 @Select selectByName(Name name); Daoのメソッド SQLの例
  • 14. Doma の機能 – apt 関連 SQLファイルの存在チェック SQLファイルが必要なDaoメソッドに対応するファイルが存在しない場合はエラーメッセージを表示。 SQLコメントのチェック select * from employee where name = /*emp_name*/ ’hoge’ @Select selectByName(Name name ); メソッドのパラメータに存在しない名前がSQLコメントで使用されたらエラー。
  • 15. デモ Doma は、 Java6 で動作します。 Java5 以前はサポートしてません。 IDE は Eclipse3.5 で動作することを確認しています。( 3.4 だと動かないところあるかも。) apt をサポートしていれば Eclipse でなくても大丈夫だと思います。 Eclipseで動作させるためのポイント Doma の jar をビルドパスに通す。 Doma の jar を ファクトリパス に通す。設定場所は プロジェクト右クリック - Properties - Java Compiler - Annotation Processing ( チェックを入れる ) - Factory Path (チェックを入れる、 jar を登録する) 動作させるため注意点
  • 16. まとめ – Doma の良いところ Domain の利用で意図が明確かつ型安全。 明示的な設定。 命名規約はない。ルールから外れたら apt で通知。 Entity や Dao がすっきり。 apt でコード生成。 SQL を活かす。 2WaySQL 。 検索系は 意図的に 自動生成なし。ページングや悲観的ロック用の SQL への変換機能はあり。 特定のライブラリに依存しない。 S2Dao で問題になっていたことがらの多くを解決している。