Mybatis之ResultMap,ResultType总结
调用mapper查询数据时,一般来讲,需要搞清楚返回集与返回类型的区别:
一:ResultMap
实际上对于数据库表而言,通常会为其自动生成一组model类,继承基础抽象类方法的mapper,以及对应的mapping实现文件,其中ResultMap在基础mapping文件很常见,值被设置为BaseResultMap,下面以一个省略get/set方法的简单model类为例:
public class User{ private Integer id, private String userName, }
<mapper namespace="UserMapper" > <resultMap id="BaseResultMap" type="User" > <id column="id" property="id" jdbcType="Integer" /> <result column="user_name" property="userName" jdbcType="String" /> </resultMap> </mapper>
1 数据库字段分别对应id,user_name,那么基础mapping文件中会存在如下映射,id对应id,userName对应user_name;即当ResultMap中使用BaseResultMap时,mybatis会自动根据字段设置映射关系,无需将数据库字段更改成为符合类属性名的别名,后调用model类的set方法进行实例化,免去了手动设置的问题。
2 collection标签,多数情况下,当多表jion时如果希望查到多条数据,但是又希望主干部分相同的元素作为列表进行聚合,那么这个时候可以使用<collection>标签对子列表进行聚合,一般需要指定几个属性,其中collection标签含义解释如下:
property:子列表列表聚合时在ResultMap标签中type的实体类的列表属性名称,不需要指定数据库字段,即向该列表中聚合;
ofType:注入值得对象的路径,collection标签下,数据库字段与对象字段映射时,需要指定实体类入口路径,以set或构造方式注入对象;
javaType:子列表对象的聚合形式,用的比较多的是集合,例如Set<Object>,List<Object>,ArrayList<Object>等,需要和申明形式一致或者是申明形式的具体实现;
二:ResultType
ResultType比较特殊,用来指定一个方法返回字段的类型,可以是Integer,Long,String等,也可以用来指定model类(不一定是该mapper对应model),map集合等,没有明显限制。当使用ResultType作为返回集的时候,就需要注意一些问题了,如果是Integer这样的包装类,由于对返回类型的指定,需要对SQL查询结果进行Java类型转换,可能会出现无法转换为该类型;
当以model类作为返回类型的时候,需要手动将字段更改别名,myba才能识别并将属性注入到实体类,当以数据库字段直接返回时,会出现部分属性在数据库中有值,但是返回后却出现空指针异常,也正是这个原因;
当以map作为返回形式的时候,方法返回形式通常是Map<String,Object>,具体返回包括HashMap,TreeMap等,字段名作为key,value以Object的形式,映射至map集合中,具体类型需要开发者自行判断,但是不建议这种形式,魔法值作为key是非常不规范的,也难以阅读。