CodeZine(コードジン)

特集ページ一覧

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

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

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

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

目次

シンプルな検索

 DEPTテーブルのキーを指定して1件のDEPTレコードを取得するSQLを記述しました。この検索結果を受け取るためのBeanを作成します。setterとgetterを用意したシンプルなPOJOです。

検索結果を格納するクラス

 DEPTテーブルの列ではLOC列ですが、あえてlocationプロパティにしています。

Dept.java
package examples.dto;
public class Dept {
    private int deptno;
    private String dname;
    private String location;
    public int getDeptno() {
        return deptno;
    }
    public void setDeptno(int deptno) {
        this.deptno = deptno;
    }
    public String getDname() {
        return dname;
    }
    public void setDname(String dname) {
        this.dname = dname;
    }
    public String getLocation() {
        return location;
    }
    public void setLocation(String location) {
        this.location = location;
    }
    @Override
    public String toString() {
        return "[deptno=" + deptno + ", dname=" + dname
                + ", location=" + location
                + "]";    //Commons-LangのToStringBuilderを使うと楽
    }
}

SqlMap

 先ほど準備段階で作成したものです。

SqlMap-Dept.xmlの抜粋
<!-- 1件検索 -->
<select id="getDept" resultClass="examples.dto.Dept">
    SELECT DEPTNO, DNAME, LOC as location FROM DEPT
    WHERE DEPTNO = #value#
</select>

 テーブルの列名(LOC)とBeanのプロパティ名(location)が異なる場合にはマッピングが必要です。一番簡単な例はこのようにSQL文で別名をつけることです。

実行プログラム

 SQLを実行するクラスは、こんなにシンプルになります。

Sample01_SelectOne.java
package examples;

import com.ibatis.sqlmap.client.SqlMapClient;
import examples.dto.Dept;
/**
 * シンプルな検索
 * スカラー値のSQLパラメータ
 */
public class Sample01_SelectOne {
    public static void main(String args[])throws Exception{
        SqlMapClient sqlMap = MyAppSqlConfig.getSqlMapInstance();
        /*
         * DeptNoを指定して1件のDeptを取得
         */
        Dept dept =
            (Dept)sqlMap.queryForObject("getDept", new Integer(20));
        System.out.println("部署番号20の部署=" + dept);
    }
}

 MyAppSqlConfigからSqlMapClientを生成し、idを指定してSQLの実行結果を取得します。引数で指定した20という値は、SQL文の#value#に埋め込まれて実行されます。

 1レコードを取得する場合には、queryForObjectで取得します。この実行結果がDeptで返されるのは、SqlMap-Dept.xmlに定義されたresultClass="examples.dto.Dept"の指定のためです。検索結果からオブジェクトへの詰め替えは、iBATISが列名から自動的に行ってくれます。

検索結果をListで受け取る

 複数のレコードが返される場合はList形式で受け取ります。

SqlMap

 作成済みのSqlMap-Dept.xmlにSQL定義を追加します。

SqlMap-Dept.xmlの抜粋
<sqlMap>
    <!-- 1件検索 -->
    <select id="getDept" resultClass="examples.dto.Dept">
        SELECT DEPTNO, DNAME, LOC as location FROM DEPT
        WHERE DEPTNO = #value#
    </select>
    <!-- 全件検索 -->
    <select id="allDept" resultClass="examples.dto.Dept">
        SELECT DEPTNO, DNAME, LOC as location FROM DEPT
        ORDER BY DEPTNO desc
    </select>
</sqlMap>

実行プログラム

 検索結果をListで受け取るプログラムは、次のようになります

Sample02_SelectAll.javaの抜粋
List<Dept> list = (List<Dept>)sqlMap.queryForList("allDept");
for (Dept d : list){
    System.out.println(d);
}

 queryForListでは実行結果がListに格納されます。resultClassの指定がDeptになっているため、DeptがaddされたListとして取得できます。このサンプルでは、ジェネリックスを使うためにキャストしています(※残念ながらiBATIS2.3.0の時点では、SqlMapClientはジェネリックスに未対応なためキャストを使用しています)。

検索結果をMapのListで受け取る

 Beanを作成するのが面倒な場合は、MapをresultClassとして使用することができます。この場合、列名をキーとしたMapが作成されるため、ResultSetを使ったJDBCプログラムと似ています。

SqlMap

 作成済みのSqlMap-Dept.xmlにSQL定義を追加します。resultClassにHashMapを指定します。

SqlMap-Dept.xmlの抜粋
<!-- 全件検索をMapで受け取る -->
<select id="allDeptMap" resultClass="java.util.HashMap">
    SELECT * FROM DEPT
</select>

実行プログラム

 実行方法は、Listで受け取る場合と同様です。

Sample03_Map.javaの抜粋
List<Map> list = (List<Map>)sqlMap.queryForList("allDeptMap");
for (Map map : list){
    System.out.println(map.get("DEPTNO") + "," + map.get("DNAME") + ","
            + map.get("LOC"));
}

 列名の大文字がキーになります。

 resultClassの作成が不要な点は楽ですが、カラム名を間違ったり、間違ったキャストの場合でもコンパイルエラーにならないため、タイプセーフではありません。


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

修正履歴

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

バックナンバー

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

著者プロフィール

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5