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 / Bean の中の Bean

Bean の中の Bean にアクセス

Result Map を書くときのひと工夫。
Bean が別の Bean をプロパティとして持つ場合について。
こういう Bean にデータベースから取ってきた値をセットするには次の様に階層をたどる感じでプロパティを指定する。

「プロパティ名.プロパティ名」

例えば Bean A のプロパティ objB が Bean B のオブジェクトであるときに Bean B のプロパティ id を指定するなら objB.id 。

    <resultMap id="resultMap-5" class="javademo.ibatis.A">
        <result property="id" column="A_ID" />
        <result property="value" column="A_VALUE" />
        <result property="objB.id" column="B_ID" />
        <result property="objB.value" column="B_VALUE" />
    </resultMap>

というような具合。まんま。

サンプルコード

どんどん行きます。サンプル。
データベースは相変わらず HSQLDB。
テーブルは次の A と B を使います。
A_BID はテーブル B の B_ID 列の値を持つものとします。

CREATE TABLE A(
    A_ID    VARCHAR(10),
    A_VALUE VARCHAR(100),
    A_BID   VARCHAR(10)
)
CREATE TABLE B(
    B_ID    VARCHAR(10),
    B_VALUE VARCHAR(100)
)

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-5" class="javademo.ibatis.A">
        <result property="id" column="A_ID" />
        <result property="value" column="A_VALUE" />
        <result property="objB.id" column="B_ID" />
        <result property="objB.value" column="B_VALUE" />
    </resultMap>
    <select id="getA2" parameterClass="string" resultMap="resultMap-5">
        SELECT * FROM A INNER JOIN B ON A_ID = B_ID WHERE A_ID = #value#
    </select>

</sqlMap>

データベースから取得した値を格納する Bean。
まずはクラス A。クラス B をプロパティとして持っています。

package javademo.ibatis;

public class A {
    private String id;
    private String value;
    private B objB;
    
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public B getObjB() {
        return objB;
    }
    public void setObjB(B objB) {
        this.objB = objB;
    }
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
}

クラス B。

package javademo.ibatis;

public class B {
    private String id;
    private String value;
    
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
}

最後は実行するところ。特に変わったところはなし。

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

            // いざ実行
            A objA = (A) sqlMap.queryForObject("getA2", "1");
            System.out.println("A:id=" + objA.getId());
            System.out.println("A:value=" + objA.getValue());
            System.out.println("B:id=" + objA.getObjB().getId());
            System.out.println("B:value=" + objA.getObjB().getValue());
           
        }catch(Exception e){
            e.printStackTrace();
            System.exit(1);
        }       
    }
}

まとめ

Bean が持つ Bean のプロパティにアクセスするには。