如何仅通过MyBatis XML配置实现存储过程双游标关联映射
解决MyBatis多游标关联映射问题
问题背景
现有存储过程返回两个独立游标:
Cursor 1(Author数据)
| ID | NAME | PUBLISH_ID |
|---|---|---|
| 1 | John | 123 |
| 2 | Jane | 345 |
Cursor 2(Book数据)
| PUBLISH_ID | BOOK_ID | BOOK_NAME |
|---|---|---|
| 123 | B101 | C# |
| 123 | B102 | Python |
| 345 | J001 | SQL |
| 345 | J002 | JAVA |
对应的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
相关产品推荐
相关产品推荐

