本篇内容介绍了“Mybatis中resultType与resultMap之间的关系和使用场景”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
Mybatis ORM半自动映射框架对java开发工程师来说应该是必会的框架之一。它的好处这里不是我们讨论的重点。令很多刚刚入行的java开发小伙伴迷茫的是 resultType
与resultMap
的使用。今天来探讨一下这个问题。
接下来我们就来讲一下Mybatis中resultType与resultMap之间的关系和使用场景。
从select
语句中返回的期望类型的类的完全限定名或别名。 注意如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身。可以使用 resultType 或 resultMap,但不能同时使用。
从这条语句中返回的期望类型的类的完全限定名或别名。 注意如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身。可以使用 resultType 或 resultMap,但不能同时使用。
resultType
与resultMap
首先都是用来归纳查询类型sql的结果集,对查询结果进行你需要的结构描述。对于同一个select
标签中二者不能共存。这一点对很多人来说很好理解。重要的是不同点和对应的使用场景。
对于查询结构需要返回的简单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
以达到按需加载。
本文主要通过简单分析resultType
与resultMap
的相同点与不同点来阐明它们各自的使用场景。更多详尽的使用方法可以去Mybatis的官方文档查看。希望通过本文的讲解让你在实际开发工作中不再困惑更加明了。
“Mybatis中resultType与resultMap之间的关系和使用场景”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/10000000000/blog/3080059