首页/新闻资讯/正文详情

MyBatis 调用存储过程返回游标:parameterType 为什么必须是 java.util.Map 及 TaoToken 配置骨架

发布时间:2026/9/25 7:38:51 来源:云帆数科 栏目:资讯中心
MyBatis 调用存储过程返回游标:parameterType 为什么必须是 java.util.Map 及 TaoToken 配置骨架
1. 为什么 parameterType 写错就报 无效的列类型先说结论MyBatis 调 Oracle 或达梦的存储过程、函数返回游标时parameterType必须写成java.util.Map不是因为它看起来方便而是因为游标这个 OUT 参数在 JDBC 层面根本没有对应的 Java 基本类型可以承载只能靠一个可变的容器把结果回填回来。我见过太多人卡在这一步mapper 里写了parameterTypejava.util.Map但调用时传了个实体对象或者干脆不传参结果控制台甩出一句无效的列类型: 1111或者ORA-17004。1111 就是java.sql.Types.OTHEROracle 的游标REF CURSOR在 JDBC 里就注册成这个类型。MyBatis 处理 CALLABLE 语句时会遍历你传入的参数对象把每个modeOUT的参数按名字塞回去。如果传入的不是 Map它没有按名字回填的能力游标就丢了。这篇面向的是正在用 Cline、CC Switch 这类 AI 工具辅助排查 MyBatis 配置的开发者。你可能会让 AI 帮你补全 mapper XML但 AI 经常把parameterType写成实体类因为它不知道游标要回填。下面我把可复制的骨架、TaoToken 的统一 Key 配置、以及一次调用后打印 Map 里游标键值的验证动作都写清楚你照着改就能跑通。核心检索词先摆出来MyBatis 调用存储过程返回游标、parameterType 必须是 java.util.Map、游标结果回填 Map、map.get(result)取游标记录。适合谁适合用 Oracle/达梦、需要调P_xxx或FN_xxx返回结果集、并且被 1111 报错折磨过的后端同学。2. TaoToken 前置把 Key 和 API 通道统一起来在动手改 mapper 之前先把调用链路的通道理顺。很多排查场景里AI 工具Cline、CC Switch需要访问模型来帮你分析报错而你的业务代码又要访问数据库。这两条链路如果 Key 散落在各处改一次配置要翻五个文件。我的做法是用 TaoToken 做统一入口官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_end API 地址是 https://taotoken.net/api 。你需要先拿到一个 Key。进控制台创建https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 然后在 API Keys 页面生成https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。这个 Key 同时给 AI 工具和你的调试脚本用省得来回切。为什么要在讲 MyBatis 的文章里提这个因为游标报错的排查过程本质是让 AI 读你的 mapper XML 和异常栈然后给出修改建议。如果 AI 工具的模型通道没配好你连让它帮你分析1111的机会都没有。把通道配好后面排错效率完全不一样。如果你只是想让 AI 帮你解释一段 mapper 配置用模型对话就行https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 。如果你在长期做编码、想让 Agent 持续读你的工程文件那更适合 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite ClaudeCode 相关的配置参考 https://taotoken.net/claudecode-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecode-anthropicutm_campaignrewrite 。3. 可复制配置mapper XML 骨架与工具配置片段3.1 函数返回游标的 mapper 骨架先看函数版本。Oracle 函数返回SYS_REFCURSORMyBatis 里用{#{result,modeOUT,...}call FN_xxx(...)}这种带等号的写法等号左边就是接收返回值的占位符。resultMap idcursorMap typecom.vcare.model.Photo result columnAD_PIC_ID propertyphotoId jdbcTypeINTEGER/ result columnSRC propertyurl jdbcTypeVARCHAR/ /resultMap select idfindAllPhoto parameterTypejava.util.Map statementTypeCALLABLE {#{result,modeOUT,jdbcTypeCURSOR,resultMapcursorMap} call FN_QUERY_APP_AD_PIC(#{agencyId,modeIN,jdbcTypeINTEGER})} /select注意resultMapcursorMap这个属性它告诉 MyBatis 游标里的每一行按什么规则映射成Photo对象。没有它游标就算回填进 Map你也拿不到结构化数据。3.2 存储过程返回游标的 mapper 骨架存储过程是另一种写法游标作为普通 OUT 参数放在参数列表里没有等号。select idfindAllPhotoProc parameterTypejava.util.Map statementTypeCALLABLE {call P_QUERY_APP_AD_PIC( #{agencyId,modeIN,jdbcTypeINTEGER}, #{result,modeOUT,jdbcTypeCURSOR,resultMapcursorMap} )} /select两种写法的共同点parameterType都是java.util.Mapresult这个名字随便起不需要和存储过程里的形参名一致它只是 Map 里的一个 key。3.3 Cline 的 settings.json 配置片段如果你用 Cline 辅助排查把模型通道指向 TaoTokenKey 填你生成的那个。{ cline.apiProvider: openai, cline.openAiBaseUrl: https://taotoken.net/api, cline.openAiApiKey: sk-你的TaoTokenKey, cline.model: claude-sonnet-4-20250514 }3.4 CC Switch 的 config.toml 配置片段CC Switch 用 TOML结构类似核心是 base_url 和 api_key 两项。[provider] name taotoken base_url https://taotoken.net/api api_key sk-你的TaoTokenKey model claude-sonnet-4-20250514配好之后你让 AI 读 mapper XML它就能基于真实文件给出修改建议而不是凭空猜。4. 验证请求一次调用后打印 Map 里的游标键值配置写完必须验证游标真的回填了。写个最小测试调用后把 Map 里的result取出来打印。Autowired private PhotoMapper photoMapper; public void testCursor() { MapString, Object param new HashMap(); param.put(agencyId, 1001); photoMapper.findAllPhoto(param); Object cursor param.get(result); System.out.println(游标类型: cursor.getClass().getName()); if (cursor instanceof List) { ListPhoto list (ListPhoto) cursor; System.out.println(游标记录数: list.size()); for (Photo p : list) { System.out.println(photoId p.getPhotoId() , url p.getUrl()); } } }跑通后你会看到类似输出游标类型: java.util.ArrayList 游标记录数: 3 photoId101, urlhttps://cdn.example.com/a.jpg photoId102, urlhttps://cdn.example.com/b.jpg photoId103, urlhttps://cdn.example.com/c.jpg关键点param.get(result)拿到的就是游标记录类型是ArrayList里面是按cursorMap映射好的Photo对象。如果你打印出来是null说明 OUT 参数没回填八成是parameterType写错了或者传参时没传 Map。注意result这个名字只是 Map 的 key和存储过程里的形参名没有任何对应关系。你叫它cursorData、outRows都行只要 mapper 里的占位符名和map.get()的 key 一致即可。5. 本篇常见错排查5.1 报 无效的列类型: 1111这是最高频的错。1111 是Types.OTHEROracle 游标就注册成这个。原因通常是parameterType写成了实体类或者jdbcTypeCURSOR漏了。检查两处mapper 的parameterType必须是java.util.MapOUT 参数必须带jdbcTypeCURSOR。5.2 游标取出来是 null传参时传了实体对象而不是 Map或者 Map 里没有对应的 key。MyBatis 回填 OUT 参数时是往你传入的那个 Map 里 put如果你传的是new Photo()它没有地方放游标。统一用HashMap。5.3 达梦数据库上的差异达梦的游标类型和 Oracle 基本兼容但驱动版本不同时jdbcType可能需要写成OTHER而不是CURSOR。如果CURSOR报错换成jdbcTypeOTHER试试。另外达梦的存储过程调用语法和 Oracle 一致mapper 骨架不用改。5.4 resultMap 映射不上字段全是 null检查resultMap里的column是否和游标返回的列名完全一致包括大小写。Oracle 默认返回大写列名如果你写的是小写映射不上。达梦可能返回大写也可能返回小写取决于建表时的设置。用columnAD_PIC_ID这种大写形式最稳。5.5 函数和存储过程写法混了函数用等号{#{result,...}call FN_xxx(...)}。存储过程不用等号{call P_xxx(..., #{result,...})}。写混了会报语法错误。如果你不确定先看数据库里是 FUNCTION 还是 PROCEDURE。6. 把 Key 和游标配置一起固化下来排查完这一轮你会发现真正花时间的不是写 mapper而是改一处配置、跑一次、看报错、再改的循环。把 TaoToken 的 Key 固化到 Cline 的 settings.json 和 CC Switch 的 config.toml 里让 AI 工具随时能读你的工程文件这个循环会快很多。API 通道统一走 https://taotoken.net/api Key 在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 生成一次就够。回到游标本身记住三件事parameterType必须是java.util.MapOUT 参数必须带jdbcTypeCURSOR和resultMap取结果用map.get(result)。这三件事做对Oracle 和达梦的游标都能正常回填。至于result这个名字真的随便起别被它和存储过程形参名的看起来对应骗了。

相关推荐

Atlas 300V 24G深度解析:昇腾AI推理加速卡与YOLO实战部署指南
Atlas 300V 24G深度解析:昇腾AI推理加速卡与YOLO实战部署指南

1. Atlas 300V 24G 到底算不算“运算加速卡”,争论点在哪1.1 从一次典型的“客服咨询”说起前阵子有个做智慧工地的朋友发来消息:“我看上一张二手卡,Atlas 300V 24G,人家说是运算加速卡,可我拿到手怎么连个显示接口都… · 2026/9/25 7:38:51

旅游车队AI落地:从老板报表到车调调度的降本增效实践
旅游车队AI落地:从老板报表到车调调度的降本增效实践

1. 为什么旅游车队老板和车调员是AI落地的第一突破口?旅游车队这行,表面看是方向盘和油门的事,实则每天都在跟三座大山较劲:调度混乱、成本失控、人盯人管理。我跑过三年地接,也帮十多家中小型车队做过流程梳理&#x… · 2026/9/25 7:38:45

MCP多插件上下文冲突协调机制:用TaoToken统一Key构建有序插件生态
MCP多插件上下文冲突协调机制:用TaoToken统一Key构建有序插件生态

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 7:38:45

TypeScript 字面量类型(Literal Types)完全指南:从单值类型到联合、窄化与推断
TypeScript 字面量类型(Literal Types)完全指南:从单值类型到联合、窄化与推断

文档教程 【免费下载链接】typescript-book The Concise TypeScript Book: A Concise Guide to Effective Development in TypeScript. Free and Open Source. 项目地址: https://gitcode.com/gh_mirrors/typ/typescript-book 点击查看 免费下载 本指南以 The Conc… · 2026/9/25 8:10:05

VirtualBox Ubuntu分辨率与共享文件夹故障排查指南
VirtualBox Ubuntu分辨率与共享文件夹故障排查指南

1. 这不是“装个系统”那么简单:为什么你反复重装VirtualBox Ubuntu却总卡在分辨率和共享文件上?我带过不少刚接触虚拟化的新人,也帮同事远程处理过几十台开发机。最常听到的一句话是:“VirtualBox装Ubuntu明明教程写得很清楚&… · 2026/9/25 8:10:05

Kata Containers 在 IBM Z 上直通 CEX 硬件:Secure Execution 机密容器中的关联密钥配置实战
Kata Containers 在 IBM Z 上直通 CEX 硬件:Secure Execution 机密容器中的关联密钥配置实战

云原生容器运行时 【免费下载链接】kata-containers Kata Containers is an open source project and community working to build a standard implementation of lightweight Virtual Machines (VMs) that feel and perform like containers, but provide the workload isolat… · 2026/9/25 8:09:59

CodeQL 1.26 C/C++ 分析改进解析:查询精度调整与库级污点流模型扩展
CodeQL 1.26 C/C++ 分析改进解析:查询精度调整与库级污点流模型扩展

静态分析SAST应用安全漏洞扫描代码质量 【免费下载链接】codeql CodeQL: the libraries and queries that power security researchers around the world, as well as code scanning in GitHub Advanced Security 项目地址: https://gitcode.com/gh_mirrors/co/code… · 2026/9/25 8:09:59

Apache Iceberg 1.11.0 发布:REST 目录协议、格式 V4 地基与全栈引擎升级全解析
Apache Iceberg 1.11.0 发布:REST 目录协议、格式 V4 地基与全栈引擎升级全解析

数据湖大数据数据存储 【免费下载链接】iceberg Apache Iceberg 项目地址: https://gitcode.com/gh_mirrors/icebe/iceberg 点击查看 免费下载 Apache Iceberg 社区于 2026 年 5 月 19 日正式发布 1.11.0 版本。本文基于本仓库发布的官方发布说明(site/… · 2026/9/25 8:09:47

rsuite Accordion 手风琴组件完全指南:从基础用法到源码原理
rsuite Accordion 手风琴组件完全指南:从基础用法到源码原理

前端UI组件 【免费下载链接】rsuite 🧱 A suite of React components . 项目地址: https://gitcode.com/gh_mirrors/rs/rsuite 点击查看 免费下载 本文以 rsuite 的 Accordion(手风琴)组件为核心,系统讲解如何通过点… · 2026/9/25 8:09:34

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码