IBatis

提供: Astarisk Works Wiki

JavaのO/RマッピングツールiBatisのメモ。

このページで対象にしているのはiBatis 2.3.4。 iBatis 3がリリースされたのでそのうち試したいが...。

目次

iBatisとは

JDBCの煩雑な実装をしなくてもDB操作ができるO/Rマッパー。

設定ファイルが少々多いが、SQLをクラスにマッピングでき、DBをよく知っている人には直感的に利用できる。

Hibernate等に比べるとシンプルな構成。

最近は.net版もあるようだ。

使うための準備

iBatisを使うためには次の準備が必要。

  1. ライブラリのダウンロード
  2. beanクラスの実装
  3. sqlMapConfig.xmlの作成
  4. SQLマッピングファイルの作成

ライブラリのダウンロード

次のサイトがiBatisのホーム。そこからダウンロードできる。

iBATIS Home

beanクラスの実装

データベースのテーブルと対応づけるbeanクラスを実装する。このbeanはPOJOでよい。

基本は1テーブル1クラスだけど、実際にはマッピングファイルで関連づけるので、読み出すだけなら複数テーブルを一つのクラスにマッピングすることも可能だと思う。

sqlMapConfig.xmlの作成

iBatisの動作に必要な基本的な設定を行うファイルを作成する。

iBatisの動作設定のほかデータベースの接続先や後述するマッピングファイルの場所を記述する。

マッピングファイルを追加するにはsqlMap タグを追加していけばよい。

<?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>
	<settings
	 cacheModelsEnabled="true"
	 statementCachingEnabled="true"
	 enhancementEnabled="true"
	 classInfoCacheEnabled="true"
	 lazyLoadingEnabled="false"
	 />

	<sqlMap url="com/sample/Person.xml" />
	<sqlMap url="com/sample/Company.xml" />

</sqlMapConfig>
</configuration>

SQLマッピングファイルの作成

実行するSQLを定義しするファイル。

SELECT文の結果は先述のBeanに格納されて帰ってくるので、DBのスキーマとBeanのプロパティとのマッピングも定義する。 テーブルとクラスを1対1で対応づけ、テーブルカラム名とBeanのプロパティ名をあわせれば、マッピングは省略できる。

検索条件の有無に従ってWhere文の長さを調整できたり、キャッシュの設定ができたり定義していけば結構いろんなことができる。

SpringFrameworkとの組み合わせ

JavaのDIコンテナSpring FrameworkはiBatisをサポートしている。(ただし2009/09時点でiBatis3のサポートはSpring3.1以降らしい)

基本的な設定

宣言的トランザクションが使えるので組み合わせた方が便利。 データソースの注入等も行える。

利用するには次の設定をSpringの設定ファイルに加える。 この例ではBasicDataSourceを利用する。

<-- DBの設定を外だしにするための設定ファイルの定義 -->
<context:property-placeholder location="classpath:db.properties"/>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
   <property name="driverClassName" value="${jdbc.driverClassName}" />
   <property name="url" value="${jdbc.url}" />
   <property name="username" value="${jdbc.username}" />
   <property name="password" value="${jdbc.password}" />
   <property name="maxActive" value="50"/>
   <property name="removeAbandonedTimeout" value="20"/>
   <property name="logAbandoned" value="true"/>
</bean>

<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean" scope="singleton">
  <property name="configLocation" value="classpath:sqlMapConfig.xml"/>
  <property name="dataSource" ref="dataSource"/>
</bean>

SharedPoolDataSource を使うための設定

<-- DBの設定を外だしにするための設定ファイルの定義 -->
<context:property-placeholder location="classpath:db.properties"/>

<-- SharedPoolDataSource がDBに接続するのに必要となるアダプターを定義 -->
<bean id="dsAdapter" class="org.apache.commons.dbcp.cpdsadapter.DriverAdapterCPDS">
    <property name="driver"   value="${jdbc.driverClassName}"/>
    <property name="url"      value="${jdbc.url}"/>
    <property name="user"     value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>

<-- データソースの定義。iBatisのsqlMapClientに注入するために定義 -->
<bean id="dataSource" class="org.apache.commons.dbcp.datasources.SharedPoolDataSource">
   <property name="connectionPoolDataSource">
      <ref local="dsAdapter"></ref>
   </property>
   <property name="maxActive" value="50"/>
   <property name="maxIdle" value="10"/>
   <property name="maxWait" value="300000"/>
   <property name="testOnBorrow" value="true"/>
   <property name="validationQuery" value="SELECT 1"/>
</bean>

<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean" scope="singleton">
  <property name="configLocation" value="classpath:sqlMapConfig.xml"/>
  <property name="dataSource" ref="dataSource"/>
</bean>

id="dataSource"はデータソースの設定。ここでDBへの接続設定を行う。この例ではcommons DBのDBCPの SharedPoolDataSourceを利用している。そのため id="dsAdapter"で定義しているDriverAdapterCPDSを注入する必要がある。

最初のタグはDBの設定をSpringの設定ファイルの外に出すための設定ファイルの読み込み。

id="sqlMapClient"がiBatisのSqlMapClientの定義。Springで管理しておけば、同じくSpringで管理し、DBにiBatisを利用するクラスに注入することもできる。

そうすれば、いちいちiBatisを利用するための準備の実装をしなくてすむ。StrutsのActionクラスに注入するように設定するととても便利。

一方、iBatis単体で利用するときに必要なsqlMapCOnfig.xmlのDB接続関連の設定は外からデータソースを注入するために不要となる。

クラスからの利用

DBのデータにアクセスするクラス、一般にはDAOクラスでは次の様に利用する。

ポイントは2つ。

  • SqlMapClientDaoSupport を継承すること
  • getSqlMapClientTemplate()メソッドでSqlMapClientのインスタンスを取得すること
package com.sample.dao;

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

import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

public class item extends SqlMapClientDaoSupport {

   public SetTopBox retrieveStbById(int id) {
       item item = (Item)getSqlMapClientTemplate().queryForObject("retrieveItemById", id);
       return stb;
   }

}
個人用ツール