17 MyBatis——ResultMap的使用、字段名冲突问题
字段名与属性名不一致导致无法封装数据的问题
在数据库的字段命名中,我们使用下划线分隔。
而在java的属性命名中,我们使用小驼峰命名规则,这会使得某些这些字段的返回值无法与javaBean的属性值对应,使得数据封装为null值。
为了解决这个问题,我们可以使用两种方法。
方法一:查询语句中给字段起别名
我们知道,使用查询语句时可以给字段起别名,例如从t表查询字段A_NAME,起别名示范:
SELECT A_NAME as AName FROM t;//as可省略
我们可以以起别名的方式,将下划线的字段名与javaBean中对应的属性名的名称统一起来。
这样的方式存在一个弊端,不可以使用select *的方式查询所有,必须写完每一个字段。
方法二:使用resultMap
在mapper中(即xxxMapper.xml),我们添加resultMap标签对一个表的字段进行别名配置:
其中:id独自使用id标签而不是result的标签,是为了在mapper实现缓存时(<cache>标签,前面有提到),能够根据<id>标签找到对应的数据。
注意:要写好查询语句,不能出现同样的列名
<resultMap type="cn.tedu.mybatis.User" id="userMap"> <!-- 主键使用id标签配置 --> <id column="id" property="id"/> <!-- 名称一致的可以无需配置,比如下面的username --> <result column="username" property="username"/> <!-- 不一致的必须配置 --> <result column="group_id" property="groupId"/> </resultMap>
//如果要配置的属性是集合类型,需要使用标签<collection>如下:
如果要配置的属性是集合类型,需要使用标签<collection>如下(此标签下,即使属性名与字段名相同也不能省略不写):
<resultMap type="cn.tedu.mybatis.GroupVO" id="userMap"> <!-- 主键使用id标签配置 --> <id column="id" property="id"/> <!-- 名称一致的可以无需配置,比如下面的username --> <result column="name" property="name"/> <!-- 属性为集合时,使用Collection --> <collection property="users" ofType="cn.tedu.mybatis.User"> <result column="uid" property="id"/> <result column="username" property="username"/> <result column="password" property="password"/> <result column="age" property="age"/> <result column="phone" property="phone"/> <result column="email" property="email"/> <result column="group_id" property="groupId"/> </collection> </resultMap>
然后在单表查询语句中使用 resultMap属性引用上面的resultMap的id即可:
<select id="findAll" resultMap="userMap"> SELECT * FROM t_user ORDER BY ID </select>