From《MyBatis从入门到精通》

    <!--
        6.1.2.1 collection集合的嵌套结果映射

            和association类似,集合的嵌套结果映射就是指通过一次SQL查询将所有的结果查询
            出来,然后通过配置的结果映射,将数据映射到不同的对象中去。在一对多的关系中,主
            表的一条记录对对应关联表中的多条数据,因此一般查询时会查询多个结果,按照一对多
            的数据结构存储数据的时候,最终的结果数会小于等于查询的总记录数。
    -->
    <resultMap id="userRoleListMap" type="tk.mybatis.simple.model.SysUser"
               extends="userMap">
        <id property="id" column="id"/>
        <result property="userName" column="user_name"/>
        <result property="userPassword" column="user_password"/>
        <result property="userEmail" column="user_email"/>
        <result property="userInfo" column="user_info"/>
        <result property="headImg" column="head_img"/>
        <result property="createTime" column="create_time"/>
        <collection property="roleList" columnPrefix="role_"
                    javaType="tk.mybatis.simple.model.SysRole">
            <id property="id" column="id"/>
            <result property="roleName" column="role_name"/>
            <result property="enabled" column="enabled"/>
            <result property="createBy" column="create_by"/>
            <result property="createTime" column="create_time"
                            jdbcType="TIMESTAMP"/>
        </collection>
    </resultMap>

    <!--最终简化版本-->
    <resultMap id="userRoleListMap" extends="userMap"
               type="tk.mybatis.simple.model.SysUser">
        <collection property="roleList" columnPrefix="role_"
                    resultMap="tk.mybatis.simple.mapper.RoleMapper.roleMap"/>
    </resultMap>

    <!--
        解读:
            我忽视了一个问题,数据库呈现查询结果是通过记录数~~~

            通过日志可以清楚的看到,SQL执行的结果数有3条,后面输出的用户数是2,也就是说
            本来查询出的3条结果经过MyBatis对collection数据处理后,变成了两条。一个用户
            拥有多个角色,查询到的记录中,是通过记录数呈现的。但是MyBatis又怎么知道要处理
            成这样的结果呢?

            先来看看MyBatis是如何知道要合并admin的两条数据的:
                MyBatis在处理结果的时候,会判断结果是否相同,如果相同的结果,则只会保留第一个结果
                所以这个问题的关键点就是MyBatis如何判断结果是否相同。MyBatis判断结果是否相同时,
                最简单的情况就是在映射配置中至少有一个id标签:
                    <id property="id" column="id">
                我们对id(构造方法中为idArg)的理解一般是,它配置的字段为表的主键(联合主键时可以配置
                多个id标签),因为MyBatis的resultMap只用于配置结果如何映射,并不知道这个表的具体如何。
                id的唯一作用就是在嵌套的映射配置时判断数据是否相同,当配置id标签时,MyBatis只需要逐条
                比较所有数据中id标签配置的字段值是否相同即可。在配置嵌套结果查询时,配置id标签可以提高
                处理效率。
    -->

    <!--
        6.1.2.2 collection集合的嵌套查询
    -->

MyBatis 一对多映射的更多相关文章

  1. mybatis一对多映射

    场景: A:SecControlRulePojo.java B:SecControlSubRulePojo C:SecControlSubRuleManyPojo 实体A中包含List<B> ...

  2. mybatis一对多映射【班级与学生】

    1)如图 2)创建grades.sql和students.sql drop table students; drop table grades; create table grades( gid in ...

  3. MyBatis一对多映射简单查询案例(嵌套结果)

    一.案例描述 书本类别表和书本信息表,查询书本类别表中的某一记录,连带查询出所有该类别书本的信息. 二.数据库表格 书本类别表(booktypeid,booktypename) 书本信息表(booki ...

  4. MyBatis一对多映射简单查询案例(嵌套Mapper映射文件中的sql语句)

    一.案例描述 书本类别表和书本信息表,查询书本类别表中的某一记录,连带查询出所有该类别书本的信息. 二.数据库表格 书本类别表(booktypeid,booktypename) 书本信息表(booki ...

  5. mybatis一对多映射分页的问题

    一对多可能会出现分页错误 条数不对的问题 解决方法: 将主表分页查询一次 SELECT aa.id,aa.name,bb.name FROM (SELECT * from tab1 ORDER BY ...

  6. 33、mybatis(二)

    第十六章回顾SQL99中的连接查询 1)内连接 2)外连接 3)自连接 第十七章回顾hibernate多表开发 1)一对一 2)一对多 3)多对多 第十八章 mybatis一对一映射[学生与身份证] ...

  7. mybatis进阶

    1.mybatis一对一映射 Student--Card <?xml version="1.0" encoding="utf-8" ?> <! ...

  8. Mybatis学习 day02

    第十六章回顾SQL99中的连接查询 1)内连接 2)外连接 3)自连接 第十七章回顾hibernate多表开发 1)一对一 2)一对多 3)多对多 第十八章 mybatis一对一映射[学生与身份证] ...

  9. springboot学习——第二集:整合Mybaits

    1,Mybatis动态插入(insert)数据(使用trim标签):https://blog.csdn.net/h12kjgj/article/details/55003713 2,mybatis 中 ...

随机推荐

  1. Resolve conflict using "MERGE_HEAD (origin/HEAD)"

    Git进行同步的时候,经常会出现冲突,有时候冲突的选项会有图示中的三种选项: 1.Resolved:直接把文件标识为冲突已经解决,一般是自己手动查看并解决完冲突以后使用. 2.Resolve conf ...

  2. duilib菜单开发遇见“0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突”

    我的程序是这样一个逻辑. 首先创建用户列表,点击列表项弹出菜单,点击菜单上“设备选项”,弹出设备列表,上面显示这个用户拥有的设备. 菜单的创建参考了这为博主的教程:http://www.cnblogs ...

  3. SignalR---服务端

    原文:SignalR---服务端 前段时间把SignalR的官网教程大致看了一下,算是翻译了一遍,加上了自己的个人理解, 一下上传三个文件,分别是服务端.web客户端.DOTNET客户端相关文档,供大 ...

  4. C#高性能大容量SOCKET并发(五):粘包、分包、解包

    原文:C#高性能大容量SOCKET并发(五):粘包.分包.解包 粘包 使用TCP长连接就会引入粘包的问题,粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一 ...

  5. C#实现bitmap图像矫正

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. isHiden和isVisible的区别(可是有nativeEvent进行设置)

    之前一直对isHiden和isVisible的区别比较模糊,都是乱用的.今天因需要仔细看了一下. 1.isHiden只是返回部件的隐藏属性,并不能表示部件当前的真实状态.比如A部件有个子部件B,而A处 ...

  7. Qt系统对话框中文化及应用程序实现重启及使用QSS样式表文件及使用程序启动界面

    一.应用程序中文化 1).Qt安装目录下有一个目录translations/,在此目录下有qt_zh_CN.ts和 qt_zh_CN.qm把它们拷贝到你的工程目录下. 2).在main函数加入下列代码 ...

  8. Android WebView设置背景透明

    Adndroid 2.x的设置 在Android 2.x下,设置webview背景为透明的方法: wvContent.setBackgroundColor(0); Adndroid 4.0 由于硬件加 ...

  9. centos7PXE和cobbler自动部署装机

    安装程序启动过程MBR:isolinux/boot.catstage2: isolinux/isolinux.bin配置文件:isolinux/isolinux.cfg 每个对应的菜单选项: 加 ...

  10. PHP学习(一)

    // php注释: // 单行注释 /*多行注释 多行注释*/ /** *姓名:李华 *时间:2016年 *内容:文档注释 */ #这是脚本注释--以下是注释代码 /*php的数据类型: 标量类型(4 ...