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