sqlMapを利用し、INSERT、UPDATE、DELETEを行ってみます。

動作環境等については、「iBatisでSELECT」と同じです。

追加、変更する部分についてのみ説明していきたいと思います。


変更の対象となるのは、マッピングファイルと実行するためのクラスだけです。

マッピングファイル

<?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>
<insert id="insertUser" parameterClass="sample.iBatis.User">
INSERT INTO USER_TABLE
(ID, NAME)
VALUES (#id#, #name#)
</insert>
<update id="updateUser" parameterClass="sample.iBatis.User">
UPDATE USER_TABLE
SET NAME=#name#
WHERE ID=#id#
</update>
<delete id="deleteUser" parameterClass="sample.iBatis.User">
DELETE FROM USER_TABLE
WHERE ID=#id#
</delete>
</sqlMap>

SELECTの場合もそうでしたが、見たまんまです。。
マッピングファイルの利用方法は、

タグ 内容
select SELECTを実行して、データを取得
insert INSERTでRDBにデータを挿入
update UPDATEでRDBを更新
delete DELETEでRDBデータを削除

基本的には、SQLとタグがそのまま対応していますので、それほど迷うことはないと思います。

前回の説明で出てきていない情報といえば、parameterClassくらいでしょうか。
これは、引数として受け取ったパラメータのクラスを指定します。
もちろんselectタグでも利用可能です。

また、例の中では、各SQL内で、#name#や#id#という箇所がありますが、parameterClassで指定されたクラスのgetterメソッドが呼び出されて、値が設定されます。

ちなみに、今回のようなケースでは、#name#ではなく、$name$と記述しても同じ結果が得られます。
#で指定した場合と$で指定した場合の相違は以下の通りです。

# PreparedStatementの固定文字
$ PreparedStatementのバインド変数

例えば、以下のような情報をマッピングファイル内に記載した場合は、

  • SELECT ID AS id, NAME AS name FROM USER_TABLE WHERE ID=#value#
  • SELECT ID AS id, NAME AS name FROM USER_TABLE WHERE ID=$value$

最初の例で発行されるSQLは、
SELECT ID AS id, NAME AS name FROM USER_TABLE WHERE ID=XXXX

2つ目では、
SELECT ID AS id, NAME AS name FROM USER_TABLE WHERE ID=?

となります。
状況に応じた使い方が必要ですが、通常は#で良いのではないでしょうか。

あとは、実行するための箇所を修正するだけです。

package sample;
import java.io.Reader;
import sample.iBatis.User;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
public class TestMain {
public static void main(String[] args) throws Exception {
String RESOURCE_FILE = "mappings/sql-map-config.xml";
Reader reader = Resources.getResourceAsReader(RESOURCE_FILE);
SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
// SELECT
User user = (User) sqlMap.queryForObject("getUser", new Long(1));
System.out.println(user);
// INSERT
User newUser = new User();
newUser.setId(new Long(100L));
newUser.setName("NEW USER");
sqlMap.insert("insertUser", newUser);
user = (User) sqlMap.queryForObject("getUser", newUser.getId());
System.out.println(user);
// UPDATE
newUser.setName("changeUser");
sqlMap.update("updateUser", newUser);
user = (User) sqlMap.queryForObject("getUser", newUser.getId());
System.out.println(user);
// DELETE
sqlMap.delete("deleteUser", newUser);
user = (User) sqlMap.queryForObject("getUser", newUser.getId());
System.out.println(user);
}
}

今回もほとんど説明する必要もないようなコードです。

INSERT時は、データをINSERTするためのObjectを作成し、sqlMap.insertを実行。

UPDATE時は、更新するためのデータを設定し、sqlMap.updateを実行。

INSERT時は、、削除するための情報を設定し、sqlMap.deleteを実行。

実行すると、

ID[1]:Name[User1]
ID[100]:Name[NEW USER]
ID[100]:Name[changeUser]
null

と表示され、それぞれ想定した動作をしていることが確認できます。

単純なRDBの操作を行うには、iBatisが本当に簡単に利用できることがわかっていただけたかと思います。

ブログ内の関連する記事