MyBatis中的ResultMap是用来映射SQL查询结果集和Java对象之间关系的配置。通过ResultMap,我们可以定义如何将查询结果中的列映射到Java对象的属性上。
ResultMap包含了多个ResultMapping,每个ResultMapping定义了一个列与属性之间的映射关系。我们可以指定列名、属性名、Java类型等信息来完成映射。
使用ResultMap的好处是可以更灵活地处理复杂的查询结果集,包括一对一、一对多、多对一等关联关系。通过ResultMap,我们可以将多个查询结果合并到一个对象中,或者将查询结果分散到多个对象中。
在MyBatis中,我们可以通过XML配置文件或注解来定义ResultMap。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="www.com.baidu.mapper.StuMapper">
<resultMap id="stuMap" type="www.com.baidu.pojo.Stu" autoMapping="true">
<collection property="motions" ofType="www.com.baidu.pojo.Motion" autoMapping="true" select="getStuMotion" column="sid">
</collection>
</resultMap>
<select id="getStuMotion" resultType="www.com.baidu.pojo.Motion">
select m.* from record r,motion m where r.mid=m.mid and r.sid= #{sid}
</select>
<select id="list" resultMap="stuMap" >
select * from stu
</select>
</mapper>
以上代码是一个 MyBatis 的复杂查询示例,主要涉及到了 ResultMap 中的 collection 和 select 标签。
首先,我们定义了一个名为 "stuMap" 的 ResultMap,它的类型是 Stu 类。在 "stuMap" 中,我们使用了 collection 标签来处理一对多关系。具体来说,我们将 Motion 对象集合映射到了 Stu 对象中的 motions 属性上。collection 标签需要设置 property 属性来指定 Java 对象中的属性名称,ofType 属性来指定集合元素的类型。
在 collection 标签内部,我们使用了 select 标签来指定获取 Motion 对象集合的 SQL 语句。select 标签需要设置 id 属性来指定 SQL 语句的唯一标识,resultType 属性来指定 SQL 查询结果的返回类型。
在这个示例中,我们通过查询 record 表和 motion 表,获取了与指定学生 sid 相关的运动信息集合。最后,我们通过 list 标签指定查询 stu 表的 SQL 语句,并将查询结果映射到 "stuMap" ResultMap 中。
此外,在 "stuMap" 中,我们使用了 autoMapping 属性来开启自动映射功能。当 autoMapping 属性设置为 true 时,MyBatis 会自动将列名和属性名相同的列映射到 Java 对象对应的属性上。
总之,以上代码展示了如何使用 ResultMap 处理一对多关系,并通过 select 标签设置 SQL 查询语句来获取关联数据。同时,我们还介绍了 autoMapping 属性的使用方法。
主要是需要理解它的执行顺序
当后端调用 StuMapper接口类的list方法后 他就会
public interface StuMapper {
List<Stu> list();
}
- 执行
list
方法,该方法会返回一个由Movie
对象组成的列表。根据resultMap="movieMap"
,MyBatis会将查询结果映射为Movie
对象。 - 对于每个
Movie
对象,MyBatis会执行<association>
标签中的SQL语句,也就是select="getPerformerList"
所指定的getPerformerList
方法,并传入column="number"
所指定的参数值(即当前Movie
对象的number
属性值)。该方法会返回一个由Performer
对象组成的列表。 - MyBatis会将
Performer
列表映射为List<Performer>
类型,然后将此列表设置为当前Movie
对象的performers
属性值。
简单来讲:先执行list方法,然后因为返回的是resultMap="stuMap" 然后他就会去resultMap找"stuMap",然后执行里面的命令,命令里面有select="getStuMotion" column="sid"> 他就去查找select方法id为getStuMotion的方法,然后传参为sid字段
这样,最终的结果就是一个由Movie
对象组成的列表,每个Movie
对象中都包含一个List<Performer>
类型的performers
属性。而这些Performer
对象则是通过执行getPerformerList
方法获取并映射得到的。