Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

iBATISを使ったO/RマッピングによるDBアクセスの実例

iBATISの紹介とサンプルコード

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2007/06/07 14:00

ダウンロード サンプルソース (8.0 KB)

iBATISはSQLを利用することに注力したフレームワークです。高機能なO/Rマッピングフレームワークに比べて簡単に理解でき、レガシーなJDBC、ResultSetを使ったプログラミングから簡単に乗り換えられます。今回は、iBATIS(Java)の紹介と、基本的なサンプルプログラムを紹介します。

目次

はじめに

 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を割り振ります。

SQL定義の例
<select id="getDept" resultClass="examples.dto.Dept">
    SELECT * FROM DEPT
    WHERE DEPTNO = #value#
</select>

 "getDept"というidでSQL文を定義しました。#value#が埋め込みパラメータだと簡単に予想できます。プログラムからはこのidを参照してSQLを利用します。

Javaプログラムからの利用
Dept dept = (Dept)sqlMap.queryForObject("getDept", 20);

 埋め込みパラメータを指定してSQLを実行すると、結果が格納されたオブジェクトが得られます。

 それでは、サンプルソースと併せてiBATISの利用例を紹介していきましょう。

利用の準備

 プログラムからiBATISを利用するためにDB接続などの設定をします。

  • 「SqlMapConfig」は、iBATIS全体の設定を行うファイルで、複数のsqlMapを参照するXMLファイルです。
  • 「SqlMap」は、SQLやオブジェクトへのマッピングを記述するXMLファイルです。

SqlMapConfig

 DB接続設定の記述や、使用するsqlMapファイルへの参照を記述します。このサンプルではDept.xml(後述)を参照しています。

SqlMapConfig.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ファイルをいくつ作成しても構いません。

SqlMap-Dept.xml
<?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を一度だけ作成し取得するためのクラスを作成します。

MyAppSqlConfig.java
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を利用する準備が整いました。サンプルプログラムをどんどん作成していきましょう。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

修正履歴

  • 2007/07/10 16:52 SqlMapClient.javaのファイル名のtypoを修正 Sample01_SelectOne.javaのファイル名のtypoを修正 全件検索時のSQLにFROM句が2つある誤りを修正

著者プロフィール

バックナンバー

連載:iBATISを使ったO/RマッピングによるDBアクセスの実例
All contents copyright © 2005-2018 Shoeisha Co., Ltd. All rights reserved. ver.1.5