Document

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