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. ORA-13541: system moving window baseline size (691200) greater than retention (432000)

    修改awr生成报告时间间隔和保存时间时报错,由默认的每小时生成,保存8天修改为每半个小时生成一次,保存5天: SQL, retention); , retention); END; * ERROR a ...

  2. Setting up multi nodes live migration in Openstack Juno with devstack

    Setting up multi nodes live migration in Openstack Juno with devstack Summary Live migration overvie ...

  3. 青云QingCloud宣布完成C轮融资,金额1亿美元

    本轮融资由两家人民币基金领投,蓝驰创投跟投. 企业级基础云服务商青云QingCloud正式宣布完成金额为1亿美元的C轮融资,本轮融资由两家人民币基金领投,蓝驰创投跟投. 青云QingCloud公司成立 ...

  4. BuildWinRTL.dproj 用这个重新编译就行

    BuildWinRTL.dproj 用这个重新编译就行 我每次安装新版本,都删掉了这两个函数 {$IFDEF DEBUG}exports  dbkFCallWrapperAddr,{$IF defin ...

  5. InnoExtractor可以解压一些安装文件,以获得其中的特殊文件

    you can use InnoExtractor unpack the installer file and get uniSimpleEnc.dcu file. https://www.board ...

  6. C语言实现常用数据结构——栈

    #include<stdio.h> #include<stdlib.h> //用链表实现栈 typedef struct Node { int data; struct Nod ...

  7. java集合的方法及使用详解

    一.java集合的分类及相互之间的关系 Collection接口:向下提供了List和Set两个子接口 |------List接口:存储有序的,存储元素可以重复 |------ArrayList(主要 ...

  8. 每日一问:浅谈 onAttachedToWindow 和 onDetachedFromWindow

    基本上所有 Android 开发都会接触到 onCreate().onDestory().onStart().onStop() 等这些生命周期方法,但却不是所有人都会去关注到 onAttachXXX( ...

  9. 解决Nextcloud 无法删除目录

    1)进入维护模式 sudo -u www php /www/wwwroot/192.168.40.159/occ maintenance:mode --on 2)使用mysql命令行工具,在nextc ...

  10. ECMAScript6 语法

    声明变量 var let const var(声明局部变量,有局部外可用缺陷) 代码 <!DOCTYPE html> <html lang="en"> &l ...