使用MyBatis实现含集合字段的Java Record及ResultMap配置咨询
MyBatis对含集合字段的Java Record的支持及ResultMap定义
MyBatis从3.5.9版本开始正式支持Java Record,包括包含集合类型字段的Record,只要你的Record符合Java语言规范(不可变、隐式全参构造器等),就能正常使用MyBatis进行CRUD操作。
一、定义包含集合字段的Java Record示例
先创建两个关联的Record,比如订单和订单项:
// 主Record:包含集合字段items public record OrderRecord( Long id, String orderNo, LocalDateTime createTime, List<OrderItemRecord> items ) {} // 嵌套的子Record public record OrderItemRecord( Long id, Long orderId, String productName, Integer quantity ) {}
二、对应的ResultMap定义
在Mapper XML中,使用<collection>标签来映射集合类型字段,具体配置如下:
<!-- 主ResultMap:映射OrderRecord --> <resultMap id="OrderRecordResultMap" type="com.example.OrderRecord"> <!-- 主键映射 --> <id column="order_id" property="id"/> <!-- 普通字段映射 --> <result column="order_no" property="orderNo"/> <result column="create_time" property="createTime"/> <!-- 集合字段映射:使用collection标签 --> <collection property="items" ofType="com.example.OrderItemRecord"> <id column="item_id" property="id"/> <result column="order_id" property="orderId"/> <result column="product_name" property="productName"/> <result column="quantity" property="quantity"/> </collection> </resultMap>
三、关联查询SQL示例
配合上述ResultMap,编写关联查询订单与订单项的SQL:
<select id="getOrderById" resultMap="OrderRecordResultMap"> SELECT o.id AS order_id, o.order_no, o.create_time, oi.id AS item_id, oi.order_id, oi.product_name, oi.quantity FROM orders o LEFT JOIN order_items oi ON o.id = oi.order_id WHERE o.id = #{id} </select>
关键注意事项
- 版本要求:必须使用MyBatis 3.5.9及以上版本,否则不支持Java Record。
- 字段映射:如果数据库列名与Record的组件名(字段名)一致,可省略
column属性;不一致时必须显式指定映射关系。 - 实例化逻辑:MyBatis会自动使用Java Record的隐式全参构造器来创建实例,无需额外配置构造器或Setter方法。
- 嵌套类型:
<collection>的ofType属性必须指定集合元素的具体Record类型,MyBatis会自动处理嵌套实例化。
内容的提问来源于stack exchange,提问作者Mark Smith
相关产品推荐
相关产品推荐

