ibatis入门尝试4 一对一(OneToOne)关联

ibatis入门尝试4 一对一(OneToOne)关联
我们之前已经通过ibatis完成了对于数据库的crud操作,现在我们来使用ibatis完成一对一映射的操作,由于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>

不要忘记在配置文件中加入这两个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;
	}
}


在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中查询标签,注意在属性配置中的 <result property="idcard" column="id" select="idcard.selectIdcardById"/>
<?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());

你可能感兴趣的:(apache,sql,mysql,xml,ibatis)