はじめに
iBATISはSQLを利用することに注力したフレームワークです。高機能なO/Rマッピングフレームワークに比べて簡単に理解でき、レガシーなJDBC、ResultSetを使ったプログラミングから簡単に乗り換えられます。
特にSQLを多用する人には使いやすいフレームワークです。
- SQLは使いたいがJDBCは低レベルすぎる
- 高機能なO/Rマッピングフレームワークは難しすぎる
- ソースコードからSQLを分離したいが動的なSQLの実装も必要
このようなケースで、iBATISは特に有効です。
本記事では、たくさんのサンプルソースを解説することで、「iBATISを使えばこんな風に書ける」ということが分かるようにしています。環境設定や、設定ファイルについての細かい説明は簡略化してあります。
対象読者
- Javaの基本をマスターしている人
- SQL文を理解している人
必要な環境
iBATIS 2.3.0、J2SE 5.0の環境を前提に解説しています。データベースの選択は自由ですが、サンプルプログラムはHSQLDBで動作確認しています。
サンプルデータベース
本記事で使用しているデータベースは1つのテーブルを使用しています。
CREATE TABLE DEPT ( DEPTNO NUMERIC(2) NOT NULL, DNAME VARCHAR(14), LOC VARCHAR(13), CONSTRAINT PK_DEPT PRIMARY KEY (DEPTNO) );
プログラミングの概要
iBATISを使うとどのようなプログラムになるのかを説明します。iBATISはSQL文を自分で定義します。定義したSQL文はそのままJDBCから発行されるので、RDBMSに依存した関数を利用することもできます。
SQL文はXMLファイルに定義し、idを割り振ります。
<select id="getDept" resultClass="examples.dto.Dept"> SELECT * FROM DEPT WHERE DEPTNO = #value# </select>
"getDept"というidでSQL文を定義しました。#value#が埋め込みパラメータだと簡単に予想できます。プログラムからはこのidを参照してSQLを利用します。
Dept dept = (Dept)sqlMap.queryForObject("getDept", 20);
埋め込みパラメータを指定してSQLを実行すると、結果が格納されたオブジェクトが得られます。
それでは、サンプルソースと併せてiBATISの利用例を紹介していきましょう。
利用の準備
プログラムからiBATISを利用するためにDB接続などの設定をします。
- 「SqlMapConfig」は、iBATIS全体の設定を行うファイルで、複数のsqlMapを参照するXMLファイルです。
- 「SqlMap」は、SQLやオブジェクトへのマッピングを記述するXMLファイルです。
SqlMapConfig
DB接続設定の記述や、使用するsqlMapファイルへの参照を記述します。このサンプルではDept.xml(後述)を参照しています。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"> <sqlMapConfig> <!-- DB接続設定 --> <transactionManager type="JDBC"> <dataSource type="SIMPLE"> <property name="JDBC.Driver" value="org.hsqldb.jdbcDriver"/> <property name="JDBC.ConnectionURL" value="jdbc:hsqldb:hsql://localhost/"/> <property name="JDBC.Username" value="sa"/> <property name="JDBC.Password" value=""/> </dataSource> </transactionManager> <!-- sqlMapファイル参照する --> <sqlMap resource="examples/sqlmap/maps/SqlMap-Dept.xml"/> </sqlMapConfig>
SqlMap
1つのSELECT文(getDept)を定義したSqlMapです。SqlMapファイル1つにSQLを複数定義できます。SqlMapファイルをいくつ作成しても構いません。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd"> <sqlMap> <!-- 1件検索 --> <select id="getDept" resultClass="examples.dto.Dept"> SELECT DEPTNO, DNAME, LOC as location FROM DEPT WHERE DEPTNO = #value# </select> </sqlMap>
SqlMapClientを返す
作成したSqlMapConfigを読みこみ、iBATISを利用するためのオブジェクトがSqlMapClientです。このオブジェクトは、長寿命でスレッドセーフであるため、アプリケーションで1つだけ生成すればOKです。SqlMapClientを一度だけ作成し取得するためのクラスを作成します。
package examples; import java.io.Reader; import com.ibatis.common.resources.Resources; import com.ibatis.sqlmap.client.SqlMapClient; import com.ibatis.sqlmap.client.SqlMapClientBuilder; /** * SqlMapClientを返すためのクラス */ public class MyAppSqlConfig { private static SqlMapClient sqlMap; static { try { String resource = "examples/SqlMapConfig.xml"; Reader reader = Resources.getResourceAsReader(resource); sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader); } catch (Exception e) { e.printStackTrace(); } } public static SqlMapClient getSqlMapInstance(){ //Singletoneとして利用 return sqlMap; } }
以上で、iBATISを利用する準備が整いました。サンプルプログラムをどんどん作成していきましょう。