mybatis参数resultType和resultMap一些解释

先贴上官方API路径示敬,果然还是文档写的清楚 http://my.oschina.net/mutianya/blog/168268

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,不过后者已经被弃用了,所以少侠们就不用去纠结两者的区别了。

猜你喜欢

转载自4876391520.iteye.com/blog/2278167