一、需求描述

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

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

二、需求分析

以前在学习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

Mybatis中使用级联查询,一对多的查询的更多相关文章

  1. mybatis中实现一对一,一对多查询

    在实际的开发中我们经常用到的是一对一查询和一对多查询.而多对多的实现是通过中间来实现,这里就没有给出来了 比如: 订单和用户是一对一的关系(一个订单只能对应一个用户) 订单和订单明细是一对多的关系(一 ...

  2. MyBatis初级实战之六:一对多关联查询

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. MyBatis中动态SQL语句完成多条件查询

    一看这标题,我都感觉到是mybatis在动态SQL语句中的多条件查询是多么的强大,不仅让我们用SQL语句完成了对数据库的操作:还通过一些条件选择语句让我们SQL的多条件.动态查询更加容易.简洁.直观. ...

  4. mybatis中xml字段空判断及模糊查询

    由于业务特殊的查询需求,需要下面的这种查询,一直感觉模糊不清,本地测试一下顺便做个总结 贴一段xml代码,如下: <if test="receivedName != null and ...

  5. 分享知识-快乐自己:论 Mybatis中的关联关系(一对多,多对一,多对多)

    论:一对多:(举例一个省有多个市)就是实体类中有(市)类型集合属性:多对一:(多个市有一个共同的省)就是类中有(省)类型的属性.下面来介绍:一对一.多对一的使用方式. 一对多方: package ml ...

  6. Mybatis中的Mapper.xml映射文件sql查询接收多个参数

    ​ 我们都知道,在Mybatis中的Mapper.xml映射文件可以定制动态SQL,在dao层定义的接口中定义的参数传到xml文件中之后,在查询之前mybatis会对其进行动态解析,通常使用#{}接收 ...

  7. MyBatis 中的级联

    MyBatis 的级联分为 3 种. 1.鉴别器(discriminator):它是根据某些条件决定采用具体实现类级联的方案,比如体检表要根据性别去区分. 2.一对一(association):比如学 ...

  8. MyBatis中collection (一对一,一对多)

    MyBatis学习:http://www.mybatis.org/mybatis-3/zh/index.html 大对象InsuranceDetailsVO: com.quicksure.mobile ...

  9. MyBatis中多对多关系的映射和查询

    先说一下需求: 在页面上显示数据库中的所有图书,显示图书的同时,显示出该图书所属的类别(这里一本书可能同时属于多个类别) 创建表: 笔者这里使用 中间表 连接 图书表 和 图书类别表,图书表中 没有使 ...

随机推荐

  1. HttpClient调用doGet、doPost、JSON传参及获得返回值

    调用 doPost:map传参 Map<String,Object> map = new HashMap<>(); map.put("test"," ...

  2. MATLAB—二维函数可视化

    本文主要总结一下MATLAB的一些常用二维绘图指令. 文章目录 一.plot绘图指令 1.离散数据点形设置值 2.连续线型设置值 3.颜色设置值 4.常用属性和属性值 5.例题 二.subplot绘图 ...

  3. logmein逆向

    IDA打开整体先看看. 学个函数: strcpy:即字符串复制 v8=这么一大串字符串 我们让程序调到sub_4007F0(),就OK. 我们使用python来写, 主要迷惑的还是下面都是情深深雨蒙蒙 ...

  4. spring开发中常见错误集合,逐步添加

    1.关于jstl错误:原因,在jsp页面中使用了jstl标签库,但是却没有导入,可以将相应的jar包放在tomcat的lib目录下,一劳永逸 Java.lang.NoClassDefFoundErro ...

  5. Linux下Qt创建共享库与链接共享库详解

    随着程序写的逐渐变多,或多或少的我们都会使用别人写好的库:或者我们不想让别人看到我们的一些核心程序,可以将核心程序封装成库.本次和大家分享的是在Ubuntu下使用Qt生成共享库以及在Qt中链接共享库的 ...

  6. 在C#中使用C++编写的类——用托管C++进行封装

    现在在Windows下的应用程序开发,VS.Net占据了绝大多数的份额.因此很多以前搞VC++开发的人都转向用更强大的VS.Net.在这种情况下,有很多开发人员就面临了如何在C#中使用C++开发好的类 ...

  7. ThreadPoolExecutor八种拒绝策略浅析

    转自:http://www.kailing.pub/article/index/arcid/255.html 前言 谈到java的线程池最熟悉的莫过于ExecutorService接口了,jdk1.5 ...

  8. Best Cow Line

    给定长度为N的字符串s,要构造一个长度为N的字符串T.起初,T是一个空串,随后反复进行下列任意操作. -从S的头部删除一个字符,加到T的尾部 -从S的尾部删除一个宇符,加到T的尾部 目标是要构造字典序 ...

  9. 关于通用Mapper new Example使用记录

    关于通用MapperExample使用记录 环境准备 需要集成 mybatis 的 generator 插件,方便自动生成 实体类和 mapper 类,还可以生成xml,不过一般我们都不用 xml b ...

  10. linux下查看磁盘使用内存及清除日志内存

    1.查看磁盘内存 df -h 2.清理日志内存 echo "">catalina.out