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 / とにかく DELETE

まずはざっくり

とにかく DELETE。
今回も「シンプル」をコンセプトにサンプル作りです。

ということでやること。
基本的に SELECT と同じ。DELETE に変わっても大した違いは無しです。

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

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

CREATE TABLE SAMPLE(
    ID  NUMERIC(8) NOT NULL,
    DESC VARCHAR(200)
)
なんか HSQLDB のバージョン上げてみたら CREATE 文が動かなくなってたので SELECT や UPDATE のとは少し変えています。

そしてデータは適当に。

削除のキーとなるデータを入れるクラスを作る

削除のキーとなる項目が渡せればいいのでクラスを作るほどのことは無いのですが、なんとなく流れで。
データベースにあわせてちょいちょいと作ります。

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">
    <delete id="deleteSample" parameterClass="javademo.ibatis.Sample">
        DELETE FROM SAMPLE
        WHERE ID=#id#
    </delete>
</sqlMap>
相変わらず見れば何となくわかりそうなものではありますが、しつこくいきます。w

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

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

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

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

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

  1. SqlMapClientBuilder.buildSqlMapClient(Reader) を使って SqlMapClient を取り出す
  2. パラメータとなるクラスに値を詰める
  3. SqlMapClient の delete(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));

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

sqlMap.delete("deleteSample", 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));
            sqlMap.delete("deleteSample", sample);
           
        }catch(Exception e){
            e.printStackTrace();
            System.exit(1);
        }       
    }
}

まとめ

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

こんなところ。