resultMap 元素是 MyBatis 中最重要最强大的元素。它就是让你远离 90%的需要从结果 集中取出数据的 JDBC 代码的那个东西。(官方原话)
一直不太清楚,明明resultType比resultMap用起来方便,为什么还有后者。看了文档大约明白了些。
resultType是结果集的一个映射,可以简单的写成resultType="map"或者resultType="hashmap",其中"map"和"hashmap"都是mybatis能够识别的别名,写成"java.util.HashMap"当然也没有问题,在java代码端,是这么写的:
List<Map<String,Object>> list =sqlSession.selectList("User.test"); for(Map<String,Object> map :list){ System.out.println(map.get("id")); }
通过map.get("key"),就可以获取你需要的结果。
然而, HashMap 不能很好的描述一个领域模型。那样你的应用程序将会使用 JavaBeans 或 POJOs(Plain Old Java Objects,普通 Java 对象)来作为领域模型。也就是常用的实体类,比如:
package entity; public class User { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
此时,resultType="entity.User"。当然,如果包名太长,也可以使用自定义的别名,标签如下:
<typeAlias type="com.someapp.model.User" alias="User"/>
这样就能简化标签内的代码resultType="User"
写到这里,似乎并没有resultMap什么事,实际上,在进行了上诉的配置之后,mybatis会在幕后自动创建一个 ResultMap,基于属性名来映射列到 JavaBean 的属性上,当然也可以使用sql别名来映射。
如果不使用resultType,也可以直接使用resultMap,配置如下:
<resultMap id="userResultMap" type="entity.User"> <id property="id" column="sort " /> <result property="name" column="shardname"/> </resultMap> <select id="test" resultMape="userResultMap"> select shardname,sort from tbl_system_popedom </select>
column是sql查出来对应的列名,property对应实体中的变量名。使用resultType时,两者需要相同的缘故就在这里了,否则mybatis不知道如何进行映射。深层次的原因,还需要去看源码。
上面这个例子,大约能够解释resultMap和resultType的区别了,说白了,即便使用resultType,mybatis也将使用resultMap进行查询结果的映射。只是映射过程我们是看不见的,方便写代码。
resultMap中id和result的区别:这两者之间的唯一不同是id 表示的结果将是当比较对象实例时用到的标识属性。这帮助来改进整体表现,特别是缓存和嵌入结果映射(也就是联合映射) 。官方原话,简单的理解,就是当某一个列是唯一索引时,用id标签,提高效率。
PS:parameterType也有一个类似的parameterMap,不过后者已经被弃用了,所以少侠们就不用去纠结两者的区别了。