一文理清Mybatis中resultType与resultMap之间的关系和使用场景

1.概要

Mybatis ORM半自动映射框架对java开发工程师来讲应该是必会的框架之一。它的好处这里不是咱们讨论的重点。令不少刚刚入行的java开发小伙伴迷茫的是 resultTyperesultMap的使用。今天来探讨一下这个问题。java

2.resultType与resultMap

接下来咱们就来说一下Mybatis中resultType与resultMap之间的关系和使用场景。sql

2.1 resultType

select语句中返回的指望类型的类的彻底限定名或别名。 注意若是返回的是集合,那应该设置为集合包含的类型,而不是集合自己。可使用 resultType 或 resultMap,但不能同时使用。数据库

2.2 resultMap

从这条语句中返回的指望类型的类的彻底限定名或别名。 注意若是返回的是集合,那应该设置为集合包含的类型,而不是集合自己。可使用 resultType 或 resultMap,但不能同时使用。app

2.3 共同点

resultTyperesultMap首先都是用来概括查询类型sql的结果集,对查询结果进行你须要的结构描述。对于同一个select标签中两者不能共存。这一点对不少人来讲很好理解。重要的是不一样点和对应的使用场景。框架

2.4 两者分别的使用场景

对于查询结构须要返回的简单pojo,结果均可以映射到一致的hashMap上,换句话来讲就是数据库列名能够精确匹配到pojo属性的。通常都用resultType。其实这里有一个隐含的构建机制。映射到resultType的结果都是MyBatis在幕后自动建立了一个resultMap来处理的。简而言之,只要resultType能干的事情resultMap都能干。两者定位是:性能

  • resultType用来处理很是简单的结果集,就是列名可以与pojo属性匹配的的结果集。若是你只须要查询一个班级的简单状况,那么用这个再合适不过了。
@Data
 public class Grade{
   private String gradeId
   private String gradeName;
   private Integer studentCount;
 }

咱们很简单就可使用下列操做:学习

<select id="selectGrades" resulttype="com.someapp.model.Grade">
  select gradeId,gradeName, studentCount
  from grade
  where gradeId = #{gradeId}
</select>

固然你也能够如上述所说使用resultMapcode

<resultmap id="GradeResultMap" type="com.someapp.entity.Grade">
  <id property="gradeId" column="grade_id" />
  <result property="gradeName" column="grade_name" />
  <result property="studentCount" column="student_count" />
</resultmap>

而后将上面的resultType转换为resultMap便可,请注意我上面两种须要处理字段的驼峰风格,固然你能够设置Mybatis是否使用驼峰来进行规避。xml

  • resultMap更擅长来处理复杂映射的结果集。好比一对1、一对多的复杂关系。若是你不但要查询一个班级的状况,附带须要查询班级所在的学校,班级学生的详细状况,甚至是班级男女学生概况。就必须使用resultMap来描述这些映射关系了。这个例子咱们来写一下:

咱们定义一个对上面关系描述的DTO:blog

@Data
 public class GradeDTO {
    private String gradeId
    private String gradeName;
    private Integer studentCount;
    private School school;
    private List<teacher> teachers
    private List<boystudent> boyStudents;  
    private List<girlstudent> girlStudents;
    
 }

对应的映射处理:

<resultmap id="ComplexResultMap" type="GradeDTO">
       <!--   班级状况   -->
      <id property="gradeId" column="grade_id" />
      <result property="gradeName" column="grade_name" />
      <result property="studentCount" column="student_count" />
       <!--   班级对应的学校   -->
      <association property="school" javatype="School">
          <id property="schoolId" column="school_id" />
          <result property="schoolName" column="school_name" />
      </association>
       <!--   班级的老师们   -->
      <collection property="teachers" oftype="Teacher">
          <id property="teacherId" column="teacher_id" />
          <result property="teacherName" column="teacher_name" />
      </collection>
      <!--   根据性别来区分男女学生  注意这里的语法未通过验证 有兴趣可找文档学习   -->
      <discriminator javatype="int" column="gender">
          <case value="0" resultType="GirlStudent" />
          <case value="1" resultType="BoyStudent" />
      </discriminator>
  </resultmap>

固然resultMap还能够像java类同样继承。总之,只要你想,这玩意儿你能够玩出花来。可是注意性能问题,尽可能不要过多的嵌套。尽可能配置延迟加载lazyLoadingEnabled以达到按需加载。

3.总结

本文主要经过简单分析resultTyperesultMap的相同点与不一样点来阐明它们各自的使用场景。更多详尽的使用方法能够去Mybatis的官方文档查看。但愿经过本文的讲解让你在实际开发工做中再也不困惑更加明了。

多多关注个人公众号,能够获得更加及时的资讯和反馈。

相关文章
相关标签/搜索