2010年3月6日土曜日

iBatisの組み込み

データベースアクセスのフレームワークであるiBatis(Ver 2)をプロジェクトに組み込み
データの取得を行ってみます。

サンプルはこちらからダウンロードできます。

※BLOGの都合上、文中のタグ用の括弧はすべて全角文字にしてあります。

組み込み

まず、以下のページからiBatisをダウンロードします。
Ver3のベータ版が出ているようですが、ここではVer2のibatis-2.3.4.726.zipをダウンロードします。
http://ibatis.apache.org/java.cgi

ダウンロードしたファイルを展開し、ibatis-2.3.4.726.jarをWebContext/libフォルダにコピーします。

次に、xmlフォルダ(またはsrcフォルダ)にSqlMapConfig.xmlを作成します。
SqlMapConfig.xmlにはDB接続の情報や使用する追加で読み込むSqlMap.xmlファイルのパスを指定します。

ここでは、外部のJDBCドライバが不要なODBC経由でデータベースに接続します。
ODBC経由でのDB接続の設定は以下のようになります。(一部抜粋)
<property name="JDBC.Driver" value="sun.jdbc.odbc.JdbcOdbcDriver" />
<property name="JDBC.ConnectionURL" value="jdbc:odbc:struts2_sample" />
<property name="JDBC.Username" value="struts2_sample" />
<property name="JDBC.Password" value="struts2_sample" />

ODBCデータソースアドミニストレータでデータソース「struts2_sample」を追加します。

なお、MySQLの場合の設定は以下のようになります。(一部抜粋)
<property name="JDBC.Driver" value="com.mysql.jdbc.Driver" />
<property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost/struts2_sample" />
<property name="JDBC.Username" value="struts2_sample" />
<property name="JDBC.Password" value="struts2_sample" />

データの準備

以下のSQL文をデータベースアクセスクライアント等で実行し、
あらかじめテーブルの作成とデータの追加を行います。
なお、ここで使用しているSQL文はMySQL用のものです。

create table sample_user_tables(user_name varchar(100), mail_address varchar(200), login_count integer, primary key(user_name));

INSERT INTO sample_user_tables
(
user_name,
mail_address,
login_count
)
VALUES
(
'hoge',
'hoge@example.com',
'3'
)
;

INSERT INTO sample_user_tables
(
user_name,
mail_address,
login_count
)
VALUES
(
'piyo',
'piyo@example.com',
'10'
)
;

iBatisの初期化

iBatisを使用するにはSqlMapClientクラスを作成する必要があります。
SqlMapClientクラスは一度作成したら使い回しができるので、
ここではシングルトンのクラスSqlMapClientHolderを作成し初回だけ初期化を行うようにします。

public class SqlMapClientHolder {
 public static final String RESOURCE_PATH = "SqlMapConfig.xml";
 private static SqlMapClient sqlMapClient;
 static {
  try {
   Reader reader = Resources.getResourceAsReader(RESOURCE_PATH);
   sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
  } catch (IOException ioe) {
   throw new RuntimeException("SqlMapConfig.xml load failed.", ioe);
  }
 }

 public static SqlMapClient getInstance() {
  return sqlMapClient;
 }
}

DAOの作成

データベースにアクセスするデータアクセスクラス(DAO)を作成します。
まず、SQL文を記述した設定ファイルをXML(SqlMap.xml)で作成します。
ファイル名は自由に設定できますが、xmlフォルダ(またはsrcフォルダ)といった
コンパイル対象のフォルダにおく必要があります。
作成したファイルのパスはSqlMapConfig.xmlにsqlMapタグで指定します。
<sqlMap resource="sqlmap/SqlMap-SampleQuery.xml" />

SqlMap-SampleQuery.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>
 <resultMap id="SampleQueryDto"
  class="com.googlecode.tecproglab.struts2_sample.dto.SampleQueryDto">
  <result property="userName" column="user_name" />
  <result property="mailAddress" column="mail_address" />
  <result property="loginCount" column="login_count" />
 </resultMap>
 <select id="queryAll" resultMap="SampleQueryDto">
  SELECT
  user_name,
  mail_address,
  login_count
  FROM
  sample_user_tables
  ORDER BY
  user_name
    </select>
</sqlMap>

selectタグにはSQL文(ここではSELECT文)を記述します。
また、SampleQueryDtoに取得したデータを保存するDTOクラスを指定します。

resultMapタグにはDTOクラスのクラス名を指定します。
resultタグにはDTOクラスの要素とSQLで取得した列名の組み合わせを指定します。

データを保存するDTOクラスを作成します。
DTOのメンバー変数(userName)はresultMapタグの指定と厳密に一致させます。

//一部抜粋
public class SampleQueryDto {
 private String userName;

 public String getUserName() {
  return userName;
 }

 public void setUserName(String userName) {
  this.userName = userName;
 }
 //以下省略
}

実際の処理を行うDAOを作成します。
といっても、SqlMapClientを取得してiBatisを呼び出すだけです。
queryForListの引数にはselectタグに記述した名前を指定します。
SQLを実行した結果としてDTOのリストが返ります。

public class SampleQueryDao {
 public List<SampleQueryDto> queryAll() {
  SqlMapClient sqlMapClient = SqlMapClientHolder.getInstance();

  try {
   List<SampleQueryDto> list = (List<SampleQueryDto>) sqlMapClient
     .queryForList("queryAll");
   return list;
  } catch (SQLException se) {
   throw new RuntimeException(se);
  }
 }

}

動作確認

iBatisはWebサーバが不要のため、以下のようなテストコードで動作確認が行えます。
Eclipse上から実行するには以下のように行います。
1.main関数を記述したクラスをプロジェクトエクスプローラーから右クリックします。
2.コンテキストメニューのRun As>Java Applicationをクリックします。

public static void main(String[] args) {
 SampleQueryDao dao = new SampleQueryDao();
 List<SampleQueryDto> list = dao.queryAll();

 for (SampleQueryDto dto : list) {
  System.out.println(dto);
 }
}