Mybatis中ResultType和ResultMap的区别

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等字段。现在需要查询所有学生的信息以及每个学生的成绩列表。

  1. 使用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");
  1. 使用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可以更加灵活地处理复杂的字段映射关系,如上述例子中的学生信息和成绩列表的关系。

经验分享 程序员 微信小程序 职场和发展