resultType 可以将查询结果直接映射为实体 Bean 对象的条件是,SQL 查询的字段名与实 体 Bean 的属性名一致。
因为在将查询结果转换为指定类型对象时,系统自动将查询结果字 段名称作为对象的属性名,通过反射机制完成对象的创建。
当 SQL 查询结果的字段名和实体 Bean 的属性名不一致时,将无法创建出需要类型的对 象。此时有两种解决方案
1.查询字段使用别名
虽然属性名称与表中字段名称不一致,但可以为查询结果的字段名称赋予别名,让别名与实体 Bean 的属性名相同。
这样框架也可以根据查询结果利用反射机制将对象创建。 在映射文件 mapper 中添加如下映射。
注意,由于表的 score 字段名与 Student 类的属性名同名,所以这里无需使用别名
1 <select id="selectAllStudent" resultType="com.mybatis.model.Student"> <!-- 因为这里没有设置别名,所以需要加上包全名 --> 2 <!-- 属性名称和 表中字段不一致 如:表中是sage,属性名称是age,这样的话,是无法反射调用set方法,完成对象的构造的 --> 3 <!-- 可以通过为查询出的数据库中的字段起别名的方式,使其和对象保持一致 --> 4 select sage age ,sname name ,score from student 5 </select>
2.使用结果映射resultMap
可以使用结果映射resultMap(这里的Map映射mapper的意思)来建立映射关系
完成由字段到属性的映射,达到将查询结果封装为对象的目的
resultMap 是对 resultType的增强
1 <!-- 使用结果映射的方式 resultMap 完成字段到属性的映射,达到将查询结果封装为对象的目的--> 2 <!-- 可以将resultMap理解为 resultType的增强 --> 3 <resultMap type="com.mybatis.model.Student" id="studentMapper"> 4 <id column="sid" property="id"/> 5 <result column="sname" property="name"/> 6 <result column="sage" property="age"/> 7 </resultMap> 8 9 <!-- 这里需要指定结果类型,不然查询出来了,都不知道构成什么对象 --> 10 <select id="selectAllStudent" resultMap="studentMapper"> 11 select sage,sname,score from student 12 </select>
<resultMap/>标签中定义了由 type 指定的类的属性名到表中字段名称的映射关系。根据 这个映射关系,框架利用反射机制创建相应对象。
type:指定要映射的实体类
id:指定该 resultMap 映射关系的名称
<id>标签:id 的字段名 column 与实体类的属性 property 间的映射关系
<result>标签:id 以外其它字段名 column 与实体类的属性 property 间的映射关系
当然,对于字段名与实体类的属性名相同的情况,可以不写入<resultMap/>中。