【mybatis实例操作】01 <resultMap>中 <collection>的使用

本文档详细介绍了如何使用JAVA实现一个展示一级标签及其二级子标签的接口。首先,给出了数据库表设计,包括一级标签表`db_label`和二级标签表`db_label_sub`。接着,定义了一级标签DTO和二级标签DTO,用于数据传输。接口部分提供了一个`/list`接口用于获取标签列表。最后,展示了MyBatis的`LabelMapper.xml`配置,利用`<resultMap>`的`<collection>`标签处理一对多的关系,从数据库中查询并返回标签数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、需求

JAVA实现如下图所示的“标签”列表接口:
在这里插入图片描述
学习技术、人力资源、数字化为“一级标签”,下面的为“二级子标签”。

二、数据库表设计

一级标签表db_label:

-- ----------------------------
-- Table structure for db_label
-- ----------------------------
DROP TABLE IF EXISTS `db_label`;
CREATE TABLE `db_label` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '名称',
  `createtime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `modifytime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='一级标签表';

二级标签表db_label_sub:

-- ----------------------------
-- Table structure for db_label_sub
-- ----------------------------
DROP TABLE IF EXISTS `db_label_sub`;
CREATE TABLE `db_label_sub` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `label_id` bigint(20) NOT NULL COMMENT '一级标签id',
  `name` varchar(100) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '名称',
  `createtime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `modifytime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='二级标签表';

三、DTO

一级标签DTO:

@Getter
@Setter
public class LabelDto extends Serializable {
	private static final long serialVersionUID = 1L;
	//一级标签名称
	private String name;
	//二级标签列表
	private List<LabelSubDto> labelSubDtoList;
}

二级标签DTO:

@Getter
@Setter
public class LabelSubDto extends Serializable {
	private static final long serialVersionUID = 1L;
	//一级标签id
	private Long labelId;
	//二级标签名称
	private String name;
}

四、接口

//标签列表
@PostMapping("/list")
@ResponseBody
public Result<List<LabelDto>> list(){
	return Result.success(service.list());
}

五、mybatis实现映射

这种 一级标签DTO里面包含二级标签列表List的情况,要使用<resultMap>中的 <collection>来实现,使用 <collection>可以解决这种关联的一对多关系。

LabelMapper.xml文件如下:

  <resultMap id="LabelResultMap" type="com.test.bi.bo.LabelDto">
    <id column="id" jdbcType="BIGINT" property="id" />
    <result column="name" jdbcType="VARCHAR" property="name" />
    <result column="createtime" jdbcType="TIMESTAMP" property="createtime" />
    <result column="modifytime" jdbcType="TIMESTAMP" property="modifytime" />
    <collection property="LabelSubDtoList" ofType="com.test.bi.bo.LabelSubDto">
      <id column="bid" jdbcType="BIGINT" property="id" />
      <result column="label_id" jdbcType="BIGINT" property="labelId" />
      <result column="bname" jdbcType="VARCHAR" property="name" />
      <result column="bcreatetime" jdbcType="TIMESTAMP" property="createtime" />
      <result column="bmodifytime" jdbcType="TIMESTAMP" property="modifytime" />
    </collection>
  </resultMap>

  <select id="list" resultMap="LabelResultMap">
    SELECT a.*,
           b.id as bid, b.label_id, b.name as bname
    FROM db_label a
    Left JOIN db_label_sub b
    ON a.id = b.label_id
  </select>

注意:

<collection property="LabelSubDtoList" ofType="com.test.bi.bo.LabelSubDto">

property值对应LabelDto里面的:

	//二级标签列表
	private List<LabelSubDto> labelSubDtoList;
}
### MyBatis `<collection>` 标签中 `javaType` 属性的作用 在 MyBatis 的 `<collection>` 标签中,`javaType` 是一个重要的属性,用于指定集合类型的 Java 类型。它的主要作用是定义查询结果集中嵌套集合的数据类型,从而帮助 MyBatis 将数据库查询的结果正确映射到对应的 Java 对象结构。 #### 1. **`javaType` 的基本功能** `javaType` 定义了 `<collection>` 标签下所表示的集合对象的具体类型。通常情况下,它会被设置为某种泛型集合类(如 `ArrayList`, `HashSet` 等),或者自定义的对象列表类型[^1]。通过该属性,MyBatis 能够知道如何将 SQL 查询返回的一组数据封装成目标 Java 集合实例。 例如,在处理一对多关系时,如果父表的一个记录对应子表多个记录,则可以利用 `<collection>` 来完成这种复杂映射,并借助 `javaType` 明确告知框架这些子记录应被存储在哪种容器里: ```xml <resultMap type="ParentEntity" id="parentResultMap"> <id property="parentId" column="parent_id"/> <collection property="childrenList" ofType="ChildEntity" javaType="ArrayList"> <id property="childId" column="child_id"/> <!-- 更多字段 --> </collection> </resultMap> ``` 上述例子展示了当 Parent 实体拥有 Children 列表作为其成员变量之一的情况下,如何配置相应的 Result Map 并指明 `javaType` 应设为何值以便于实现正确的映射逻辑[^2]。 #### 2. **常见用法** - 当前支持的标准库集合类型包括但不限于:`ArrayList`, `LinkedList`, `HashSet`, etc. - 如果希望更灵活控制内部行为或满足特定业务需求,也可以提供用户自定义实现了 Collection 接口的新类名称给此参数[^3]. 以下是另一个实际应用案例展示了一个简单的场景——假设存在两个实体类 Order 和 Item ,其中订单包含若干项商品条目;那么我们就可以这样编写 XML 文件来表达它们之间的关联性以及相应属性设定方式: ```xml <!-- 假定Order有一个名为items的List<Item>--> <resultMap type="com.example.Order" id="orderResultMap"> ... <collection property="items" ofType="com.example.Item" javaType="ArrayList"> <id property="itemId" column="item_id"/> <!-- 其他Item相关字段 --> </collection> </resultMap> <select id="getOrdersWithItems" resultMap="orderResultMap"> SELECT o.order_id, i.item_id FROM orders o JOIN items i ON o.order_id=i.order_fk; </select> ``` 在此片段中可以看出不仅限定了外部包裹层即 Orders 所需呈现形式同时也精确描述了 Items 如何组织起来成为整体的一部分。 ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

joinclear

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值