- []
- []
PRADO SqlMapを利用する
PRADO SqlMapを利用する 概要
SqlMapとはActiveRecordとは性質の異なるORマッピングツール。
重点に置いているのはActiveRecordではテーブルだが、
SqlMapで重要視しているのはSQL。
SQLをベースにしたORマッピングツールと言える。
iBatis Data MapperというJavaのORマッパーがあるのだが、
これを参考に作成されている。
PRADO SqlMapを利用する 詳細
PRADO SqlMapのマップデータを作成
SQLを記述したマップデータを作成する。
「PRADO ActiveRecordを利用する」で作成したスキーマクラスdbUserも利用する。
/protected/database/sqlmap.xml
<?xml version="1.0" encoding="utf-8" ?> <sqlMapConfig> <select id="getUserAll" resultClass="Application.database.dbUser"> SELECT username, email FROM users </select> <select id="getUserByEmail" resultClass="Application.database.dbUser"> SELECT username, email FROM users WHERE email = #email# </select> </sqlMapConfig>
PRADO SqlMapを設定
SqlMapの設定をapplication.xmlに記述する。
/application.xml
<modules> ・・・ <!-- DATABASE --> <module id="db1"> <database ConnectionString="mysql:host=localhost;dbname=test" username="dbuser" password="dbpass" Active="false" /> </module> <!-- ACTIVE RECORD --> <module class="System.Data.ActiveRecord.TActiveRecordConfig" ConnectionID="db1" EnableCache="true" /> <!-- SqlMap --> <module id="sqlmap" class="System.Data.SqlMap.TSqlMapConfig" EnableCache="true" ConfigFile="Application.database.sqlmap" ConnectionID="db1" /> </modules>
PRADO SqlMapを利用する
コード上でSqlMapを利用する。
サンプルではonLoadで利用しているが、
実際は必要なビジネスロジック上で行う。
class Home extends TPage { function onLoad($param) { parent::onLoad( $param ); $sqlmap = $this->Application->Modules['sqlmap']->Client; $sqlmap->DbConnection->Active = true; $trans = $sqlmap->DbConnection->beginTransaction(); $userObjs = $sqlmap->queryForObject('getUserAll'); foreach( $userObjs as $userObj ) print_r( $userObj ); $trans->commit(); } }
Activeは設定ファイルで自動接続に切り替えることも可能だが、
無駄な接続はなるべくしない方が良いので、
必要な時にActiveに変更するようにする方が望ましい。
DBがMyISAMな上、データ取得なのであまりトランザクションは関係ないが一応載せておく。 DBをSqliteにした場合はselectでもトランザクションは必要。
PRADO SqlMapの単体テスト
テストファーストというのはなにもプログラムに限ったことではなく、
SQLでもユニットテストを行うことは非常に重要である。
ただ、データが空ではテストできないと言うのが
多少、やりづらいところではある。
ただ、最近のデータベース設計ツール、SQLクエリツールは良くできていて、
それらを駆使することで負担は軽減できる。
私がデータベース設計で利用しているツールは以下の二つ。
これらの詳細は今回は省く。
単体テストについてはこちらを参考して欲しい。
PRADO 単体および機能テスト
ここではテストケースのサンプルをあげておこう。
username = 'dozo', email = 'dozo@matrix.jp'
というデータが入っていたとすると、 /tests/unit/dbUsertest.php
<? class dbUserTest extends UnitTestCase { public function testDbUser() { // initialize $app = Prado::getApplication(); $sqlmap = $app->Modules['sqlmap']->Client; // set data $user = new stdClass; $user->email = "dozo@matrix.jp"; // get data $userObj = $sqlmap->queryForObject("getUserByEmail", $user ); $this->assertIsA( $userObj, "dbUser", "class: ". get_class( $userObj ) ); $this->assertEqual( $userObj->username, "dozo", get_class( $userObj )."->username: ". $userObj->username ); // $this->dump( $userObj ); } }
PRADO SqlMap 解説
Active Recordははっきり言って重くて使い物にならない。
なのでデータベース接続のメインはPDOまたはSqlMapということになる。
SQLをプログラム上に書くとメンテナンスが難しくなってしまうため、
可能な限りSqlMapを利用することを薦める。
Active Record同様、SqlMap(正確に言うとTSqlMapGateway)のメソッドを駆使することになる。
ここではメソッド群を列挙しておこう。
Method | detail |
---|---|
queryForObject | Executes a Sql SELECT statement that returns that returns data to populate a single object instance. |
queryForList | Executes a Sql SELECT statement that returns data to populate a number of result objects. |
queryWithRowDelegate | Runs a query for list with a custom object that gets a chance to deal with each row as it is processed. |
queryForPagedList | Executes the SQL and retuns a subset of the results in a dynamic TPagedList that can be used to automatically scroll through results from a database table. |
queryForPagedListWithRowDelegate | Executes the SQL and retuns a subset of the results in a dynamic TPagedList that can be used to automatically scroll through results from a database table. |
queryForMap | Executes the SQL and retuns all rows selected in a map that is keyed on the property named in the keyProperty parameter. |
queryForMapWithRowDelegate | Runs a query with a custom object that gets a chance to deal with each row as it is processed. |
insert | Executes a Sql INSERT statement. |
update | Executes a Sql UPDATE statement. |
delete | Executes a Sql DELETE statement. |
- ブックマークショートカット