? ? ?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
对象组成的列表。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
方法获取并映射得到的。