MyBatis中的ResultType和ResultMap都是用来映射查询结果到Java对象的。ResultType适合简单查询结果的映射,而ResultMap适合复杂查询结果及自定义映射关系的情况。
-
ResultType指定了返回值类型,即Sql语句查询结果集中每一行记录对应的Java对象类型。在使用ResultType时,需要保证Sql语句查询结果的列名和Java对象的属性名相同或符合驼峰命名规则。如果列名和属性名不同,可以通过别名解决。使用ResultType可以快速将查询结果集转为Java对象列表,但是无法处理复杂字段的映射关系。
-
ResultMap是通过映射文件(xml)定义的,它能够更加灵活地处理复杂的字段映射关系。ResultMap可以指定java类的属性与数据库查询结果集的列之间的映射关系,也可以指定多个结果集的映射关系。使用ResultMap时,需要在映射文件中定义一个标签,并通过标签明确指定属性和列的映射关系。
以下是使用ResultType和ResultMap实现查询结果映射的示例:
假设有一个学生表(student)和成绩表(score),其中student表包含id、name、age等字段,而score表包含id、student_id、subject、score等字段。现在需要查询所有学生的信息以及每个学生的成绩列表。
- 使用ResultType实现映射
<!-- 映射文件 -->
<select id="queryAllStudents" resultType="com.example.Student">
select * from student
</select>
<!-- Java代码 -->
public class Student {
private Long id;
private String name;
private Integer age;
private List<Score> scores;
// getter and setter
}
public class Score {
private Long id;
private Long studentId;
private String subject;
private Double score;
// getter and setter
}
List<Student> students = sqlSession.selectList("queryAllStudents");
- 使用ResultMap实现映射
<!-- 映射文件 -->
<resultMap id="StudentResultMap" type="com.example.Student">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
<collection property="scores" ofType="com.example.Score">
<id column="score_id" property="id"/>
<result column="subject" property="subject"/>
<result column="score" property="score"/>
</collection>
</resultMap>
<select id="queryAllStudents" resultMap="StudentResultMap">
select s.id, s.name, s.age, sc.id as score_id, sc.subject, sc.score
from student s left join score sc on s.id=sc.student_id
</select>
<!-- Java代码与ResultType相同 -->
List<Student> students = sqlSession.selectList("queryAllStudents");
以上两种方式都可以实现查询结果的映射,但是ResultMap可以更加灵活地处理复杂的字段映射关系,如上述例子中的学生信息和成绩列表的关系。