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等字段。现在需要查询所有学生的信息以及每个学生的成绩列表。
- 使用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可以更加灵活地处理复杂的字段映射关系,如上述例子中的学生信息和成绩列表的关系。
下一篇:
mapper层和service层的区别