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 / Result Map を使う

Result Map とは

Result Map とは何か。
簡単に言うと、データベースの列と Java オブジェクトとの対応付けを行うもの。
SQL Map ファイル内に書きます。

<resultMap id="resultMapName" class="some.domain.Class" [extends="parent-resultMap"]>
    <result property="propertyName" column="COLUMN_NAME"
        [columnIndex="1"] [javaType="int"] [jdbcType="NUMERIC"]
        [nullValue="-999999"] [select="someOtherStatement"]
    />
    <result ……/>
    <result ……/>
    <result ……/>
</resultMap>

Result Map の書き方は上のような感じです。[ ] で囲まれているのはオプション。

で、中身の方に。
Result Map の構造をおおざっぱに言うと全体が resultMap タグで囲まれていて、その中に結果の列(結果オブジェクトのプロパティ)数分 result タグが並ぶという感じになります。
タグの詳細については次の通り。

[ resultMap タグ ]
Result Map の大外。Result Map はこのタグで定義する。
内側に result タグをもつ。
id 属性にはこの定義を区別するための id を付けます。
class 属性にはデータベースから取得した値を格納するクラス名(完全)を指定します。
extends 属性にはこの定義の親定義を指定できます。
Result Map はちょうど Java のクラス継承と同じように定義の継承ができるのです。その指定がこの属性。
省略できない属性 -- id, class
[ result タグ ]
データベースから取得した結果の列と Java のオブジェクトのプロパティとの対応を記述するのがここ。
property 属性には対応する Java のオブジェクトのプロパティ名を指定する。
column 属性には対応するデータベースからの取得結果列名を指定する。
columnIndex 属性には対応するデータベースからの取得結果列が何番目の列かを指定する。指定しておくとパフォーマンスが上がることがある様子。
javaType 属性には Java のプロパティの型名を指定する。自動での認識がうまく行かないときに指定すると良い様子。
jdbcType 属性にはデータベースからの取得結果列の JDBC のタイプを指定する。自動での認識がうまく行かないときに指定すると良い様子。
nullValue 属性にはデータベースからの取得結果列の値が null の時に置き換える値を指定できる。
select 属性は取得した列の値を使って他の処理を呼び出したいときに使う。SQL の statement タグ(select タグとか)の id を指定する。
省略できない属性 -- property, column

サンプルコード

いつもの様にサンプルへ。
今回のサンプルはなんのひねりもなくただ使ってみました的なもの。
データベースは相変わらず HSQLDB。
テーブルの構造はこれ。

CREATE TABLE SAMPLE(
    ID  NUMERIC(8) NOT NULL,
    DESC VARCHAR(200)
)

次に、sqlMapConfig.xml。

<?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>

今回のメインである SQL Map ファイル。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">

    <resultMap id="resultMap-1" class="javademo.ibatis.Sample">
        <result property="id" column="ID" columnIndex="1" javaType="long"
            jdbcType="NUMERIC"/>
        <result property="description" column="DESC" nullValue="NO DESCRIPTION"/>
    </resultMap>
    <select id="getSample2" parameterClass="long" resultMap="resultMap-1">
        SELECT * FROM SAMPLE WHERE ID = #value#
    </select>

</sqlMap>

結果を格納するクラス。

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;
    }
}

最後は実行するところ。

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 = (Sample) sqlMap.queryForObject("getSample2", new Long(1L));
            System.out.println("id=" + sample.getId());
            System.out.println("description=" + sample.getDescription());
           
        }catch(Exception e){
            e.printStackTrace();
            System.exit(1);
        }       
    }
}

まとめ

Result Map についてのまとめ。