概述
背景
面对复杂的项目,有些对象的属性是集合类型。该集合类型是另一个表中的实体内容。
我们知道,MyBatis可以很方便地把SQL select出来的数据直接映射为对象的属性,把对象取出来。
但是。简面对集合类型的数据,可就麻烦多了。
例子:
以下面的场景介绍
有一种资源 简称:模板、一个模板有多个使用范围、每个使用范围有 一个 使用主体集合属性 和 一个 使用人集合属性。
翻译代码如下:
// 资源
public class CategoryBean {
private Long id;
private String name; // 分类名称
private List<CategoryScope> scopes; // 发起范围
}
// 使用范围
public class CategoryScope {
private Long id;
private Long categoryId; // 资源id
// 使用主体(指定组织使用,所有人可使用)
private List<CategorySponsor> sponsors;
// 使用人(人、角色、组织)
private List<CategorySender> senders;
}
// 使用主体
public class CategorySponsor {
private Long scopeId; // 所属范围id
private String type; // 使用主体类型
}
// 使用人
public class CategorySender{
private Long scopeId; // 所属范围id
private String userType; // 使用人类型
}
介绍两种方法使用
1、嵌套ResultMap
第一步按照 上面的代码构建 resultMap
Mapper文件
<resultMap type="CategoryBean" id="categoryMap">
<id property="id" column="id"/>
<collection property="scopes" javaType="ArrayList" ofType="CategoryScopeMap" column="id" select="scopes"/>
</resultMap>
<resultMap type="CategoryScope" id="CategoryScopeMap">
<!-- id 属性是CategoryScope的字段属性 -->
<id property="id" column="id"/>
<collection property="sponsors" javaType="ArrayList" column="id" ofType="CategorySponsor" select="sponsors" />
<collection property="senders" javaType="ArrayList" column="id" ofType="CategorySender" select="senders" />
</resultMap>
第二步 写上 对应的查询方法
<!-- 这是主要的查询方法 -->
<select id="mainSelect" resultMap="openCategoryMap">
SELECT c.*
FROM CATEGORY c where id = #{id}
</select>
<!-- scopes 的 查询方法 id的属性 来自 CategoryBean 的 property="id" -->
<select id="scopes" resultMap="CategoryScopeMap">
SELECT scope.* FROM CATEGORY_SCOPE scope WHERE scope.categoryId = #{id}
</select>
<!-- sponsors 的 查询方法 id的属性 来自 CategoryScope 的 property="id" -->
<select id="sponsors" resultType="CategorySponsor">
SELECT sponsor.* FROM CATEGORY_SPONSOR sponsor WHERE sponsor.scopeId = #{id}
</select>
<!-- senders 的 查询方法 id的属性 来自 CategoryScope 的 property="id" -->
<select id="senders" resultType="CategorySender">
SELECT sender.* FROM CATEGORY_SENDER sender WHERE sender.scopeId = #{id}
</select>
第三步
得出结果 就是你想要的
2、autoMapping
这个方法采用的是 前缀匹配的方式. 我未进行深入研究,目前只适用于 一级嵌套。注意下面的格式。
第一步 构建总的 resultMap
<resultMap type="CategoryBean" id="categoryMap" autoMapping="true">
<id property="id" column="id"/>
<collection property="sponsors" javaType="ArrayList" ofType="CategorySponsor" columnPrefix="sponsor_" autoMapping="true"/>
<collection property="senders" javaType="ArrayList" ofType="CategorySender" columnPrefix="sender_" autoMapping="true"/>
</resultMap>
<select id="mainselect" resultMap="categoryMap">
SELECT c.id,c.name,
sponsor.companyId sponsor_companyId,sponsor.type sponsor_type ,
sender.userId sender_userId , sender.userName sender_userName , sender.userType sender_userType
FROM CATEGORY c
INNER JOIN CATEGORY_SCOPE scope ON scope.categoryId = c.id
LEFT JOIN CATEGORY_SPONSOR sponsor ON sponsor.scopeId = scope.id
LEFT JOIN CATEGORY_SENDER sender ON sender.scopeId = scope.id
WHERE c.id = #{id}
</select>
最后
以上就是震动玉米为你收集整理的MyBatis用嵌套ResultMap实现一对多映射的全部内容,希望文章能够帮你解决MyBatis用嵌套ResultMap实现一对多映射所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复