Mybatis中使用级联查询,一对多的查询

2021-09-24

一、需求描述

自己在开发一个小程序的过程中,需要做的一个查询是稍微比较复杂的查询,根据用户信息去查询用户所对应的宠物信息。

一个用户可能对应多个宠物,所以在用户和宠物信息的对应关系就是一对多的关系。


二、需求分析

以前在学习mybatis的时候,大致记得mybatis里面有级联查询的功能,只需要在xml文件中写好响应的sql和配置好响应的

查询即可。自己立马去百度里面搜索,看了几篇博文,把以前学习的东西都记起来了,立马进行使用。


三、解决方案

涉及输出类,里面包含集合类型,如下

 主查询语句如下//

<select id="userRank" resultMap="userRankResultMap">
SELECT
@rownum := @rownum + 1 user_rank,
tab.user_id,
tab.nick_name,
tab.user_name,
IFNULL(tab.avatar_url, '') avatar_url,
tab.user_experience,
tab.user_level,
tab.openid
FROM
(SELECT @rownum := 0) a,
(
SELECT
f.user_id,
f.nick_name,
f.user_name,
f.avatar_url,
f.user_experience,
f.user_level,
SUM(
IFNULL(f.user_experience, 0)
) expSum,
f.openid
FROM
app_user_info f WHERE f.status = 1
GROUP BY
f.user_id
ORDER BY
expSum DESC
) tab
</select>

查询结果集为
<!-- 查询结果集 -->
<resultMap id="userRankResultMap" type="applets.user.outvo.RankOutVo">
<id column="user_rank" property="userRank" jdbcType="INTEGER" />
<result column="user_id" property="userId" jdbcType="VARCHAR" />
<result column="nick_name" property="nickName" jdbcType="VARCHAR" />
<result column="user_name" property="userName" jdbcType="VARCHAR" />
<result column="avatar_url" property="avatarUrl" jdbcType="VARCHAR" />
<result column="user_experience" property="userExperience" jdbcType="INTEGER" />
<result column="user_level" property="userLevel" jdbcType="INTEGER" />
<result column="openid" property="openid" jdbcType="VARCHAR" />
<!-- 关联查询用户已经领养宠物列表
ofType:指定关联查询的结果集中的对象类型即List中的对象类型。
    collection:表示一对多当中的集合类型
    column:表示主查询和关联查询之间的关联条件

-->
<collection property="petList" ofType="applets.nature.entiry.PetInfo" column="openid" select="selectPetInfo">
</collection>
</resultMap>

 最后一个关联查询为

<!-- 排名查询中的子查询 -->
<select id="selectPetInfo" resultType="applets.nature.entiry.PetInfo">
SELECT pet_id, pet_type, pet_name, pet_level
FROM app_pet_info
WHERE openid = #{openid, jdbcType = VARCHAR}
AND species_type = 2
AND is_adopt = 1
ORDER BY pet_level DESC
LIMIT 3
</select>

 写好后测试结果正确。打印的日志为先查询第一个主查询,关联查询会查询多次。

参考文章:

https://www.cnblogs.com/yigedingzi/p/10836734.html

https://zhuanlan.zhihu.com/p/40621891