You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅通过MyBatis XML配置实现存储过程双游标关联映射

解决MyBatis多游标关联映射问题

问题背景

现有存储过程返回两个独立游标:

Cursor 1(Author数据)

IDNAMEPUBLISH_ID
1John123
2Jane345

Cursor 2(Book数据)

PUBLISH_IDBOOK_IDBOOK_NAME
123B101C#
123B102Python
345J001SQL
345J002JAVA

对应的Java实体类:

class Author {
    String id;
    String authName;
    List<Books> books;
}

class Books {
    int publishId;
    String bookId;
    String bookName;
}

需求

仅通过MyBatis XML映射配置,按PUBLISH_ID将两个游标关联,让每个Author只关联自身对应的Books,期望输出:

Id:1 authNm: John book: publishId: 123, bookId: B101 publishId: 123, bookId: B102
Id:2 authNm:Jane book: publishId: 345, bookId: J001 publishId: 345, bookId: J002

现有配置问题

尝试的配置未生效:

<resultMap id="authorMap type="demo.Author"> 
    <id property="Id" column="Id"></id> 
    <collection property="Books" column="publishId" type="ArrayList" resultMap="booksMap" />
</resultMap>
<resultMap id="booksMap" type="demo.Books"> 
    <result property="publishId" column="publish_id"/> 
    <result property="bookId" column="book_id"/> 
</resultMap>

解决方案

针对多游标场景,通过MyBatis多结果集处理逻辑结合关联字段匹配,修正后的XML映射配置如下:

1. 定义Books的resultMap

<resultMap id="booksMap" type="demo.Books">
    <result property="publishId" column="PUBLISH_ID"/>
    <result property="bookId" column="BOOK_ID"/>
    <result property="bookName" column="BOOK_NAME"/>
</resultMap>

2. 定义Author的resultMap并关联Books

<resultMap id="authorMap" type="demo.Author">
    <id property="id" column="ID"/>
    <result property="authName" column="NAME"/>
    <!-- 通过关联字段PUBLISH_ID匹配Books数据 -->
    <collection property="books" ofType="demo.Books" resultMap="booksMap" column="PUBLISH_ID"/>
</resultMap>

3. 配置存储过程调用及多结果集映射

在<select>标签中指定resultSets绑定两个游标,MyBatis会自动按关联字段匹配数据:

<select id="callAuthorBookProc" statementType="CALLABLE" resultSets="authors,books" resultMap="authorMap">
    CALL your_stored_procedure_name();
</select>

关键修正点

  • 字段名匹配:原配置中column使用了小写下划线格式,但游标返回的是大写列名(PUBLISH_ID、BOOK_ID),必须完全匹配(若开启mapUnderscoreToCamelCase=true可忽略大小写格式差异)。
  • 多结果集处理:通过resultSets属性明确指定两个游标名称,MyBatis会自动将第二个游标(books)的数据按PUBLISH_ID关联到第一个游标(authors)对应的集合中。
  • collection标签优化:去掉冗余的type="ArrayList",改用ofType指定集合元素类型;确保column值与Author游标中的关联列名一致。
  • 实体属性匹配:原配置中property="Id"与实体类的id(小写)不匹配,修正后保持属性名一致,避免赋值失败。

内容的提问来源于stack exchange,提问作者QuestForKnowledge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:52:45