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

まずはざっくり

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

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

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

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

CREATE TABLE SAMPLE(
    ID  NUMERIC(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">

    <insert id="insertSample" parameterClass="javademo.ibatis.Sample">
        INSERT INTO SAMPLE
        VALUES(
            #id#, #description#)
    </insert>
</sqlMap>
相変わらず見れば何となくわかりそうなものではありますが、しつこくいきます。

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

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

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

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

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

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

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

sqlMap.insert("insertSample", sample);

メソッドの最初の引数には SQL Map ファイルで指定した id を、次の引数にはパラメータとなるオブジェクトを渡します。
このオブジェクトのプロパティの値が SQL Map ファイルに書いた #プロパティ名# と置き換わります。
メソッドの戻り値ではデータベースに追加されたレコードのプライマリキーの値を受け取ることができます。
ただ、これを受け取るにはちょっと手順が必要。今の状態だと null が返ってくるのでとりあえず放置。

サンプル

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

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(2L));
            sample.setDescription("description");
            sqlMap.insert("insertSample", sample);
           
        }catch(Exception e){
            e.printStackTrace();
            System.exit(1);
        }       
    }
}

まとめ

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

こんなところ。