关于Mybatis级联查询

利用sql语句级联查询再定向到新POJO

也就是我们只利用sql语句来进行级联操作,mybatis只把我们的查询结果进行映射,所以不需要考虑mybatis的特性

例一:一对一查询,当一个student对应一个worker时就可以将其连接成一个新关系表

<select id="queryStudent1" parameterType="String" resultType="com.po.SW">
select s.ID, w.wid
from student s, s_w w
where s.ID = #{ID} and w.ID = s.ID
</select>

//当然你也可以直接用natural join

<select id="queryStudent2" parameterType="String" resultType="com.po.SW">
select ID, wid
from student natural join s_w
where ID = #{ID}
</select>

例二:一对多查询,当一个student对应多个worker时也可以将其连接成一个新关系表,但是问题在于新形成的表结果是[ ID + wid ]s 的结果,而不是明显的 ID + [ wids ] 结果。

<select id="queryStudentsWorker" parameterType="String" resultType="com.po.SWs">
select s.ID, sw.wid
from student s, s_w sw
where s.ID = sw.ID and s.ID=#{ID}
</select>

//natural join 略

利用不同POJO嵌套查询

例一,对查询进行嵌套,也就是利用mybatis工具自动完成对象的附着,例子把worker集合附着到student上,这样就能很容易看出student对应的worker集

//首先完成studentAndWorker表的映射,注意这是一个可以独立工作的映射关系,后续只是对其调用

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dao.StudentWorkerDao">
<select id="selectWorkersByStudentId" resultType="com.po.StudentAndWorker" parameterType="String">
select wid from s_w where ID=#{ID}
</select>
</mapper>


//DAO,mybatis-config那些略
//在student类添加List<StudentAndWorker> workersList用于存储s和w的关系表

<resultMap type="com.po.Student" id="StudentAndWorker1">
<id property="ID" column="ID" />
<result property="name" column="name" />
<result property="age" column="age" />
<!-- ofType表示集合中的元素类型,column指本表中将要传递给调用函数做查询参数的列 -->
<collection property="workersList" ofType="com.po.StudentAndWorker" column="ID" select="com.dao.StudentWorkerDao.selectWorkersByStudentId" />
</resultMap>

<select id="queryWorkers1" parameterType="String" resultMap="StudentAndWorker1">
select * from student where ID = #{ID}
</select>

//这样mybatis就会自动调用相应mapper的方法完成collection中的结果填充,以完成自身的全部结果映射

例二:对查询结果进行嵌套,即不调用其它mapper的查询方法,mybatis自身能通过不同POJO映射结果,最后的查询结果跟例一相似。

//DAO略,依然在student添加List<StudentAndWorker> workersList

<resultMap type="com.po.Student" id="studentAndWorker2">
<id property="ID" column="ID" />
<result property="name" column="name" />
<result property="age" column="age" />
<!-- ofType表示集合中的元素类型,我们这里需要为collection中的结果类的属性进行映射声明 -->
<collection property="workersList" ofType="com.po.StuWor">
<result property="wid" column="wid" />
</collection>
</resultMap>

<select id="queryWorkers2" parameterType="String" resultMap="studentAndWorker2">
select s.*, sw.wid
from student s, s_w sw
where s.ID = sw.ID and s.ID=#{ID}
</select>

//mybatis会自动把查询结果分开,对声明的属性进行映射,这里是把wid映射到collection所声明的链表List<StudentAndWorker>里类的wid属性
//注意最好不要把相同属性放到附着的集(这里至studentAndWorker和student共同属性ID),万一该属性被作为附着集合的primary key就很麻烦,整个集合只剩一个行了,因为primary key不重复。

所以,通过这两种查询嵌套或查询结果嵌套,我们能很方便地对结果进行类上的附着,然后进行业务逻辑的处理。关于多对多,其实一般用作两个一对多处理,所以mybatis其实也没有针对多对多查询的工具。

end


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值