7.属性名与查询字段名不相同

Posted 白日梦想家12138

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了7.属性名与查询字段名不相同相关的知识,希望对你有一定的参考价值。

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/>中。

 

以上是关于7.属性名与查询字段名不相同的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis学习总结——解决字段名与实体类属性名不相同的冲突

MyBatis学习总结——解决字段名与实体类属性名不相同的冲突(转载)

Mybatis解决字段名与实体类属性名不相同的冲突

MyBatis——解决字段名与实体类属性名不相同的冲突

MyBatis学习总结——解决字段名与实体类属性名不相同的冲突

MyBatis学习总结——解决字段名与实体类属性名不相同的冲突