• []
  • []
  •  
  • del.icio.us 
  •  
  • Yahoo!֥åޡϿ 

PRADO SqlMapを利用する

PHP 求人 募集 Symfony CakePHP Smarty Ruby on Rails

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)のメソッドを駆使することになる。
ここではメソッド群を列挙しておこう。

Methoddetail
queryForObjectExecutes a Sql SELECT statement that returns that returns data to populate a single object instance.
queryForListExecutes a Sql SELECT statement that returns data to populate a number of result objects.
queryWithRowDelegateRuns a query for list with a custom object that gets a chance to deal with each row as it is processed.
queryForPagedListExecutes 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.
queryForPagedListWithRowDelegateExecutes 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.
queryForMapExecutes the SQL and retuns all rows selected in a map that is keyed on the property named in the keyProperty parameter.
queryForMapWithRowDelegateRuns a query with a custom object that gets a chance to deal with each row as it is processed.
insertExecutes a Sql INSERT statement.
update Executes a Sql UPDATE statement.
deleteExecutes a Sql DELETE statement.

framework/prado/database/sqlmap.txt · 最終更新: 2007/08/29 19:31 by dozo