このページでは、とりあえず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クラス
実行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がダウンロードできます。
ダウンロードはこちらから