在上一篇博客当中已经对单表的增删改查操作有课基本的认识,但是之前的增删改查操作都是在理想条件下完成的,也就是在没有出现其他情况的条件下出现的。现在考虑一下非理想条件下的情况。当属性名字与查询字段名字不相同的情况,
resultTpye可以将查询结果直接映射为实体bean对象的条件是,SQL查询的字段名与实体Bean的属性名一致。因为在将查询结果转换为指定类型的对象时,系统自动将查询结果字段名称作为对象的属性名,通过反射机制完成对象的创建。
当SQL查询结果的字段名与实体Bean的属性名不一致时候,将无法创建出需要类型的对象。此时有两种解决方案。
一、搭建测试环境
我们在之前的项目上进行更改,也就是在基本实现了CURD操作的项目上实现更改。
(1)修改DB中的student表
首先,我们的项目中的Student类中的score属性名与DB表的score字段名称一样,其他字段名与属性名均不相同。在这里我们将DB中的student表中的id->tid,name->tname,age->tage,score->score(不变)
(2)修改Dao接口
我们将其他的增删改查全部删掉,只保留一个接口
(3)定义Dao的实现类
将其他的全部删掉,只保留一个,也就是上面Dao中IStudent的接口实现方法
(4)修改测试类
我们将其他的全部删掉,只保留一个
(5)MybatisUtil类没有变化
二、解决方案
1、查询字段使用别名
虽然属性名称与表中字段名称不一致,但可以为查询结果的字段名称赋予别名,让别名与实体Bean的属性名相同。这样框架也可以根绝查询结果利用反射机制将对象创建。
现在我们在映射文件mapper中添加如下映射。注意由于DB表的score字段名与Student类的属性名相同,所以这里无需使用别名。
2、使用结果映射resultMap
可以使用结果映射resultMap来创建映射关系,完成由字段到属性的映射,达到将查询结果封装为对象的目的。resultMap是对resultType的增强。
OK,接下来我们在刚刚的基础上面,对mapper文件再进行修改,
<resultMap/>标签中定义了由type指定的类的属性名到表中字段名称的映射关系。根据这个映射关系,框架利用反射机制创建相应的对象。
- type:指定要映射的实体类
- id:指定该resultMap映射关系的名称
- <id>标签:id的字段名column与实体类的属性property的映射关系
- <result>标签:id以外其他字段名column与实体类的属性property间的映射关系,当然,对于字段名与实体类的属性相同的情况下,可以不写入<resultMap/>