iBatisでINSERT,UPDATE,DELETE
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">SELECTID AS id,NAME AS nameFROM USER_TABLEWHERE 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_TABLESET NAME=#name#WHERE ID=#id#</update><delete id="deleteUser" parameterClass="sample.iBatis.User">DELETE FROM USER_TABLEWHERE 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);// SELECTUser user = (User) sqlMap.queryForObject("getUser", new Long(1));System.out.println(user);// INSERTUser 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);// UPDATEnewUser.setName("changeUser");sqlMap.update("updateUser", newUser);user = (User) sqlMap.queryForObject("getUser", newUser.getId());System.out.println(user);// DELETEsqlMap.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が本当に簡単に利用できることがわかっていただけたかと思います。
コメント
コメントを投稿