1,前言
在使用mybatis出现了数据库列名与实体类中属性名不一致的问题,特此记录
2,错误报告
2.1,Mapper.xml文件
<select id="queryRootById2" resultType="root">
select root_Id ,root_Pwd from root where root_Id=#{rootId}
</select>
2.2,实体类:root
public class root {
private String rootId;
private String rootPwd;
...
}
2.3,与之对应的数据库表
2.4,错误报告
(节选)
3,原因:
这是由于实体类中的属性名和数据库中的列名不一致的导致的,
select root_Id ,root_Pwd from root where root_Id=#{rootId}
-- 在这个过程中是有类型处理器将数据中的字段名一个一个映射到实体类的属性名中的,
-- 但他不知道root_Id,root_Pwd该映射给谁?因为实体类中并没有root_Id,root_Pwd这些属性
-- 所以到了最后,程序执行sql语句时会出错
4,解决–ResultMap
而Mybatis给我们提供了解决的方法,Mybatis的官方文档有:
4.1,方式一:隐式配置ResultMap
在这些情况下,MyBatis 会在幕后自动创建一个 ResultMap,再根据属性名来映射列到 JavaBean 的属性上。
如果列名和属性名不能匹配上,可以在 SELECT 语句中设置列别名(这是一个基本的 SQL 特性)来完成匹配。
Mapper.xml可以这样改
<select id="queryRootById2" resultType="root">
select root_Id as rootId,root_Pwd as rootPwd from root where root_Id=#{rootId}
</select>
结果:
4.2,方式二:显式配置ResultMap
在学习了上面的知识后,你会发现上面的例子没有一个需要显式配置 ResultMap,这就是 ResultMap 的优秀之处——你完全可以不用显式地配置它们。 虽然上面的例子不用显式配置 ResultMap。 但为了讲解,我们来看看如果在刚刚的示例中,显式使用外部的 resultMap 会怎样,这也是解决列名不匹配的另外一种方式。
Mapper.xml文件可以这样写
<resultMap id="rootMap" type="root">
<result column="root_Id" property="rootId"/>
<result column="root_Pwd" property="rootPwd"/>
</resultMap>
<select id="queryRootById2" resultMap="rootMap">
select * from root where root_Id=#{rootId}
</select>
结果:
5,扩展:
只是这样的ResultMap其实并不能满足开发中的需求,所以~
未完待续…