O/R マッピングツール  S2Dao  入門 トライポッドワークスセミナー  2007/11/05
JDBCプログラミングの問題点 <ul><li>DB アクセスに関する『定型的』なコードが多くなる </li></ul><ul><li>DB のレコード( ResultSet )から Java オブジェクトへの詰め替えを手作業でコーディング <...
今までどんな手を打ってきたか <ul><li>ソースコードの自動生成 </li></ul><ul><ul><li>一部の『できる人』が『自分のため』にやっていた </li></ul></ul><ul><ul><li>EXCELの定義書もどきから...
その他の問題 <ul><li>SQL ツールを使いこなせていない </li></ul><ul><ul><li>データの参照や操作に sqlplus 、 mysql 、 psql を使っていて生産性を低下させている </li></ul></ul>...
<ul><li>S2Daoでデータベースアクセス(概要) </li></ul>
S2Daoの特長 <ul><li>国産 DI コンテナ Seasar2 の 1 プロジェクトとして開発が進められている O/R マッピングフレームワーク </li></ul><ul><li>Java のコードをほとんど記述する必要がない </l...
S2Daoデモのテーブルとデータ <ul><li>サンプルデータは Oracle の scott/tiger データベースです </li></ul>
S2Dao-開発の進め方 <ul><li>テーブルの作成 </li></ul><ul><li>エンティティ (JavaBeans )の作成 </li></ul><ul><li>Dao( D ata A ccess O bject )の作成 </...
<ul><li>自分専用のデータベース環境を作ろう </li></ul>
H2 Database Engine <ul><li>開発者にとって扱いやすいデータベース </li></ul><ul><ul><li>インストールが超簡単 </li></ul></ul><ul><ul><li>起動が超簡単 </li></ul...
H2 Database Engine-インストールと起動 <ul><li>公式サイトにアクセス </li></ul><ul><ul><li>http://www.h2database.com/html/frame_ja.html </li></...
H2 Database Engine-データベースの作成と接続 <ul><li>コンソールの『 JDBC URL: 』に注目 </li></ul><ul><li>新しい URL で接続したときにデータベースが生成されます。 </li></ul>...
Execute Query-汎用SQLクライアント <ul><li>JDBCドライバ経由で接続する汎用SQLクライアントです </li></ul><ul><li>検索結果のタブ表示 </li></ul><ul><li>SQLコマンド履歴 </l...
<ul><li>S2Dao についてもっと  kwsk  (詳しく) </li></ul>
O/Rマッピングとは? <ul><li>Object / Relational Mappingの略称 </li></ul><ul><li>オブジェクト指向言語で扱う「オブジェクト」と「リレーショナルデータベース(RDB)のレコード」をマッピング...
O/Rマッピングとは? <ul><li>インピーダンスミスマッチの解決策として登場 </li></ul>
Daoパターン <ul><li>D ata  A ccess  O bjectの略 </li></ul><ul><li>依存関係を疎にするための考え方 </li></ul><ul><li>永続ストレージ(DB)にアクセスする処理を、本来行うべき...
Seasar概要 <ul><li>軽量DIコンテナ </li></ul><ul><li>設定ファイルをほとんど書く必要がない </li></ul><ul><li>アプリケーションを修正したときでも再起動なしで即座にその変更を認識できる </li...
Seasar概要 <ul><li>設定ファイルを書かなくてもすむように、Convention over Configurationの考え方が取り入れられている。  </li></ul><ul><ul><li>Convention over Co...
Seasar概要 <ul><li>DI×AOP を実装するコンポーネント </li></ul><ul><ul><li>コア(必須コンポーネント)である S2Container が相当 </li></ul></ul><ul><ul><li>DI ...
<ul><li>S2Daoでよく使うアノテーション </li></ul>
アノテーションとは? <ul><li>JDK5から取り入れられたもの </li></ul><ul><li>プログラム中に補助的な情報を持たせることができる </li></ul><ul><li>メタデータ </li></ul><ul><li>Se...
アノテーションとは? <ul><li>アノテーションサンプル </li></ul>
アノテーションとは? <ul><li>アノテーションを取得する </li></ul>
Beanアノテーション(必須) <ul><li>Bean とテーブルの関連付け </li></ul><ul><li>クラス名からパッケージ名を除いた名前がテーブル名と一致する場合は、 Bean アノテーションを定義する必要はありません </li...
Idアノテーション <ul><li>ID アノテーションは主キーを指定します。 IdType でレコード追加時の ID 付与方法を設定。 </li></ul><ul><li>IdType.IDENTITY : IDENTITY による自動採番機...
Columnアノテーション <ul><li>プロパティ名と実際のフィールド名が違う場合に利用 </li></ul>
S2Daoアノテーション <ul><li>Daoインタフェースに利用 </li></ul><ul><li>エンティティとの関連付けはここで行う </li></ul>
Argumentsアノテーション <ul><li>メソッドの引数を自動生成(または自分で作成)した SQL 文で参照できるように利用する </li></ul><ul><li>メソッドの引数名を指定 </li></ul><ul><li>メソッドの...
Queryアノテーション <ul><li>WHERE 句以降の SQL を指定できる </li></ul><ul><li>バインド変数形式 </li></ul><ul><li>Arguments アノテーションは不要 </li></ul><ul...
SqlFile アノテーション <ul><li>SQLの生成をS2Daoの自動生成ではなく、自分で外部ファイルに記述する場合に指定する </li></ul><ul><li>外部SQLファイルとは?これからお話します。 </li></ul>
<ul><li>S2Daoの外部SQL </li></ul>
外部SQLファイル <ul><li>S2Dao の目玉となる機能 </li></ul><ul><li>O/R マッピングツールの「自動生成 SQL ダメじゃん」に応えてくれる機能 </li></ul><ul><li>関数を使うもよし </li>...
外部SQLファイル <ul><li>DBMS と DBMS サフィックスの関係  </li></ul><ul><ul><li>Oracle : oracle  </li></ul></ul><ul><ul><li>DB2 : db2 </li>...
2Way-SQL <ul><li>2 WAY-SQL </li></ul><ul><ul><li>設計時も実行時も( 2WAY )そのまま使える SQL </li></ul></ul><ul><li>/*IF*/ - /*END*/ </li>...
Beanのプロパティ <ul><li>型の決めかたについては以下を参考に </li></ul>
<ul><li>ページング </li></ul>
ページング <ul><li>データベース情報をコンフィグレーションする、「 j2ee.dicon 」ファイルを修正 </li></ul><ul><ul><li>どうせ毎回使うのでテンプレートとして持っておきたい </li></ul></ul><...
ページング <ul><li>j2ee.diconファイルの設定 </li></ul>Oracle の場合はこちらのブロックを有効に .. 接続設定もこのファイルに含まれる(資料中は省略)
ページング <ul><li>Dao 側のコード </li></ul><ul><ul><li>DefaultPagerCondition の引数に受けるだけ </li></ul></ul><ul><ul><li>DefaultPagerCondi...
ページング <ul><li>Dao呼び出し側のコード </li></ul>
<ul><li>トランザクション </li></ul>
トランザクション <ul><li>トランザクション機構を提供 </li></ul><ul><ul><li>S2Txと呼ばれているもの </li></ul></ul><ul><ul><ul><li>http://s2container.seasa...
トランザクション <ul><li>トランザクション境界にしたいクラスを dicon ファイルに登録 </li></ul><ul><li>Aspect タグに、 j2ee.requiredTx を組み込む </li></ul><ul><li>Po...
<ul><li>リレーションシップへの対応 </li></ul>
リレーションシップ <ul><li>S2Dao はリレーションのマッピングに難あり </li></ul><ul><ul><li>ManyToOne( 多対 1) のサポートのみ </li></ul></ul><ul><ul><li>双方向関連、...
リレーションシップ対策 <ul><li>とはいえ、『 OneToMany : 1 対多』のパターンは良く使われるので何とかせねば。 </li></ul><ul><li>対策 </li></ul><ul><ul><li>Dao の呼び出し元で関連...
インターセプタ(S2AOP)
インターセプタ(S2AOP) <ul><li>意味説明 </li></ul><ul><ul><li>[arg]DeptOneToManyInterceptor のコンストラクタに EmpDao を渡す </li></ul></ul><ul><u...
Beanにマッピングするのが面倒ならこうする <ul><li>Map[] 、 List<Map> で戻り値を受けることも可能。 </li></ul><ul><li>結合や Group By 、関数を使うような SQL が元になる場合、 Bean...
<ul><li>ところで、なぜインタフェースだけでおk? </li></ul>
S2Daoの処理構造 <ul><li>S2AOPが、ユーザ作成のDaoをインターセプト </li></ul><ul><li>自動的にサブクラスを生成して実行する </li></ul>EmpDao insert() update() delete...
S2Daoの処理構造 <ul><li>org.seasar.dao.interceptors.S2DaoInterceptor </li></ul><ul><li>インタフェースを捕捉。実行する SQL を生成して戻り値を返す </li></ul>
<ul><li>ユニットテスト </li></ul>
S2DaoTestCase <ul><li>S2DaoTestCaseという仕組みを利用する </li></ul><ul><ul><li>http://s2container.seasar.org/ja/testtech.html#S2DaoT...
S2DaoTestCase <ul><li>テストメソッドをトランザクション(自動ロールバック)化 </li></ul><ul><li>テストデータの作成機能 </li></ul><ul><ul><li>EXCEL ファイルをテーブルに書き出せ...
S2DaoTestCase <ul><li>テストメソッドをトランザクション化 </li></ul><ul><ul><li>Tx をメソッドの末尾に付けるだけで自動ロールバック </li></ul></ul>
S2DaoTestCase <ul><li>EXCEL データの取り込み </li></ul><ul><ul><li>テーブルへのレコード追加  : readXlsWriteDb </li></ul></ul><ul><ul><li>テーブルの...
<ul><li>その他 </li></ul>
実行時のコンソールに注目! <ul><li>実際に発行した SQL を見ることができる </li></ul><ul><li>SQL ツールでそのままデバッグが可能 </li></ul><ul><li>ログファイルとして残すのも良し </li><...
周辺ツールも充実 <ul><li>S2Dao-Plugin </li></ul><ul><ul><li>外部SQLファイルの存在を教えてくれる </li></ul></ul><ul><ul><li>外部SQLファイルの作成支援 </li></u...
周辺ツールも充実 <ul><li>S2Dao-Codegen </li></ul><ul><ul><li>EXCEL 形式の定義書からソースコードを自動生成してくれる </li></ul></ul><ul><ul><li>Dao  ⇒  xx....
S2Daoって本当にいいの?-Hibernateについて解説 <ul><li>マッピングの XML を書く </li></ul><ul><li>エンティティ( Bean) の作成 </li></ul><ul><ul><li>アノテーションなどの...
Seasar2繁華街マップ(w S2Container(Extention) S2Container(Framework) S2AOP S2Unit S2Tx S2DBCP S2JDBC アプリケーション Tuigwaa S2Dxo 開発ツール...
<ul><li>補足情報 </li></ul>
H2 Database Engine-他DBへの接続 <ul><li>H2 のコンソールは JDBC ドライバがあるほとんどのデータベースに接続できます </li></ul><ul><li>下記は PostgreSQL に接続する例 </li>...
Eclipseの便利な使い方 <ul><li>ワーキングセットの活用 </li></ul><ul><li>『エディターにリンク』の設定 </li></ul><ul><li>エディタのフォントはお好きなように </li></ul><ul><ul>...
Eclipseの便利な使い方 <ul><li>ショートカット活用 </li></ul><ul><ul><li>パーツ最大化 : Ctrl + M </li></ul></ul><ul><ul><li>ビューの切り替え : Ctrl + F7 <...
ご清聴ありがとうございました m(_ _)m http://d.hatena.ne.jp/morningmist7/
Upcoming SlideShare
Loading in …5
×

S2dao Seminar in tripodworks

24,812 views
24,583 views

Published on

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
24,812
On SlideShare
0
From Embeds
0
Number of Embeds
335
Actions
Shares
0
Downloads
5
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide
  • S2dao Seminar in tripodworks

    1. 1. O/R マッピングツール S2Dao 入門 トライポッドワークスセミナー  2007/11/05
    2. 2. JDBCプログラミングの問題点 <ul><li>DB アクセスに関する『定型的』なコードが多くなる </li></ul><ul><li>DB のレコード( ResultSet )から Java オブジェクトへの詰め替えを手作業でコーディング </li></ul><ul><li>RDBMS でコーディングに差異が出てしまい、別の RDBMS に乗り換えたときに汎用性が下がる </li></ul><ul><li>定型的なコード、単調なコードはミスしやすく、またミスを見つけにくい。 </li></ul><ul><ul><li>『まさかこんなところが原因ではないだろう…』と見落としがち </li></ul></ul><ul><li>コネクションのクローズ忘れ </li></ul><ul><li>トランザクションの掛け忘れ </li></ul>
    3. 3. 今までどんな手を打ってきたか <ul><li>ソースコードの自動生成 </li></ul><ul><ul><li>一部の『できる人』が『自分のため』にやっていた </li></ul></ul><ul><ul><li>EXCELの定義書もどきから自動生成など </li></ul></ul><ul><ul><li>出来上がったコードに修正を加えたときの対処が大変 </li></ul></ul><ul><li>独自にO/Rマッピング </li></ul><ul><ul><li>リフレクション(*1)を活用したり、テーブルのメタデータ(*2)を参照するようなライブラリを作成し一定の成果を上げた… </li></ul></ul><ul><ul><li>社内だけでしか使われないのでフィードバックが得られにくい </li></ul></ul><ul><ul><li>メンテナンスできるヒトが限られる </li></ul></ul>(*1) クラスのフィールド、メソッド、およびコンストラクタに関する情報を検出したり、その検出した情報でそのクラスを利用したりできる API 。 (*2) データについてのデータ。あるデータそのものではなく、そのデータに関連する情報のこと。
    4. 4. その他の問題 <ul><li>SQL ツールを使いこなせていない </li></ul><ul><ul><li>データの参照や操作に sqlplus 、 mysql 、 psql を使っていて生産性を低下させている </li></ul></ul><ul><li>『自分用』のデータベース環境がない </li></ul><ul><ul><li>データベース環境が無い、または構築できないために学習の足かせになっている </li></ul></ul><ul><ul><li>外出先や自宅で学習したくても簡単に環境を移動できない </li></ul></ul><ul><li>なんか最近 SQL を書けないような気がする </li></ul><ul><li>なぜかデータベースにアクセスする機能を実装する機会がない </li></ul><ul><li>そもそもこの部分の実装にあまり時間を取られたくない。 </li></ul><ul><ul><li>後ろに画面周りとかシステム連携とか控えてるんスけど .. </li></ul></ul>
    5. 5. <ul><li>S2Daoでデータベースアクセス(概要) </li></ul>
    6. 6. S2Daoの特長 <ul><li>国産 DI コンテナ Seasar2 の 1 プロジェクトとして開発が進められている O/R マッピングフレームワーク </li></ul><ul><li>Java のコードをほとんど記述する必要がない </li></ul><ul><li>(Hibernate のような ) マッピングファイルの作成が不要 </li></ul><ul><li>DB のカラム名と Java のフィールド名を一致させておけば、大半は自動的にマッピングしてくれる </li></ul><ul><ul><li>自動マッピングできない部分は、アノテーションを利用してソースコード中にマッピングを記述できる </li></ul></ul><ul><li>単純なアクセス( CRUD )については自動で SQL 発行を行ってくれる </li></ul><ul><li>柔軟性が高い </li></ul><ul><ul><li>複雑な検索は開発者が別途 SQL を用意できる </li></ul></ul><ul><li>Java 以外でも使える </li></ul><ul><ul><li>S2Dao.NET </li></ul></ul><ul><ul><li>S2Dao.PHP </li></ul></ul>
    7. 7. S2Daoデモのテーブルとデータ <ul><li>サンプルデータは Oracle の scott/tiger データベースです </li></ul>
    8. 8. S2Dao-開発の進め方 <ul><li>テーブルの作成 </li></ul><ul><li>エンティティ (JavaBeans )の作成 </li></ul><ul><li>Dao( D ata A ccess O bject )の作成 </li></ul><ul><li>(必要であれば)検索条件クラスの作成 </li></ul><ul><li>テストコードの作成 </li></ul>
    9. 9. <ul><li>自分専用のデータベース環境を作ろう </li></ul>
    10. 10. H2 Database Engine <ul><li>開発者にとって扱いやすいデータベース </li></ul><ul><ul><li>インストールが超簡単 </li></ul></ul><ul><ul><li>起動が超簡単 </li></ul></ul><ul><ul><li>ファイルサイズが軽い </li></ul></ul><ul><ul><li>可搬性が良い </li></ul></ul><ul><ul><li>SQL は PostgreSQL 互換(詳細未確認) </li></ul></ul>学習環境にはうってつけのデータベース
    11. 11. H2 Database Engine-インストールと起動 <ul><li>公式サイトにアクセス </li></ul><ul><ul><li>http://www.h2database.com/html/frame_ja.html </li></ul></ul><ul><li>以下のファイルをダウンロード </li></ul><ul><ul><li>Version 1.0.60 (2007-10-20) </li></ul></ul><ul><ul><li>All platforms (zip, 3.7 MB) </li></ul></ul><ul><li>Zip ファイルを解凍 </li></ul><ul><li>h2/bin/h2.bat をダブルクリック </li></ul><ul><li>Web ブラウザが自動起動し、 H2 コンソール( http://localhost:8082/ )が表示されれば OK </li></ul>
    12. 12. H2 Database Engine-データベースの作成と接続 <ul><li>コンソールの『 JDBC URL: 』に注目 </li></ul><ul><li>新しい URL で接続したときにデータベースが生成されます。 </li></ul><ul><li>『 jdbc:h2:~test 』で接続した場合 </li></ul><ul><ul><li>C:Documents and Settings にデータベースファイルが生成される( [logonName]test.xxx) </li></ul></ul><ul><li>『 jdbc:h2:s2dao-sem 』で接続した場合 </li></ul><ul><ul><li>h2/bin/ にデータベースファイルが生成される </li></ul></ul><ul><li>sa/( パスワードなし ) で接続 </li></ul><ul><ul><li>CREATE USER 文も使えますが開発用の話なので割愛 </li></ul></ul>
    13. 13. Execute Query-汎用SQLクライアント <ul><li>JDBCドライバ経由で接続する汎用SQLクライアントです </li></ul><ul><li>検索結果のタブ表示 </li></ul><ul><li>SQLコマンド履歴 </li></ul><ul><li>関連をダイアグラム表示 </li></ul>参考: Execute Query http://executequery.org/ CSE よりエキスパート向き。私も練習中です
    14. 14. <ul><li>S2Dao についてもっと kwsk (詳しく) </li></ul>
    15. 15. O/Rマッピングとは? <ul><li>Object / Relational Mappingの略称 </li></ul><ul><li>オブジェクト指向言語で扱う「オブジェクト」と「リレーショナルデータベース(RDB)のレコード」をマッピング(対応付け)すること </li></ul><ul><li>オブジェクトへのデータ取得やオブジェクトデータの永続化といった処理を透過的に行うことができるようになる機構 </li></ul>
    16. 16. O/Rマッピングとは? <ul><li>インピーダンスミスマッチの解決策として登場 </li></ul>
    17. 17. Daoパターン <ul><li>D ata A ccess O bjectの略 </li></ul><ul><li>依存関係を疎にするための考え方 </li></ul><ul><li>永続ストレージ(DB)にアクセスする処理を、本来行うべき処理から離す </li></ul>プレゼンテーション xxAction ビジネスロジック xxLogic Dao xxDao DTO (DataTransferObject)
    18. 18. Seasar概要 <ul><li>軽量DIコンテナ </li></ul><ul><li>設定ファイルをほとんど書く必要がない </li></ul><ul><li>アプリケーションを修正したときでも再起動なしで即座にその変更を認識できる </li></ul><ul><ul><li>Hot Deploy(ホット・デプロイ):Seasar2.4から利用可 </li></ul></ul><ul><ul><li>スクリプト言語並みのさくさく感 </li></ul></ul>http://s2container.seasar.org/2.4/ja/  より引用
    19. 19. Seasar概要 <ul><li>設定ファイルを書かなくてもすむように、Convention over Configurationの考え方が取り入れられている。 </li></ul><ul><ul><li>Convention over Configurationとは、「適切な規約を守れば特に面倒な設定をしなくても、 フレームワークが自動的に適切な設定をしてくれるという考え」で、 Ruby on Railsによって 提唱されました。 Seasar2のConvention over Configurationは、Ruby on Railsから ヒントを得ました。 </li></ul></ul>http://s2container.seasar.org/2.4/ja/  より引用
    20. 20. Seasar概要 <ul><li>DI×AOP を実装するコンポーネント </li></ul><ul><ul><li>コア(必須コンポーネント)である S2Container が相当 </li></ul></ul><ul><ul><li>DI ( D ependency I njection) </li></ul></ul><ul><ul><li>AOP( A spect O riented P rogramming) </li></ul></ul><ul><li>トランザクションの自動制御、トランザクションと連動したコネクションプーリングを実装している </li></ul><ul><ul><li>POJO から簡単に利用可能 </li></ul></ul><ul><ul><li>POJO ( P lain O ld Java O bject) </li></ul></ul><ul><ul><li>Tomcat のような、 Servlet コンテナ上で動作させることができる </li></ul></ul>
    21. 21. <ul><li>S2Daoでよく使うアノテーション </li></ul>
    22. 22. アノテーションとは? <ul><li>JDK5から取り入れられたもの </li></ul><ul><li>プログラム中に補助的な情報を持たせることができる </li></ul><ul><li>メタデータ </li></ul><ul><li>Seasar2でもこれからはバンバン使われる予定 </li></ul><ul><li>例:@Override アノテーション(標準) </li></ul><ul><ul><li>オーバーライドを明示する。間違ってオーバーロードだった場合にコンパイルエラーにしてくれる </li></ul></ul><ul><li>メソッドやクラスに持たせることができるもの </li></ul>
    23. 23. アノテーションとは? <ul><li>アノテーションサンプル </li></ul>
    24. 24. アノテーションとは? <ul><li>アノテーションを取得する </li></ul>
    25. 25. Beanアノテーション(必須) <ul><li>Bean とテーブルの関連付け </li></ul><ul><li>クラス名からパッケージ名を除いた名前がテーブル名と一致する場合は、 Bean アノテーションを定義する必要はありません </li></ul><ul><li>versionNo による排他制御用のプロパティ名をデフォルトの versionNo から変えるときに使うのが versionNoProperty 属性。 </li></ul><ul><ul><li>変更前に取得したテーブル上の versionNo 値が、変更時に違う場合は UpdateFailureRuntimeException が発生する仕組み </li></ul></ul>
    26. 26. Idアノテーション <ul><li>ID アノテーションは主キーを指定します。 IdType でレコード追加時の ID 付与方法を設定。 </li></ul><ul><li>IdType.IDENTITY : IDENTITY による自動採番機能を使う場合( MySQL/SQLServer など) </li></ul><ul><li>IdType.SEQUENCE :順序による更新( Oracle/H2 など) </li></ul>
    27. 27. Columnアノテーション <ul><li>プロパティ名と実際のフィールド名が違う場合に利用 </li></ul>
    28. 28. S2Daoアノテーション <ul><li>Daoインタフェースに利用 </li></ul><ul><li>エンティティとの関連付けはここで行う </li></ul>
    29. 29. Argumentsアノテーション <ul><li>メソッドの引数を自動生成(または自分で作成)した SQL 文で参照できるように利用する </li></ul><ul><li>メソッドの引数名を指定 </li></ul><ul><li>メソッドの引数名はリフレクションで取得できないため </li></ul>
    30. 30. Queryアノテーション <ul><li>WHERE 句以降の SQL を指定できる </li></ul><ul><li>バインド変数形式 </li></ul><ul><li>Arguments アノテーションは不要 </li></ul><ul><li>後述の SQL コメントを利用した SQL も書ける </li></ul><ul><ul><li>この場合は Arguments アノテーションと併用 </li></ul></ul>
    31. 31. SqlFile アノテーション <ul><li>SQLの生成をS2Daoの自動生成ではなく、自分で外部ファイルに記述する場合に指定する </li></ul><ul><li>外部SQLファイルとは?これからお話します。 </li></ul>
    32. 32. <ul><li>S2Daoの外部SQL </li></ul>
    33. 33. 外部SQLファイル <ul><li>S2Dao の目玉となる機能 </li></ul><ul><li>O/R マッピングツールの「自動生成 SQL ダメじゃん」に応えてくれる機能 </li></ul><ul><li>関数を使うもよし </li></ul><ul><li>Group By 使うもよし </li></ul><ul><li>外部 SQL ファイルは同じパッケージ内に配置 </li></ul><ul><li>外部 SQL ファイルは、 [Dao インタフェース名 ]_[ メソッド名 ] _[DBMS サフィックス ] .sql の命名規則で </li></ul><ul><li>DBMS サフィックスを付けると、 DBMS ごとに別の SQL を発行してくれる。 </li></ul>
    34. 34. 外部SQLファイル <ul><li>DBMS と DBMS サフィックスの関係 </li></ul><ul><ul><li>Oracle : oracle </li></ul></ul><ul><ul><li>DB2 : db2 </li></ul></ul><ul><ul><li>MSSQLServer : mssql </li></ul></ul><ul><ul><li>MySQL : mysql </li></ul></ul><ul><ul><li>PostgreSQL : postgre </li></ul></ul><ul><ul><li>Firebird : firebird </li></ul></ul><ul><ul><li>MaxDB : maxdb </li></ul></ul><ul><ul><li>HSQL : hsql </li></ul></ul><ul><ul><li>Derby : derby </li></ul></ul><ul><ul><li>H2 : h2 </li></ul></ul>
    35. 35. 2Way-SQL <ul><li>2 WAY-SQL </li></ul><ul><ul><li>設計時も実行時も( 2WAY )そのまま使える SQL </li></ul></ul><ul><li>/*IF*/ - /*END*/ </li></ul><ul><ul><li>プロパティの評価によって SQL を変えたい場合 </li></ul></ul><ul><li>/*BEGIN*/ - /*END*/ 間について  </li></ul><ul><ul><li>ネストされた IF 条件が全てが false になった場合は何も出力しない。 例では select * from emp  になる  </li></ul></ul><ul><li>/* コメント */ のように、スペースをブロックコメントの内側に入れておけば本当のコメントも書ける </li></ul>
    36. 36. Beanのプロパティ <ul><li>型の決めかたについては以下を参考に </li></ul>
    37. 37. <ul><li>ページング </li></ul>
    38. 38. ページング <ul><li>データベース情報をコンフィグレーションする、「 j2ee.dicon 」ファイルを修正 </li></ul><ul><ul><li>どうせ毎回使うのでテンプレートとして持っておきたい </li></ul></ul><ul><li>org.seasar.dao.pager.DefaultPagerCondition </li></ul><ul><ul><li>ページングの条件となる、 Limit / Offset 値を設定するクラス </li></ul></ul><ul><ul><li>Dao メソッドの引数にするだけで適用される </li></ul></ul>
    39. 39. ページング <ul><li>j2ee.diconファイルの設定 </li></ul>Oracle の場合はこちらのブロックを有効に .. 接続設定もこのファイルに含まれる(資料中は省略)
    40. 40. ページング <ul><li>Dao 側のコード </li></ul><ul><ul><li>DefaultPagerCondition の引数に受けるだけ </li></ul></ul><ul><ul><li>DefaultPagerCondition を継承したサブクラスでも OK 。 </li></ul></ul><ul><ul><li>つまり、ページング以外のプロパティを書くことで、外だし SQL で参照できる。 </li></ul></ul>
    41. 41. ページング <ul><li>Dao呼び出し側のコード </li></ul>
    42. 42. <ul><li>トランザクション </li></ul>
    43. 43. トランザクション <ul><li>トランザクション機構を提供 </li></ul><ul><ul><li>S2Txと呼ばれているもの </li></ul></ul><ul><ul><ul><li>http://s2container.seasar.org/ja/tx.html </li></ul></ul></ul><ul><li>ちなみにコネクションプーリング機構も提供 </li></ul><ul><ul><li>S2DBCPと呼ばれている </li></ul></ul>サービス xxLogic xxAction xxService xxApp Dao xxDao Dao zzDao この境界にトランザクションを入れたい
    44. 44. トランザクション <ul><li>トランザクション境界にしたいクラスを dicon ファイルに登録 </li></ul><ul><li>Aspect タグに、 j2ee.requiredTx を組み込む </li></ul><ul><li>PointCut 属性を指定する </li></ul><ul><ul><li>省略可能なパターン </li></ul></ul><ul><ul><ul><li>インタフェースを実装しているクラスの場合は省略することで全てのメソッドに組み込まれる </li></ul></ul></ul>
    45. 45. <ul><li>リレーションシップへの対応 </li></ul>
    46. 46. リレーションシップ <ul><li>S2Dao はリレーションのマッピングに難あり </li></ul><ul><ul><li>ManyToOne( 多対 1) のサポートのみ </li></ul></ul><ul><ul><li>双方向関連、遅延ローディングの機構はない </li></ul></ul><ul><li>参考)リレーションシップの種類 </li></ul><ul><ul><li>ManyToOne (多対1) </li></ul></ul><ul><ul><li>OneToMany ( 1 対多) </li></ul></ul><ul><ul><li>OneToOne ( 1 対 1 ) </li></ul></ul><ul><ul><li>ManyToMany (多対多) </li></ul></ul><ul><ul><li>双方向関連、遅延ローディング (Lazy Loading: レイジー・ローディング)、 Fetch Join </li></ul></ul>例: S2Dao の ManyToOne
    47. 47. リレーションシップ対策 <ul><li>とはいえ、『 OneToMany : 1 対多』のパターンは良く使われるので何とかせねば。 </li></ul><ul><li>対策 </li></ul><ul><ul><li>Dao の呼び出し元で関連を組み立てる </li></ul></ul><ul><ul><ul><li>コードを追いやすい </li></ul></ul></ul><ul><ul><ul><li>(本質的ではない)コードが増える </li></ul></ul></ul><ul><ul><li>インターセプタ( S2AOP )を使う方法 </li></ul></ul><ul><ul><ul><li>コードはややスッキリ </li></ul></ul></ul><ul><ul><ul><li>呼び出し元から隠せる </li></ul></ul></ul>
    48. 48. インターセプタ(S2AOP)
    49. 49. インターセプタ(S2AOP) <ul><li>意味説明 </li></ul><ul><ul><li>[arg]DeptOneToManyInterceptor のコンストラクタに EmpDao を渡す </li></ul></ul><ul><ul><li>[aspect] メソッドインターセプタは、 DeptDao に適用する </li></ul></ul><ul><ul><li>[pointcut] 適用するメソッドは、 get または find で始まるメソッドのみ </li></ul></ul><ul><li>Dicon ファイルの記法については公式サイト参照(今回は割愛) </li></ul>
    50. 50. Beanにマッピングするのが面倒ならこうする <ul><li>Map[] 、 List<Map> で戻り値を受けることも可能。 </li></ul><ul><li>結合や Group By 、関数を使うような SQL が元になる場合、 Bean を用意してマッピングするのが面倒 </li></ul><ul><li>参照系(画面・帳票)はエンドユーザへの目立つアウトプットでもあり、仕様が変更されやすい。急ぎの修正になることもしばしば。 </li></ul><ul><li>(外出し) SQL と、画面の修正だけで完結させることが可能 </li></ul>
    51. 51. <ul><li>ところで、なぜインタフェースだけでおk? </li></ul>
    52. 52. S2Daoの処理構造 <ul><li>S2AOPが、ユーザ作成のDaoをインターセプト </li></ul><ul><li>自動的にサブクラスを生成して実行する </li></ul>EmpDao insert() update() delete() insert() update() delete() EmpDao$$EnhancedByS2AOP$$981ae0e34
    53. 53. S2Daoの処理構造 <ul><li>org.seasar.dao.interceptors.S2DaoInterceptor </li></ul><ul><li>インタフェースを捕捉。実行する SQL を生成して戻り値を返す </li></ul>
    54. 54. <ul><li>ユニットテスト </li></ul>
    55. 55. S2DaoTestCase <ul><li>S2DaoTestCaseという仕組みを利用する </li></ul><ul><ul><li>http://s2container.seasar.org/ja/testtech.html#S2DaoTestCase </li></ul></ul><ul><li>S2Unitの拡張として、データベースとの連携を実装したもの </li></ul>
    56. 56. S2DaoTestCase <ul><li>テストメソッドをトランザクション(自動ロールバック)化 </li></ul><ul><li>テストデータの作成機能 </li></ul><ul><ul><li>EXCEL ファイルをテーブルに書き出せる </li></ul></ul><ul><ul><li>テーブルの内容を EXCEL に書き出す機能もある </li></ul></ul><ul><ul><li>それぞれ、テスト以外の何かで使える機能 </li></ul></ul><ul><li>EXCEL ファイルを変数に取り込むことができる。 </li></ul><ul><ul><ul><li>org.seasar.extentison.dataset.DataSet </li></ul></ul></ul><ul><ul><ul><li>org.seasar.extentison.dataset.DataTable </li></ul></ul></ul><ul><li>S2Dao で取得した結果(結果セット)と EXCEL の内容を照合 (Asset) する機能 </li></ul>
    57. 57. S2DaoTestCase <ul><li>テストメソッドをトランザクション化 </li></ul><ul><ul><li>Tx をメソッドの末尾に付けるだけで自動ロールバック </li></ul></ul>
    58. 58. S2DaoTestCase <ul><li>EXCEL データの取り込み </li></ul><ul><ul><li>テーブルへのレコード追加 : readXlsWriteDb </li></ul></ul><ul><ul><li>テーブルの総入れ替え : readXlsAllReplaceDb </li></ul></ul><ul><li>EXCEL データの取り込み </li></ul><ul><ul><li>テーブルへのレコード追加 : readXlsWriteDb </li></ul></ul><ul><ul><li>テーブルの総入れ替え : readXlsAllReplaceDb </li></ul></ul>EXCEL2007 はダメです。 2003 は OK 。他不明 . ( jakarta-POI 次第)
    59. 59. <ul><li>その他 </li></ul>
    60. 60. 実行時のコンソールに注目! <ul><li>実際に発行した SQL を見ることができる </li></ul><ul><li>SQL ツールでそのままデバッグが可能 </li></ul><ul><li>ログファイルとして残すのも良し </li></ul><ul><li>閲覧には Log4j の設定 (log4j.properties) が必要 </li></ul>
    61. 61. 周辺ツールも充実 <ul><li>S2Dao-Plugin </li></ul><ul><ul><li>外部SQLファイルの存在を教えてくれる </li></ul></ul><ul><ul><li>外部SQLファイルの作成支援 </li></ul></ul>
    62. 62. 周辺ツールも充実 <ul><li>S2Dao-Codegen </li></ul><ul><ul><li>EXCEL 形式の定義書からソースコードを自動生成してくれる </li></ul></ul><ul><ul><li>Dao  ⇒  xx.dao パッケージ </li></ul></ul><ul><ul><li>エンティティ ⇒ xx.dto パッケージ </li></ul></ul><ul><ul><li>検索条件クラス ⇒ xx.finddto パッケージ </li></ul></ul>
    63. 63. S2Daoって本当にいいの?-Hibernateについて解説 <ul><li>マッピングの XML を書く </li></ul><ul><li>エンティティ( Bean) の作成 </li></ul><ul><ul><li>アノテーションなどの属性は不要 </li></ul></ul><ul><li>Dao クラスを書く </li></ul><ul><ul><li>API は何やらいろいろある </li></ul></ul><ul><ul><li>save(), load(), createCriteria(), list()… </li></ul></ul>S2Dao より学習コストが高いですぅ… orz
    64. 64. Seasar2繁華街マップ(w S2Container(Extention) S2Container(Framework) S2AOP S2Unit S2Tx S2DBCP S2JDBC アプリケーション Tuigwaa S2Dxo 開発ツール Kijimuna S2JSF Plugin Dolteng O/R マッピング S2Dao Kuina-Dao DBFlute S2Dao Plugin S2DaoCodegen プレゼンテーション S2Flex S2Struts S2JSF Teeda Mayaa Cubby 分散技術 S2RMI S2Axis S2JCA S2JMS Tugboat.GTD 別のツールと連携
    65. 65. <ul><li>補足情報 </li></ul>
    66. 66. H2 Database Engine-他DBへの接続 <ul><li>H2 のコンソールは JDBC ドライバがあるほとんどのデータベースに接続できます </li></ul><ul><li>下記は PostgreSQL に接続する例 </li></ul>set H2DRIVERS=pg74.216.jdbc3.jar @java -cp &quot;h2.jar;%H2DRIVERS%;%CLASSPATH%&quot; org.h2.tools.Server @if errorlevel 1 pause h2-otherdb.bat を新規作成。 JDBC ドライバを CLASS_PATH に含める JDBC ドライバの追加
    67. 67. Eclipseの便利な使い方 <ul><li>ワーキングセットの活用 </li></ul><ul><li>『エディターにリンク』の設定 </li></ul><ul><li>エディタのフォントはお好きなように </li></ul><ul><ul><li>私は“ Consolas” を使っています </li></ul></ul><ul><li>Limy プラグインで setter/getter を半自動化 </li></ul><ul><ul><li>http://www.limy.org/program/eclipse_plugin/ </li></ul></ul><ul><li>Vi / Vim な方は viPlugin もおすすめです( 25 ユーロ) </li></ul><ul><ul><li>http:// satokar.com/viplugin/index.php </li></ul></ul>
    68. 68. Eclipseの便利な使い方 <ul><li>ショートカット活用 </li></ul><ul><ul><li>パーツ最大化 : Ctrl + M </li></ul></ul><ul><ul><li>ビューの切り替え : Ctrl + F7 </li></ul></ul><ul><ul><li>ファイルの切り替え : Ctrl + F6 </li></ul></ul><ul><ul><li>インデント自動整形 : Shift + Ctrl + F </li></ul></ul><ul><ul><li>Import 文の自動補完 : Shift + Ctrl + O </li></ul></ul><ul><ul><li>コメントの自動生成 : Shift + Alt + J </li></ul></ul><ul><ul><li>名前変更(リファクタリング) : Shift + Alt + R </li></ul></ul><ul><ul><li>行を移動 : Alt + ↓ or Alt + ↑ </li></ul></ul><ul><ul><li>インタフェースの実装クラスを見る : Ctrl + T </li></ul></ul><ul><ul><li>実行コンテキストメニュー : Shift + Alt + X </li></ul></ul>
    69. 69. ご清聴ありがとうございました m(_ _)m http://d.hatena.ne.jp/morningmist7/

    ×