zoukankan      html  css  js  c++  java
  • 一文理清Mybatis中resultType与resultMap之间的关系和使用场景

    1.概要

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

    2.resultType与resultMap

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

    2.1 resultType

    select语句中返回的期望类型的类的完全限定名或别名。 注意如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身。可以使用 resultType 或 resultMap,但不能同时使用。

    2.2 resultMap

    从这条语句中返回的期望类型的类的完全限定名或别名。 注意如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身。可以使用 resultType 或 resultMap,但不能同时使用。

    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>
    

    当然你也可以如上述所说使用resultMap

    <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是否使用驼峰来进行规避。

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

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

    
     @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的官方文档查看。希望通过本文的讲解让你在实际开发工作中不再困惑更加明了。

    多多关注我的公众号,可以得到更加及时的资讯和反馈。
    在这里插入图片描述

  • 相关阅读:
    【转】每天一个linux命令(28):tar命令
    【转】每天一个linux命令(27):linux chmod命令
    【转】每天一个linux命令(26):用SecureCRT来上传和下载文件
    【转】每天一个linux命令(25):linux文件属性详解
    【转】每天一个linux命令(24):Linux文件类型与扩展名
    C#常用多线程方法
    追本溯源 —— 汉语词汇含义的演化
    追本溯源 —— 汉语词汇含义的演化
    古书与二十四史
    古书与二十四史
  • 原文地址:https://www.cnblogs.com/felordcn/p/12142587.html
Copyright © 2011-2022 走看看