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