Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
Javaでも。
[go: Go Back, main page]

■iBATIS version2.0.9 - sqlMaps / とにかく UPDATE

まずはざっくり

とにかく UPDATE。
今回も「もっとも単純に」のコンセプトを掲げつつざっくりとサンプル作りです。

ということでやらないといけいないこと。
基本的に SELECT と同じ。UPDATE に変わっても大した違いは無いのです。

  1. 更新するデータを入れる Java のクラスを作る
  2. SQL Map Config ファイルを書く
  3. SQL Map ファイルを書く
  4. データベースにアクセスするコードを書く
ざっとこんなところです。

データベース。
今回サンプルを作るにあたってはデータベースとして HSQLDB を使っています。
作ったテーブルはこれ。

CREATE TABLE SAMPLE(
    ID   INTEGER(8) NOT NULL,
    DESC VARCHAR(200)
)
そしてデータは適当に。

データを入れるクラスを作る

Bean であれば良いのでデータベースにあわせてちょいちょいと作ります。

package javademo.ibatis;

public class Sample{

    private Long id;
    private String description;
    
    public Long getId(){
        return this.id;
    }
    
    public void setId(Long id){
        this.id = id;
    }
    
    public String getDescription(){
        return this.description;
    }
    
    public void setDescription(String desc){
        this.description = desc;
    }
}

SQL Map Config ファイルを書く

作成した sqlMapConfig.xml ファイルです。
トランザクションの管理は JDBC。
DataSource の作成には SimpleDataSourceFactory を使うように指定しています。

<?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.hsqldb.jdbcDriver"/>
        <property name="JDBC.ConnectionURL" value="jdbc:hsqldb:hsql://localhost"/>
        <property name="JDBC.Username" value="sa"/>
        <property name="JDBC.Password" value=""/>
    </dataSource>
</transactionManager>

<sqlMap resource="maps/Sample.xml" />

</sqlMapConfig>

簡易なタグの説明を以下ベタ貼り。
以前書いたものをコピペしただけです。

[ sqlMapConfig タグ ]
SQL Map Config ファイルの一番外側はこのタグで囲む。
[ transactionManager タグ ]
type 属性で使用するトランザクションマネージャを指定する。
sqlMaps では JDBC、JTA、EXTERNAL の 3 が用意されています。
ちなみに、

JDBC -- JDBC を使ってトランザクション管理
JTA -- JTA を使ってトランザクション管理
EXTERNAL -- トランザクション管理無し

という具合です。
[ dataSource タグ ]
type 属性で DataSource を作るクラスを指定する。
SIMPLE の指定は iBATIS で用意されている SimpleDataSourceFactory を使いますってこと。

dataSource タグの内側。property タグで指定するのはそれぞれ次の通り。

JDBC.Driver -- JDBC ドライバのクラス名
JDBC.ConnectionURL -- JDBC 接続の時に使う接続文字列
JDBC.Username -- DB にアクセスするときのユーザ名
JDBC.Password -- DB にアクセスするときのパスワード

この 4 つが dataSource に SIMPLE を指定したときに最低限指定しないといけないプロパティ。
[ sqlMap タグ ]
resource 属性で SQL Map ファイルの場所を指定する。
場所はクラスパスの通っている所からの相対パス。

SQL Map ファイルを書く

この辺からやっと SELECT 文を発行するときとで違いが出てきます。
作成した Sample.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="Sample">
    <update id="updateSample" parameterClass="javademo.ibatis.Sample">
        UPDATE SAMPLE SET
            DESC=#description#
        WHERE ID=#id#
    </update>
</sqlMap>
相変わらず見れば何となくわかりそうなものではありますが、しつこくいきます。w

[ sqlMap タグ ]
SQL Map ファイルの一番外側はこのタグで囲む。
namespace 属性は Java で言うところの package 名みたなものだと思えばよし。
[ update タグ ]
update 文を発行するので update タグ。まんま。
id 属性にはこの操作を呼び出すときのキーを指定する。
parameterClass 属性にはタグの中身で書く SQL 文でパラメータとして使うクラス(完全)を指定する。

そしてタグの中身は実際に発行する SQL 文。
#で囲まれた名前はパラメータを表す。 中に指定するのは parameterClass のプロパティ名。

つまり、
  1. Java のコードから parameterClass で指定したクラスのオブジェクトが渡されてくる
  2. # で囲まれた名前と一致するプロパティの値を渡されたオブジェクトから取り出す
  3. 取り出した値で #名前# の部分を置き換えて SQL 実行
というような感じのことが行われるようになるイメージ。

データベースにアクセスするコードを書く

最後の仕上げは、コーディング。
SqlMapClient のメソッドを呼び出して、データベースにアクセスすることになります。

ざっくりとした手順はこんな感じ。

  1. SqlMapClientBuilder.buildSqlMapClient(Reader) を使って SqlMapClient を取り出す
  2. パラメータとなるクラスに値を詰める
  3. SqlMapClient の update(String, Object) を使ってデータベースにアクセス

まずは SqlMapClient の取り出しですが、これはおきまりの手順。
Resources クラスと SqlMapClientBuilder を使います。

Reader reader = Resources.getResourceAsReader("maps/sqlMapConfig.xml");
SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);

次。パラメータになるクラスのオブジェクトを作って値をセットします。
これは普通にやれば OK。

Sample sample = new Sample();
sample.setId(new Long(1L));
sample.setDescription("update sample.");

最後はデータベースアクセス。
今回は UPDATE 文を発行するので SqlMapClient の update(String, Object) を使います。

sqlMap.update("updateSample", sample);

メソッドの最初の引数には SQL Map ファイルで指定した id を、次の引数にはパラメータとなるオブジェクトを渡します。
このオブジェクトのプロパティの値が SQL Map ファイルに書いた #プロパティ名# と置き換わります。
メソッドの戻り値は実際に更新されたレコード数です(今回は受け取ってませんが)。

サンプル

最後に実行部分のソースの全貌。

package javademo.ibatis;

import java.io.Reader;

import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import com.ibatis.common.resources.Resources;

public class Run {

    public static void main(String[] args) {

        try{
            // 準備作業
            Reader reader = Resources.getResourceAsReader("maps/sqlMapConfig.xml");
            SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);

            // いざ実行
            Sample sample = new Sample();
            sample.setId(new Long(1L));
            sample.setDescription("update sample.");
            sqlMap.update("updateSample", sample);
           
        }catch(Exception e){
            e.printStackTrace();
            System.exit(1);
        }       
    }
}

まとめ

sqlMaps で UPDATE するときのポイント。

こんなところでしょうか。

SQL Map ファイルでの parameterClass 属性の指定に関しては SELECT や INSERT、DELETE なんかをする時にも同じ感じで使えるのでお見知りおきを。
ってとこ。