id和result的区别你懂了吗? | 小册免费学

2,100 阅读2分钟

大家好,这篇文章讲的是在编写MyBatis的映射文件(即mapper.xml)的时候,总会出现idresult,而且仔细一看,发现总是id的标签总是设置为id,而其他属性的标签总是为result,那这两者有什么区别呢?笔者今天就带大家探讨探讨。

背景

在MyBatis映射文件中,当不自定义typeHandler标签的时候,数据库查询的结果集ResultSet对应到具体的POJO(Plain Old Java Object)的过程中,如果存在非默认类型处理器能够处理的范围时,就会无法对应,那么MyBatis阈值的类型处理器有哪些呢?大致为Integer(int)Double(double)StringDateEnum

除了这些之外的其他类型,要能够一一对应,可以考虑自定义resultMap的方式进行,而在编写resultMap的时候,常常会出现标签为idresult来进行映射,下面是一个例子。

<resultMap id="userHandlerMap" type="com.linkedbear.mybatis.entity.User">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
        <result property="birthday" column="birthday"/>
        <association property="department" javaType="com.linkedbear.mybatis.entity.Department"/>
</resultMap>

标签resultid区别

由于网上有人说二者的区别在于id标识的映射必须propertycolumn的值相等,所以笔者把name的标签result改为id,并修改了属性名为name1。但是仍然能正常运行出对应的结果,这时不禁好奇,这两者的区别在哪里呢?

网上有很多猜测,但是都不正确,最后笔者在MyBatis的官方文档中给出了回答:

The only difference between the two is that id will flag the result as an identifier property to be used when comparing object instances. This helps to improve general performance, but especially performance of caching and nested result mapping (i.e. join mapping).

也就是说,使用id进行表识的属性会被作为分辨两个对象不同的依据。这句话可能有点绕,但联想一下MySQL中的Primary Key,也就是主键,即通过标签id来保存对象的主键,便于在进行比较的时候不需要进行全部属性比较,能够节省性能,尤其是在关联映射的时候。

总结

简单来说,id比起result的多了一个承担着标识对象的功能,即只需要判断id标识的属性就可以判断两个对象的异同。

同时也通过这个过程发现了网上的资料大多有偏差,最好的参考方式:一是动手实践,用事实说话;二是查阅官方文档,更加原汁原味!

本文正在参与「掘金小册免费学啦!」活动, 点击查看活动详情