ResultMap
要解决的问题:属性名和字段名不一致。
也就是解决实体类中属性名和数据库中的字段名不一致 查询结果为 null 的问题。的问题。
数据库中的user表:
实体类中的属性名:
查询结果:
User{id=1, name=null, birthday=Tue Aug 05 00:00:00 CST 1997, sex='男', address='河南'}
name=null,说明出现了问题!
分析:
- SQL语句 select * from user 可以看作 select id,username,birthday,sex,address from user;
- mybatis会根据这些查询的列名(会将列名转化为小写,数据库不区分大小写),去对应的实体类中查找相应列名的set方法设置,由于找不到username(),所欲username 返回值 null。【自动映射】
解决方案:
方案一:为列明指定别名,别名和java实体类的属性名一致。
select id,username as name,birthday,sex,address from user;
方案二:使用结果集映射 ---> ResultMap
<!-- 结果集映射-->
<resultMap id="UserMap" type="User">
<!-- column 数据库表的列名 property是对应实体类的属性名 -->
<result column="username" property="name"/>
</resultMap>
<!--select查询语句-->
<select id="getUserList" resultMap="UserMap">
select * from user
</select>
来自官方文档的吐槽:
如果这个世界总是这么简单就好了。
数据库中,存在一对多,多对一的情况,还会遇到一些高级的结果集映射,association,collection这些。