mybatis <id> <result> tag differences in <resultMap>

泪湿孤枕 提交于 2020-08-03 09:38:09

问题


I have done a lot of research and no avail. In Mybatis documentation, it says

id – an ID result; flagging results as ID will help improve overall performance

result – a normal result injected into a field or JavaBean property

If they can both inject into a field, and id has performance improvement, so what stops me from only using id at all? Is this just semantic that I will map the primary key to id tag?

I have tried:

<resultMap id="teacherMap" type="me.funmap.model.Teacher" autoMapping="true">
    <result column="t_id" property="t_id"/>
    <collection property="students" javaType="List" ofType="me.funmap.model.Student" autoMapping="true">
        <result column="s_id" property="s_id"/>
    </collection>
</resultMap>

and

<resultMap id="teacherMap" type="me.funmap.model.Teacher" autoMapping="true">
    <id column="t_id" property="t_id"/>
    <collection property="students" javaType="List" ofType="me.funmap.model.Student" autoMapping="true">
        <id column="s_id" property="s_id"/>
    </collection>
</resultMap>

the statement

<select id="getAllTeacher" resultMap="teacherMap">
    SELECT teacher.t_id, t_name, s_id from teacher INNER JOIN student ON teacher.t_id = student.t_id
</select>

result of statement

       t_id    t_name           s_id

|          1 | teacher      |      38 |
|          1 | teacher      |      39 |
|          1 | teacher      |      40 |
|          1 | teacher      |      41 |
|          1 | teacher      |      42 |
|          1 | teacher      |      43 |

I get the same result using either id or result, so what is the difference between <result> and <id> tag in resultMap?


回答1:


The reason why you get the same result using either <id> or <result> is: when you use <collection> inside <resultMap>, if you declare <id>(s), MyBatis will only use <id>(s) to group rows having the same <id>(s) value, if you don't declare any <id>, it will use all <result>s to group rows having the same <result>(s) value.

If the result is:

       t_id    t_name           s_id

|          1 | An      |      38 |
|          1 | An      |      39 |
|          1 | An      |      40 |
|          2 | An      |      41 |
|          2 | An      |      42 |
|          2 | An      |      43 |

When you declare the <resultMap> as

<resultMap id="teacherMap" type="me.funmap.model.Teacher" autoMapping="true">
    <id column="t_name" property="t_name"/>
    <result column="t_id" property="t_id"/>
    <collection property="students" javaType="List" ofType="me.funmap.model.Student" autoMapping="true">
        <result column="s_id" property="s_id"/>
    </collection>
</resultMap>

You get only one teacher who has six students.

But when you declare the <resultMap> as

<resultMap id="teacherMap" type="me.funmap.model.Teacher" autoMapping="true">
    <result column="t_name" property="t_name"/>
    <result column="t_id" property="t_id"/>
    <collection property="students" javaType="List" ofType="me.funmap.model.Student" autoMapping="true">
        <result column="s_id" property="s_id"/>
    </collection>
</resultMap>

You get two teacher, and both have three students.



来源:https://stackoverflow.com/questions/48729551/mybatis-id-result-tag-differences-in-resultmap

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!