Apache iBATIS

O/Rマッピングフレームワークで有名なhibernateを試そうとしたのだが、
「難しい割りに効果が見込めない」とか、「iBATISの方が簡単でよい」
などの意見が各サイトで散見された為、iBATISを試すことにした。

以下のサイトを参考に動かすところまで。
http://634.ayumu-baby.com/ibatis/index.html


ファイル構成

Derby、ij起動後

ij>connect 'jdbc:derby://localhost/SampleDB;create=true';
ij>create table iuser (
id numeric(3) not null,
name varchar(10),
age varchar(2),
constraint pk_user primary key (id)
);

userというテーブルが作りたかったのにSyntax Errorに阻まれる。
Derbyにとっての予約語なのかもしれない。


テーブルのカラムに対応してアクセサがついているクラス
User.java

package ibatis;

public class User {
	
    private String id = null;
    private String name = null;
    private String age = null;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}


SQL実行結果とPOJOマッピングを記述するxmlファイル。
human.ibatis.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap
    PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
    "http://www.ibatis.com/dtd/sql-map-2.dtd">

<sqlMap namespace="User">
    <selectsql id="getUser" parameterClass="java.lang.String" resultClass="ibatis.User">
        SELECT
            ID,
            NAME,
            AGE
        FROM
            app.iUSER
        WHERE
            ID = #VALUE#
    </selectsql>

    <update id="updateUser" parameterClass="ibatis.User">
        UPDATE app.iUSER
        SET NAME = #name#
        <dynamic>
            <isNotNull prepend="," property="age">
                AGE = #age#
            </isNotNull>
        </dynamic>
        WHERE id = #id#
    </update>

    <delete id="deleteUser"
               parameterClass="string">
        DELETE
        FROM  app.iUSER
        WHERE ID = #id#
    </delete>

    <insert id="insertUser"
               parameterClass="ibatis.User">
        INSERT INTO app.iUSER (
            ID,
            NAME,
            AGE
        ) VALUES (
            #id#,
            #name#,
            #age#
        )
    </insert>
</sqlMap>


Config用xmlファイル。ClientDriverはユーザー、パスがないと怒られるので指定。
sql-map-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
    <transactionManager type="JDBC">
        <dataSource type="SIMPLE">
            <property name="JDBC.Driver" value="org.apache.derby.jdbc.ClientDriver"/>
            <property name="JDBC.ConnectionURL" value="jdbc:derby://localhost/SampleDB"/>
            <property name="JDBC.Username" value="kimu"/>
            <property name="JDBC.Password" value="pass"/>
        </dataSource>
    </transactionManager>
    <sqlMap resource="human.ibatis.xml"/>
</sqlMapConfig>


利用する。
SampleSQL.java

package test;

import ibatis.User;
import java.io.Reader;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

public class SampleSQL {
   public static void main(String[] args)throws Exception{
       String resource = "sql-map-config.xml";
       Reader reader = Resources.getResourceAsReader(resource);
       SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);

       // SELECT
       User user = (User)sqlMap.queryForObject("getUser", "1");
       System.out.println(user.getId() + "\t" + user.getName());

       // UPDATE
       user.setName("hello");
       user.setAge("99");
       sqlMap.update("updateUser", user);

       // INSERT
       user.setName("XYZ");
       user.setAge("99");
       user.setId("4");
       sqlMap.insert("insertUser", user);

       // DELETE
       sqlMap.delete("deleteUser", "1");
   }
}


一通り動かしたが、パラメータにListを渡せばiterateしてくれるなど
他にも便利な機能がたくさんあるようだ。
iBatis自体のレビューは別でやりたい。