这里我们要解决的需求是:解决数据库中两张表之间一对多的数据集合想封装到一个对应的实体类:
我们采用mybits框架中resultMap来进行手动映射
<select id="这里是绑定方法,通过这个将结果返回给接口中的方法" resultMap="这里是结果集映射"> //这里是我们要查询的sql </select> <resultMap id="这里是结果集映射" type="这里是实体类">//这里是实体类 //这里是我们查询的结果集映射 <id column="主键" property="主键属性名"/>//这里是主键 <result column="字段名" property="属性名"/>//这里是我们查询的结果映射到属性上 <collection property="属性名" ofType="集合类型">//这里是集合 //collection作用在于将子表数据封装到集合中 // ofType是集合中元素的类型 <id column="主键" property="主键属性名"/>//这里是主键 <result column="字段名" property="属性名"/>//这里是我们查询的结果映射到属性上 </collection> </resultMap>
我们使用上面的解决方案来满足我们的需求:但是发现查询到三条数据但是返回给我的只有一条数据,没有达到我们预期的效果。导致这种原因是因为我们我们处理好它们字段的之间的映射,这里我们可以清楚的看出来,对这个一对多的两张表的处理,我们需要两张表的主键id,但是我们没有对Sql语句进行区分,导致我们数据映射不准确,从而达不到我们像要的需求。
同理我们也可以发现我们Sql语句中查询的结果中有很多属性名都一样,这时候在自动映射的时间我们找不到响应的字段。
解决方法:就是给我们的查询的结果中的属性名起别名
解决示例代码:
<select id="这里是绑定方法,通过这个将结果返回给接口中的方法" resultMap="这里是结果集映射">
select e.*,ei.id deptId,ei deptName from emp e left join dept ei on e.dept_id = ei.id
</select>
<resultMap id="这里是结果集映射" type="这里是实体类">
<id column="id" property="id"/>//这里是主键
<result column="字段名" property="属性名"/>
<collection property="这里是结果集映射" ofType="集合类型">
<id column="deptId" property="deptId"/>
<result column="字段名" property="属性名"/>
</collection>
</resultMap>
起别名以后每个属性都是唯一的,就解决自动映射找不到对应的属性名