resultType 和resultMap 的区别!
MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接
表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。
1.resultType
在MyBatis进行查询映射的时候,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,
值则是其对应的值。当提供的返回类型属性是resultType的时候,MyBatis会将Map里面的键值对取出赋给
resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,
只是当我们提供的返回类型属性是resultType的时候,MyBatis对自动的给我们把对应的值赋给resultType
所指定对象的属性,而当我们提供的返回类型是resultMap的时候,因为Map不能很好表示领域模型,
我们就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。
这里要强调的是,Mybatis是对返回的结果的每一行做映射的。所以,下面的语句返回的是Integer,而不是List
- <select id="count" parameterType="AreaDto" resultType="java.lang.Integer">
- SELECT id FROM USER
- </select>
- <select id="count" parameterType="AreaDto" resultType="java.lang.Integer">
- SELECT count(*) FROM USER
- </select>
- 返回一个int
- <select id=”selectUsers” parameterType=”int” resultType=”hashmap”>
- select id, username, hashedPassword
- from some_table
- where id = #{id}
- </select>
- 返回map
这样一个语句简单作用于所有列被自动映射到HashMap的键上,这由resultType属性指定。这在很多情况下是有用的,但是HashMap不能很好描述一个领域模型。那样你的应用程序将会使用JavaBeans或POJOs(Plain Old Java Objects,普通Java对象)来作为领域模型
返回javaBEAN 对象
- <select id="count" parameterType="AreaDto" resultType="User">
- SELECT * FROM USER
- </select>
- 要记住类型别名是你的伙伴。使用它们你可以不用输入类的全路径
- <typeAlias type=”com.someapp.model.User” alias=”User”/>
- 这些情况下,MyBatis会在幕后自动创建一个ResultMap,基于属性名来映射列到JavaBean的属性上
2.resultMap
MyBatis会自动创建一个ResultMap对象,然后基于查找出来的属性名进行键值对封装,然后再看到返回类型是Blog对象,再从ResultMap中取出与Blog对象对应的键值对进行赋值。
当返回类型直接是一个ResultMap的时候也是非常有用的,这主要用在进行复杂联合查询上,因为进行简单查询是没有什么必要的。
简单resultMap配置
- <resultMap type="com.liulanghan.Blog" id="BlogResult">
- <id column="id" property="id"/>
- <result column="title" property="title"/>
- <result column="content" property="content"/>
- <result column="owner" property="owner"/>
- </resultMap>
- <select id="selectBlog" parameterType="int" resultMap="BlogResult">
- select * from t_blog where id = #{id}
- </select>
结果集的列比resultMap多会报错么?
不会,只映射resultMap中有的列。
结果集的列比resultMap少会报错么?
不会,只映射结果集中有的列。