Seasar Conference 2006 Spring DBを 256倍 活用する方法 ~S2Dao PHP/.NET/Java. 2006.05.14 S2Dao.PHP5 コミッタ 漢 祐介 © The Seasar Foundation and the others 2006. all rights reserved. 1 自己紹介 • • • • 名前:漢 祐介(Hata Yusuke) HN:nowel ブログ: http://blog.xole.net/ ふつーのプログラマ – SQLとO/Rマッパーに悩まされ、はや社会人2年目 – 最近はJavaScriptプログラマになりつつある... • メール:[email protected] Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 2 アジェンダ • • • • • • • ソフトウェア開発の現状 O/Rマッピングとは? O/Rマッピングの問題点 S2Daoとは? S2Daoの特徴 S2Daoでの開発手法 まとめ Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 3 ソフトウェア開発の現状 • DBは切っても切り離せない大事な存在 • SQLの知識量の差は個人でとても大きい – SQLは書けるけど、難しい部分はJava(PHP/C#/VB)で – Javaにやらせるくらいなら欲しい部分をSQLで • 同じシステムなのにDBMSが統一されない – この前はOracleで今回はPostgreSQL, MySQL… • DBMSへのアクセスは主に2パターン – O/Rマッピング派 – SQLバリバリ派 Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 4 O/Rマッピングとは? • O/Rマッピングとは? – Object Relational Mappingの略 – オブジェクト指向言語とRDBを結びつける仕組み • • • • SQLを書かなくともDB操作が可能(初心者にやさしい) SQLの結果はオブジェクト DBMSを気にせずに共通のAPI マッピング方法は使うツールによって様々 – 主要なO/Rマッパー • Hibernate(Java), Propel(PHP), ObjectSpaces(.NET) Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 5 O/Rマッピングの問題点 • O/Rマッピングの問題点 – XML地獄じゃん テーブル毎に…orz クエリ毎に…orz マッピングの度に…orz – 発行されるSQLがダメじゃん • O/RマッパーはDBサーバの事を考えてくれません… – さらにはテーブルの内容まで知っているわけもなく… • 俺に書かせた方が早い!って場合も何度か… • 回りくどいロジックを書く事にも… Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 6 S2Daoとは? • S2Daoとは? – 呼び名:えすつーだお – Seasarファンデーション大人気のプロジェクト • DAO(Data Access Object)パターンを使ったO/Rマッパー • 基本的なO/Rマッパーの機能+α • 人気の秘密はここには書ききれないので、この後に紹介 – S2Daoは以下の言語で使えます。 • Java(S2Dao) • PHP(S2Dao.PHP5) • .NET(S2Dao.NET) どんな言語でも使える! Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 7 S2Daoの特徴 • S2Daoの特徴(人気の秘密) XML不要 DBドライバ(JDBC等)の知識は不要 2Way-SQL(SQLの自動生成と手書きSQL) SQLの自動生成 SQLファイルを用意し、それに記述されているSQL文を発行させる ことができます。 SQL文へのバインド 複雑な手書きSQLも実行できます。 SQLコメントを使ってSQL文を動的に変更 SQL(DB)プログラマとの分業が可能 Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 8 2Way-SQL • 2Way-SQL ほとんどの場合自動生成されたSQLで間に合うけど・・・ もっと最適化可能だ!って場合もあります。 SQLは自分で管理だ!って場合もあります。 手書きで書かれた高度なSQLが使えます。 複雑なクエリを実行させたい場合はこれでバッチリ 誰かに書いてもらうことができます。 部分的にSQLを書くこともできます。 WHERE句だけ書きたいとか ORDER BY句だけ書きたいとか Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 9 SQLプログラマとの分業が可能 • 分業が可能なのは実は重要! – デザイナとプログラマは分業できるのに、SQLのプロと分業で きなかった… • 下手なSQLしか書けないのに書かされる現実 – 昔は「遅い」を理由に本業をほったらかしでSQLチューニング • SQLプログラマがいる! – 欲しい結果だけを書けるのも結構重要 • SQL*PlusとかCSEとか便利なツールで欲しい部分だけ取 得できるSQLを書ける – 遅くなる理由を無くしていきましょう • SQL文へのバインドでより便利に Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 10 S2Daoでの開発手法 • S2Daoでの開発はスゴく簡単 1.テーブルのエンティティ(Bean)を書く 2.Dao(インタフェース)を書く 3.ダイコンファイルにアスペクトを書く 後はDaoにメソッドを書いていくだけ 更新系ならinsert/update/deleteのようなメソッド 取得系なら戻り値をListなどのメソッド Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 11 S2Daoでの開発手法 • エンティティを書く(顧客テーブル:Customer) Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 12 S2Daoでの開発手法 • エンティティを書く(PHPクラス) <?php class Customer { private $coNo; private $name; private $addr; private $tel; private $opt; テーブル名 カラム名 : プロパティへのsetter/getterメソッド : } ?> Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 13 S2Daoでの開発手法 • Dao(インタフェース)を書く 先ほど書いた エンティティ <?php interface CustomerDao { const Bean = “Customer”; } ?> <?php class Customer { private $coNo; private $name; private $addr; private $tel; private $opt; pulic function setter($hoge){ $this->property = $hoge; } 結び付ける public function getter(){ return $this->property; } } ?> Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 14 S2Daoでの開発手法 ダイコンファイルにアスペクトを書く 先ほど書いた CustomerDao <?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE components <?php PUBLIC "-//SEASAR//DTD S2Container//EN" interface CustomerDao "http://www.seasar.org/dtd/components.dtd"> const Bean = “Customer”; <components> } <include path="dao.dicon"/> ?> <component class="CustomerDao"> <aspect>dao.interceptor</aspect> </component> </components> { Daoに対してアスペ クトする Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 15 S2Daoでの開発手法 • どんどんDaoにメソッドを書く – とりあえず全件取得のメソッドが欲しい(getCustomres) <?php interface CustomerDao { エンティティが const Bean = “Customer”; 入ったListで取得 /** 何も指定をしない * @return list と全件取得 */ public function getCustomers(); } ?> Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 16 S2Daoでの開発手法 • どんどんどんどんDaoにメソッドを書く – 顧客をアップデートしくなった(update) <?php interface CustomerDao { const Bean = “Customer”; /** * @return list */ public function getCustomers(); updateメソッドで 更新処理をやってくれ ます。 insertは追加 deleteは削除等 public function update(Customer $custmer); } ?> Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 17 S2Daoでの開発手法 • どんどんどんどんどんどんDaoにメソッドを書く – 手書きSQLを使いたくなった。 (CustomerDao_getCustomersByMen.sql) interface CustomerDao { const Bean = “Customer”; /** * @return list */ public function getCustomer(); public function update(Customer $custmer); SQLファイルを書 いて メソッドを追加する /** * @return list */ public function getCustomersByMen(); } Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 18 S2Daoでの開発手法 • SQLを書いてもらう手順(IPMsgなどで頼む) SQLプログラマに 書いてもらちゃっ たり ※画像は想像上のものです。 Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 19 S2Daoでの開発手法 • 実行ファイルを書く。 <?php require_once “seasarcon2006.php”; $container = S2ContainerFactory::create("costomer.dicon"); $dao = $container->getComponent("CustomerDao"); $customers = $dao->getCosutomers(); $customer = $customers->get(1); $customer->setName(“Mike”); $dao->update($customer); $mens = $dao->getCustomersByMen(); var_dump($mens); ?> Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 20 S2Daoでの開発手法 • 実行後のテーブル Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 21 S2Daoでの開発手法 • アノテーションを駆使して便利に • Beanに対するアノテーション – TABLEアノテーション(テーブルとの関連付け) – COLUMNアノテーション(カラムとの関連付け) – N:1マッピング(テーブル同士の関連付け) – Idアノテーション(プライマリーキーに対するアノテーション) – VERSION_NO_PROPERTY • カラムのバージョン番号で排他制御 – TIMESTAMP_PROPERTY • カラムのタイムスタンプで排他制御 Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 22 S2Daoでの開発手法 • Daoに対するアノテーション – BEANアノテーション(DaoとBeanの関連付け) – ARGSアノテーション • SQLバインド時などにメソッドの引数をSQLで参照 – QUERYアノテーション(自動生成されるSQLに別のSQLを追加) – SQLアノテーション • 呼び出したメソッド名で実行されるSQLを設定 – NO_PERSISTENT_PROPS / PERSISTENT_PROPS アノテーション • SQLに追加したくないプロパティを設定 – PROCEDUREアノテーション • ストアドプロシージャやストアドファンクションを実行 Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 23 S2Daoでの開発手法 • カラム名が変わった・・・orz – ある日、顧客住所カラム(addr)がaddressに! – COLUMNアノテーションを使う class Customer { private $coNo; private $name; const addr_COLUMN = “address” private $addr; private $tel; private $opt; public function setter/getter(){ : } COLUMNアノテーシ ョンで カラム名とプロパティ のマッピング } Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 24 S2Daoでの開発手法 • テーブル名が変わった・・・orz – ある日、顧客テーブル(Customer)がKokyakuに! – TABLEアノテーションを使う class Customer { const TABLE = “Kokyaku”; private $coNo; private $name; const addr_COLUMN = “address” private $addr; private $tel; private $opt; public function setter/getter(){ : } TABLEアノテーショ ンで テーブル名とエンテ ィティをマッピング } Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 25 まとめ • DBを256倍 活用する 方法 = S2Dao • S2Daoは使う人を選びません – SQLバリバリ派もO/Rマッパでラクラク派も – O/Rマッパで挫けそうになった人も • S2Daoは痒いところに手が届きます。 – 届かなかったらMLに投げてください m(_ _)m • S2Daoは使うを言語を選びません – Javaあります。PHPあります。.NETあります。 – S2Daoを選ばない理由が無くなりつつあります。 Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 26 ご参考 • S2Dao – http://s2dao.seasar.org/ • S2Dao.PHP5 – http://s2dao.php5.sandbox.seasar.org/ • S2Dao.NET – http://s2dao.net.sandbox.seasar.org/ Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 27 Let's Fun S2Dao!! ありがとうございました。 Seasar Conference 2006 Spring © The Seasar Foundation and the others 2006. all rights reserved. 28
© Copyright 2024 ExpyDoc