ibatis入門試行4一対一(OneToOne)関連付け


ibatis入門試み4一対一(OneToOne)関連付け
以前はibatisによってデータベースのcrud操作を完了していましたが、ibatisを使用して1対1のマッピング操作を完了しました.ibatisは半自動ormなので、彼のマッピング操作は主にクエリーに現れています.
まず,データベースにテーブルperson(id,name)idcard(id,cardcode)を確立する.ここでidはプライマリ・キーテーブルidcardのidフィールドの外部キーはpersonテーブルidである.personテーブルidは自己増加タイプを採用しています.
次にクラスを作成します

public class Person {
	private int id;
	private String name;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

public class Idcard {
	private int id;
	private String cardcode;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getCardcode() {
		return cardcode;
	}
	public void setCardcode(String cardcode) {
		this.cardcode = cardcode;
	}
	
}


Person.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="person">
<typeAlias alias="personVO" type="com.bean.onetoone.Person"/>
<parameterMap class="personVO" id="personVOmp">
	<parameter property="id" jdbcType="int"/>
	<parameter property="name" jdbcType="varchar"/>
</parameterMap>
<insert id="createPerson" parameterMap="personVOmp">
	<!--            id        id    ,                     id    
	     type       pre   post ,pre     id ,post    id         id                  
	     select  insert                 mysql                          
	         mysql     
	 -->
	<selectKey keyProperty="id" type="post" resultClass="int">
		select @@IDENTITY as value
	</selectKey>
	insert into person(id,name) values(?,?)
</insert>
</sqlMap>

Idcard.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="idcard">
<typeAlias alias="idcardVO" type="com.bean.onetoone.Idcard"/>
<parameterMap class="idcardVO" id="idcardVOmp">
	<parameter property="id" jdbcType="int"/>
	<parameter property="cardcode" jdbcType="varchar"/>
</parameterMap>
<insert id="createIdcard" parameterMap="idcardVOmp">
	insert into idcard(id,cardcode)	values(?,?)
</insert>

</sqlMap>

この2つのxmlの参照をプロファイルに追加することを忘れないでください.
この例では,オブジェクト間挿入の処理方式と,関連idの使用とselectkeyラベルの用途を指摘した.

Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);

Person person = new Person();
person.setName("zhangsan");

sqlMap.startTransaction();
sqlMap.insert("person.createPerson", person);
//   person.xml       selectkey            person  id
//      idcard          id 
System.out.println(person.getId());

Idcard idcard = new Idcard();
idcard.setId(person.getId());
idcard.setCardcode("22043156");
sqlMap.insert("idcard.createIdcard", idcard);
sqlMap.commitTransaction();

次に、オブジェクト向けのクエリー結果を完了するためにクエリーを操作します.
ここではpersonオブジェクト関連idcardオブジェクトを採用します
Personを変更します.JAvaは彼にidcardオブジェクトを含ませた

package com.bean.onetoone;

public class Person {
	private int id;
	private String name;
	private Idcard idcard;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Idcard getIdcard() {
		return idcard;
	}
	public void setIdcard(Idcard idcard) {
		this.idcard = idcard;
	}
}

ここにいるxmlにselectラベルを追加

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="idcard">
<typeAlias alias="idcardVO" type="com.bean.onetoone.Idcard"/>
<parameterMap class="idcardVO" id="idcardVOmp">
	<parameter property="id" jdbcType="int"/>
	<parameter property="cardcode" jdbcType="varchar"/>
</parameterMap>
<insert id="createIdcard" parameterMap="idcardVOmp">
	insert into idcard(id,cardcode)	values(?,?)
</insert>
<resultMap class="idcardVO" id="getIdcardVO">
	<result property="id" column="id"/>
	<result property="cardcode" column="cardcode"/>
</resultMap>
<select id="selectIdcardById" resultMap="getIdcardVO" parameterClass="int">
	select * from idcard where id=#value#
</select>
</sqlMap>


次にpersonを増やしますxmlでラベルをクエリーします.プロパティ構成の

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="person">
<typeAlias alias="personVO" type="com.bean.onetoone.Person"/>
<parameterMap class="personVO" id="personVOmp">
	<parameter property="id" jdbcType="int"/>
	<parameter property="name" jdbcType="varchar"/>
</parameterMap>
<insert id="createPerson" parameterMap="personVOmp">
	<!--            id        id    ,                     id    
	     type       pre   post ,pre     id ,post    id         id                  
	     select  insert                 mysql                          
	         mysql     
	 -->
	<selectKey keyProperty="id" type="post" resultClass="int">
		select @@IDENTITY as value
	</selectKey>
	insert into person(id,name) values(?,?)
</insert>
<resultMap class="personVO" id="getPersonVO">
	<result property="id" column="id"/>
	<result property="name" column="name"/>
	//           idcard   idcard.selectIdcardById         id
	<result property="idcard" column="id" select="idcard.selectIdcardById"/>
</resultMap>
<select id="selectPersonById" resultMap="getPersonVO" parameterClass="int">
	select * from person where id=#value#
</select>
</sqlMap>


次はテスト方法です

Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);

Person p = (Person)sqlMap.queryForObject("person.selectPersonById", 2);

System.out.println(p.getName());
System.out.println(p.getIdcard().getCardcode());