ResultType和ResultMap的区别

总结:

基本映射:(resultType)使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功
(数据库,实体,查询字段,这些全部都得一一对应),高级映射:(resultMap)如果查询出来的列名和pojo的属性名不一致,
通过定义一个resultType对列名和pojo属性名之间作一个映射关系。(高级映射,字段名称可以不一致,通过映射来实现)。
resultType和resultMap功能类似,都是返回对象信息,但是resultMap要更强大一些,可自定义,resultMap要配置一下,表
和类的一一对应关系,所以说就算你的字段名和你的实体类的属性名不一样也没关系,都会给你映射出来,但是
Mybatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型
的,resultMap则是对外部resultMap的引用,但是resultType和resultMap不能同时存在。
在Mybatis进行查询映射的时候,其实查询出来的每一个属性都是放在一个对应的Map里面,其中键是属性名,值则是其对应的值。
(1)当提供的返回值类型属性是resultType时,Mybatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性,
所以其实Mybatis的每一个查询映射的返回值类型都是resultMap,只是当提供的返回类型属性是resultType的时候,Mybatis
会自动的给把对应的值赋给resultType所指定对象的属性。
(2)当提供的返回值类型是resultMap时,因为Map不能很好的表示领域模型,就需要自己再进一步的把它转化为对应的对象,
这常常在复杂查询中很有作用。
resultMap:适合使用返回值是自定义实体类的情况。
resultType:适合使用返回值的数据类型是非自定义的,即jdk提供的类型。

ResultType

resultType可以直接返回给出的返回值类型,比如:String,int,Map等等,其中返回List也是将返回类型定义为Map,然后
Mybatis会自动将这些map放在一个List中,resultType还可以是一个对象。
resultType对应的是Java对象中的属性,大小写不敏感。
resultType如果放的是java.lang.Map,key是查询语句的列名,value是查询的值,大小写敏感。
resultMap指的是定义好了的id,是定义好的resultType的引用。
注意:
用resultType的时候,要保证结果集的列名与Java对象的属性相同,而resultMap则不用,而且resultMap可以用typeHander转换
parameterType:参数类型,只能传一个参数,如果有多个参数要封装,如封装成一个类,要写包名+类名,基本数据类型则可以省略。
一对一,一对多时,若有表的字段相同必须写别名,不然查询结果无法正常映射,出现某属性为空或者返回的结果与想象中的不同时,而这往往是没有报错的。

ResultMap

适合使用返回值是自定义实体类的情况。
映射实体类的数据类型
id:resultMap的唯一标识
column:库表的字段名
property:实体类的属性名

id和result属性

<id property=" " column=" "/>
<result property=" " column=" "/>
这是最基本的结果集映射,id和result将列映射到属性或简单的数据类型字段(String,int,double,Date等)
这两者唯一不同的是,在比较对象实例时,id作为结果集的标识属性,这有助于提高总体性能,特别是应用缓存和嵌套结果映射的时候。
Attribute Description
property 映射数据库列的字段或属性。如果JavaBean 的属性与给定的名称匹配,就会使用匹配的名字。否则,MyBatis 将搜索给定名称的字段。两种情况下您都可以使用逗点的属性形式。比如,您可以映射到“username”,也可以映射到“address.street.number”。
column 数据库的列名或者列标签别名。与传递给resultSet.getString(columnName)的参数名称相同。
javaType 完整java类名或别名(参考上面的内置别名列表)。如果映射到一个JavaBean,那MyBatis 通常会自行检测到。然而,如果映射到一个HashMap,那您应该明确指定javaType 来确保所需行为。
jdbcType 这张表下面支持的JDBC类型列表列出的JDBC类型。这个属性只在insert,update或delete 的时候针对允许空的列有用。JDBC 需要这项,但MyBatis 不需要。如果您直接编写JDBC代码,在允许为空值的情况下需要指定这个类型。
typeHandler 我们已经在文档中讨论过默认类型处理器。使用这个属性可以重写默认类型处理器。它的值可以是一个TypeHandler实现的完整类名,也可以是一个类型别名。