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