企業向けの情報システムやWebアプリケーションでは、ほとんどの場合、基本の機能としてデータの出し入れがあります。
そのデータ自体は、リレーショナルデータベース(以下RDB)内に格納されていることが多く、システムを構築する上でRDBに対するアクセス方法は避けては通れないものとなっています。

Javaなどでリレーショナルデータベース(以下RDB)を利用する場合、一般的に以下の点が問題としてあげられます。

  • インピーダンスミスマッチ
    RDBとオブジェクト指向言語の設計思想の相違から発生する問題。
    通常、クラス図等で表現されたデータをそのままRDBに入れることができない。
    RDB<->オブジェクト指向言語間の双方向の変換(マッピング)処理が必要となるデータモデルの違いをいう。

このような問題を解決する手段として「O/Rマッピング(Object/Relation Mapping)」というのがあり、JavaのO/Rマッピングフレームワークの代表的なものとしては、

などがあげられます。

ほとんどの場合、XMLにマッピング情報の定義(テーブルとクラスのマッピング、フィールドとカラムのマッピングなど)を記述することで、JavaのオブジェクトとRDBの間のマッピングを自動的に実行してくれるようになり、
提供されているAPIを通じて、「検索」「更新」などが実行できるようになります。

プロダクトによっては、内部的にSQLを組み立てて発行してくれるため、SQLをまったく記述せずにRDBにアクセスすることも可能ですし、ツールが提供されておりクラスのソースコードを自動生成してくれるようなものもあります。

マッピングを設定ファイルで行ってくれるので、RDBのスキーマ定義が変更になった場合などは、マッピングファイルを更新すればよいのです。

といっても、マッピングファイルを作成する作業量の増加等、プログラマーの負担も増えるわけですが。。。
実際問題として、O/Rマッピングツールを利用したからといって、100%問題が解決できるというものでもありませんし、自動的にSQLを生成してくれるものを利用したとしても、デバッグ、パフォーマンスチューニング等でSQLがまったく不要になるわけではありません。

それに、RDBを利用するアプリケーションを開発しているのであれば、SQL(RDB)に詳しい担当者もいるのが普通でしょう。

実際、自動的に発行されるSQLがもっとも良いSQLであるとは思えませんから、パフォーマンスに重点を置くのであれば、SQLの最適化は必要ですし、RDB毎のネイティブなSQLを記述したい局面も数多くあると思います。

結局はアプリケーションのレベル、用途等によって、マッピングツールを利用するのか判断していく必要があります。

上記のようなことを踏まえたうえで、O/Rマッピングツールを利用するとなった場合、それぞれ特徴があるので、その選定も必要となります。過去の実績で開発メンバーがあるツールを利用した経験があるなら、それを使うのも一案ですし、何らかの不満がでたのであれば、その不満を解できるプロダクトを選択する方法もあるでしょう。

ここではiBatisというツールを紹介していきたいと思います。

iBatisは、Apache Software Foundation(以下ASF)の中のプロダクトのひとつであり、O/Rマッピングツールの中では、比較的単純な部類に入ると思われます。

また、Java用、.NET用の2つが準備されているというのも珍しいかもしれません。

iBatisは大きく以下の2つに分けることができます。

  • sqlMaps
    XMLに定義したSQLを実行し、結果とオブジェクトをマッピングする機能

  • DAO Framework
    DBアクセス部とビジネスロジック部の依存性を下げるための簡易DI機能

これら2つには大きな関連性がなく、片方のみを利用するというようなことも可能です。

特徴としては、SQLをマッピングファイル内に記述するということがあげられます。

SQLを直接書くというのは、利点・欠点ともにいろいろありますが、SQLによるパフォーマンスチューニングが比較的簡単に実行できるということで、SQLのスペシャリスト等がいる環境では扱いやすいプロダクトだと思います。

iBatisを利用するパターンとしては、個人的にですが、sqlMapsを利用し、DAOの部分については他のフレームワークを利用するといった使い方がいいのかと思っていますので、ここでは、sqkMapsについていろいろ試していこうと思います。

とりあえず今回は、雰囲気だけで。。。(今後時間を見つけて紹介していきます)

・接続設定関連


<?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>
<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property value="org.postgresql.Driver" name="JDBC.Driver"/>
<property value="jdbc:postgresql://localhost/testdb" name="JDBC.ConnectionURL"/>
<property value="testuser" name="JDBC.Username"/>
<property value="testpassword" name="JDBC.Password"/>
</dataSource>
</transactionManager>
<sqlMap resource="mappings/User.xml" />
</sqlMapConfig>

・マッピング


<?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 namespace="User">
<select id="getUser" resultClass="sample.iBatis.User">
SELECT
ID AS id,
NAME AS name
FROM USER_TABLE
WHERE ID=#value#
</select>
</sqlMap>

・Javaからの利用


sample.iBatis.User user = (sample.iBatis.User)sqlMap.queryForObject("getUser", new Long(1L));

ブログ内の関連する記事