------------------------------------ 一对一(两个表之间记录数目相同,一一对应,比如人和身份证号码)-----------------------------------------
处理方式有两种
A:业务扩展类:重新定义一个类,将查询的所有属性放在这个类中,适合小型的项目,不复杂的业务中
B:resultMap,类关联:在类中做类似数据库中的主外键关联,并且在映射文件中做配置,此时返回的类型就是包含了另外一个类的复杂类型,需要用resultMap来指定其中的属性和值的对应关系了
举个栗子,Person中有一个Card类型的属性,此时需要在配置中<association>告诉mybatis,这个属性是card,他的javaType是Card,当然,card类是在配置了别名后使用的
在这里面指定Card类和查询结果之间的映射关系就ok了
<select id="queryPersonByOneToOne" resultMap="OneToOneMap" parameterType="person">
select * from person p inner join card c on p.pcardid=c.cardid where p.pid=#{pid}
</select>
<resultMap id="OneToOneMap" type="person">
<id property="pid" column="pid"></id>
<result property="pname" column="pname"></result>
<result property="page" column="page"></result>
<association property="card" javaType="card">
<id property="cardid" column="cardid"></id>
<result property="cardinfo" column="cardinfo"></result>
</association>
</resultMap>
如果使用了resultMap,则只有在其中对应的属性是有值的,其他的不写则会给出默认值,所以如果有那些字段怎么查都是一样的默认值,很可能是对应写错了。程序也是不会报错的
--------------------------------------------- 一对多(比如说一个省份里有很多人,然后每个人有自己的ID编号) -------------------------------------
首先,这种关系很明显,是一个一对多,然后再到一对一的关系,实体类之间就要用Province包含一个Person的List,然后Person中有一个Card的属性
这样的三个类,映射的写法:
<select id="queryPersonByOneToMany" resultMap="OneToManyMap" parameterType="int">
select * from province a inner join person b on a.personid=b.pid where a.proid=#{proid}
</select>
<resultMap id="OneToManyMap" type="province">
<id property="proid" column="proid"></id>
<result property="proname" column="proname"></result>
<collection property="persons" ofType="person">
<id property="pid" column="pid"></id>
<result property="pname" column="pname"></result>
<result property="page" column="page"></result>
<association property="card" javaType="card">
<id property="cardid" column="cardid"></id>
<result property="cardinfo" column="cardinfo"></result>
</association>
</collection>
</resultMap>
首先,一对多要用collection标签,里面写上属性名字和List<T>这里的泛型ofType的别名或者全报名
然后,在list的对象T中如果还有一对一的属性,则需要在其后继续写一对一的<association>标签,和一对一一样就可以了,里面是javaType哦
运行结果:可以看到,已经查出来了编号1的陕西省中有一个人就是编号1的张三,他的card信息编号也是1,soEasy!!!!