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>

  

原文地址:https://www.cnblogs.com/Scorpicat/p/12484461.html