Quickスタート | Robbie DAOについて | ダウンロード | 開発ガイド | JavaDoc | Robbie.JPについて |
Quickスタート
このページでは、とりあえずRobbie DAOのXDaoを利用してSQLを実行するまでの流れを簡単に紹介します。

1. ライブラリのダウンロード
このサイトのダウンロードページからSourceForgeへのリンクがあります。SourceForgeのRobbie DAOプロジェクトから、robbie-dao_1.3.1.zipをダウンロードします。このZIPファイルの中には、以下のようなものが格納されています。

robbie-dao.jar 実行ライブラリ。JDK1.4.2_12でコンパイルしています。
robbie-dao-src.zip ソースファイル。
robbie-dao-api.zip JavaDocドキュメント
commons-logging.jar commons-loggingライブラリ。実行時に必要です。
commons-beanutils.jar commons-beanutilsライブラリ。実行時に必要です。
jdom.jar JDOMライブラリ。実行時に必要です。


2. XMLの作成
XMLファイルにデータベース接続情報、実行DAOクラス、実行SQLを記述します。

データベース接続情報
ドライバクラス名 oracle.jdbc.driver.OracleDriver
接続URL jdbc:oracle:thin:127.0.0.1:1521:ORCL
ユーザ名 test
パスワード test
(※)もし、ローカル環境にOracleデータベースの環境がない場合には、接続URLやドライバクラス名などを適切なデータベース製品用のものに変更してください。

実行DAOクラス
robbie.dao.x.XDao

実行SQL
SELECT ID, NAME, AGE FROM TEST_TABLE

上記の設定をXMLへ記述したのが以下になります。


XMLファイル記述例:

<?xml version="1.0" encoding="Windows-31J" ?>
<!DOCTYPE dao-configuration SYSTEM 
    "http://www.robbie.jp/dtd/robbie-dao_1.2.dtd">

<dao-configuration>
  
  <!-- Database Resource List -->
  <resource-list>
    <resource id="TestJDBC" type="JDBC">
      <driver>oracle.jdbc.driver.OracleDriver</driver>
      <url>jdbc:oracle:thin:127.0.0.1:1521:ORCL</url>
      <username>test</username>
      <password>test</password>
    </resource>
  </resource-list>
  
  <!-- DAO List -->
  <dao-list>
    <dao id="TestDAO">
      <class>robbie.dao.x.XDao</class>
      <resource-ref>TestJDBC</resource-ref>
    </dao>
  </dao-list>
  
  <!--  SQL List -->
  <query-list>
  
    <query id="test">
      SELECT ID, NAME, AGE FROM TEST_TABLE
    </query>
  
  </query-list>

</dao-configuration>

      
上記の記述をクラスの実行ディレクトリから見て、「etc/test-config.xml」に保存します。この制御XMLを使用して、データベースアクセスが実行されます。

なお、このデータベースアクセスに必要なOracle用のDDLとDMLは以下のようになります。

connect / as sysdba
/
create user test identified by test
/
grant dba to test
/
connect test/test
/
create table test_table (
  id number(3) primary key,
  name varchar2(16),
  age number(3)
)
/
insert into test_table values(0, 'AAA', 15)
/
insert into test_table values(1, 'BBB', 16)
/
insert into test_table values(2, 'CCC', 17)
/
insert into test_table values(3, 'DDD', 18)
/
commit
/

      


3. テストクラスの作成と実行
データベースへのアクセスの実行は、簡単な検索や簡単な更新処理であれば、robbie.dao.x.XDaoFactoryクラスとrobbie.dao.x.XDaoクラスのみで実行することが可能です。
下記のように、XDao#query()を実行することによって、検索された1レコードを1Mapに格納したListを取得できます。

データベースアクセスのテストクラス:

package example;

import java.util.List;

import robbie.dao.x.XDao;
import robbie.dao.x.XDaoFactory;

public class Test {
    
    public static final void main(String[] args) {
        // DAOインスタンスの生成
        XDaoFactory factory = new XDaoFactory("etc/test-config.xml");
        XDao dao = factory.createDaoInstance("TestDAO");
        
        // DAOの実行
        List result = dao.query("test", null);
        
        // DB接続が全て終了したらDAOをリリース
        dao.release();
        
        System.out.println(result);
    }
}

      
上記のクラスでは、「TestDAO」というIDを指定してDAOクラスを生成し、「test」というSQLを指定してデータベースアクセス処理を実行しています。

正常にデータベースアクセスが行われたら、以下のような実行結果が画面へ出力されます。
      
 List.size()=4
 0) type:robbie.util.Map value:Map.size()=3
   0) key:ID(java.lang.String) value:0(java.math.BigDecimal)
   1) key:NAME(java.lang.String) value:AAA(java.lang.String)
   2) key:AGE(java.lang.String) value:15(java.math.BigDecimal)
 
 1) type:robbie.util.Map value:Map.size()=3
   0) key:ID(java.lang.String) value:1(java.math.BigDecimal)
   1) key:NAME(java.lang.String) value:BBB(java.lang.String)
   2) key:AGE(java.lang.String) value:16(java.math.BigDecimal)
 
 2) type:robbie.util.Map value:Map.size()=3
   0) key:ID(java.lang.String) value:2(java.math.BigDecimal)
   1) key:NAME(java.lang.String) value:CCC(java.lang.String)
   2) key:AGE(java.lang.String) value:17(java.math.BigDecimal)
 
 3) type:robbie.util.Map value:Map.size()=3
   0) key:ID(java.lang.String) value:3(java.math.BigDecimal)
   1) key:NAME(java.lang.String) value:DDD(java.lang.String)
   2) key:AGE(java.lang.String) value:18(java.math.BigDecimal)
      
ここまでで、XML内に定義したSQLを使用してデータベースへアクセスし、問い合わせ結果をMapのListで取得しました。


4. 検索条件を設定する(変数をセットする)
さて、現実のデータベースアクセスでは検索条件を指定して問い合わせを行ったり、入力したデータによってデータベースを更新します。そこで、ここではバインド変数をセットしてデータベースアクセスを行ってみましょう。

まず、XMLにSQLを追加します。
  
  <!--  SQL List -->
  <query-list>
  
    <query id="test">
      SELECT ID, NAME, AGE FROM TEST_TABLE
    </query>
    
    <query id="test2">
      SELECT ID, NAME, AGE FROM TEST_TABLE
      <where>
        <var key="age" req="false">AGE = ?</var>
      </where>
    </query>
    
  </query-list>

</dao-configuration>
      
最初に作成したSQLに新たにwhere要素とvar要素が追加されました。この追加された要素のうち、var要素がバインド変数となります。

次に、新しいテストクラスを作成します。
検索条件を指定するデータベースアクセスのテストクラス:
      
package example;

import java.util.List;
import java.util.Map;
import java.util.HashMap;

import robbie.dao.x.XDao;
import robbie.dao.x.XDaoFactory;

public class Test2 {

    public static final void main(String[] args) {
        // DAOインスタンスの生成
        XDaoFactory factory = new XDaoFactory("etc/test-config.xml");
        XDao dao = factory.createDaoInstance("TestDAO");
      
        // 検索条件の設定
        Map params = new HashMap();
        params.put("age", new Integer(16));
      
        // DAOの実行
        List result = dao.query("test2", params);
        
        // DB接続が全て終了したらDAOをリリース
        dao.release();
        
        System.out.println(result);
    }
}
      
最初のクラスと違い、バインド変数を格納したMapを作成して、daoオブジェクトへ引数として渡します。この時のMapのKEYがXMLのkey属性の値と一致していることに、注目してください。

正常に実行されると、以下のような実行結果が画面へ出力されます。

 List.size()=1
 0) type:robbie.util.Map value:Map.size()=3
   0) key:ID(java.lang.String) value:1(java.math.BigDecimal)
   1) key:NAME(java.lang.String) value:BBB(java.lang.String)
   2) key:AGE(java.lang.String) value:16(java.math.BigDecimal)
      
AGE = 16 に一致するレコードだけが抽出されました。なお、この時実行されたSQLは以下のようになります。
2006-07-17 18:06:36,330 DEBUG (XQuery.java:94行目) 
Query-ID=[test2]

[Query =
 BEANS-CLASS=[null]
 Query-STRING=[
    
      SELECT ID, NAME, AGE FROM TEST_TABLE
      WHERE 
         AGE = ?
      
    ]
 BIND-PARAMETERS=[
    id:1 value:16 type:null
 ]
]
      
こちらのSQLはログファイルへDEBUGレベルで出力されています。


5. 実行結果をJavaBeansのListとして取得する
最近というわけでもないですが、View層で出力を行う際にJavaBeansを使用するコンポーネントやTaglibなどが多く見られます。XDAOではデータベースからの検索結果を2次元配列、MapのList、JavaBeansのListおよび、Jakarta BeanutilsのDynaBeanのListで取得することが可能です。ここではJavaBeansで出力する方法について説明します。

まず、検索結果を保持するJavaBeansを作成します。
データを保持するJavaBeans:

package example;

public class TestBean {
    
    public TestBean() {}
    
    private int id;
    private String name;
    private int age;
    
    public void setId(int id) { this.id = id;}
    
    public int getId() { return this.id;}
    
    public void setName(String name) { this.name = name;}
    
    public String getName() { return this.name;}
    
    public void setAge(int age) { this.age = age;}
    
    public int getAge() { return this.age;}
    
    public String toString() {
        return "[ id=" + this.id + "  name=" + this.name + "  age=" + this.age + " ]";
    }
}
      
次にSQLを追加します。
  
  <!--  SQL Config List -->
  <query-list>
  
    <query id="test">
      SELECT ID, NAME, AGE FROM TEST_TABLE
    </query>
    
    <query id="test2">
      SELECT ID, NAME, AGE FROM TEST_TABLE
      <where>
        <var key="age"req="false">AGE = ?</var>
      </where>
    </query>
    
    <query id="test3" result="example.TestBean">
      SELECT ID, NAME, AGE FROM TEST_TABLE
      <where>
        <between from="age_from" to="age_to" req="true">AGE BETWEEN ? AND ?</between>
      </where>
    </query>
  
  </query-list>

</dao-configuration>
      
今回はvar要素以外の要素として、between要素を使用して検索を行ってみます。
実行結果をJavaBeansのListで取得するデータベースアクセスのテストクラス:

package example;

import java.util.List;
import java.util.Map;
import java.util.HashMap;

import robbie.dao.x.XDao;
import robbie.dao.x.XDaoFactory;

public class Test3 {

    public static final void main(String[] args) {
        // DAOインスタンスの生成
        XDaoFactory factory = new XDaoFactory("etc/test-config.xml");
        XDao dao = factory.createDaoInstance("TestDAO");

        // 検索条件の設定
        Map params = new HashMap();
        params.put("age_from", new Integer(15));
        params.put("age_to", new Integer(16));
        
        // DAOの実行
        List result = dao.queryForBeans("test3", params);
        
        // DB接続が全て終了したらDAOをリリース
        dao.release();
        
        System.out.println(result);
    }
}
      
JavaBeansのListを取得する場合には、queryForBeans(String)メソッドを利用します。検索結果をexample.TestBeanのListとして取得するためにquery要素のresult属性にexample.TestBean指定しています。また、BETWEEN句に用いるパラメータのために2つのデータをパラメータMapに追加しています。

正常に実行されると、以下のような実行結果が画面へ出力されます。

 List.size()=2
 0) type:example.TestBean value:[ id=0  name=AAA  age=15 ]
 1) type:example.TestBean value:[ id=1  name=BBB  age=16 ]
      
これまでMapの中身が表示されていたのが、example.TestBeans#toString()が表示されています。XDAOはカラム名から自動的にプロパティ名を決定し、そのプロパティへデータをセットしています。(→ マッピングの詳細はこちら)

上記の処理で実行されたSQLは以下のようになります。
 Query-ID=[test3]
 [Query =
  Query-STRING=[
     
       SELECT ID, NAME, AGE FROM TEST_TABLE 
       WHERE 
          AGE BETWEEN ? AND ?
       
     ]
  BIND-PARAMETERS=[
     id:1 value:15 type:null
     id:2 value:16 type:null
  ]
 ]
    


6. 最後に
以上で、Quickスタートは終了です。robbie.dao.x.XDaoによるSQLの実行は、ここで紹介したwhere、var、between要素以外に、const、repeat、list、switch、subqueryなどの要素を使用して、様々な動的なSQLを実行が可能です。詳しくは開発ガイドを参照してください。

また、このQuickスタートで使用したソースコードとXMLがダウンロードできます。
ダウンロードはこちらから


Copyright 2006 Robbie.JP