当前位置: 首页 > news >正文

mybatis call存储过程,out的参数怎么返回

在 MyBatis 中调用存储过程并获取 OUT 参数,需通过 XML 映射文件或注解方式实现。以下是详细步骤和示例:


核心步骤

  1. Mapper 接口定义​:使用 Map或实体类接收参数

  2. XML 映射文件​:使用 <select>标签声明 statementType="CALLABLE"

  3. 参数设置​:通过 mode=OUT指定输出参数

  4. 获取结果​:调用后从参数对象中提取 OUT 值


示例代码

1. Mapper 接口
public interface ProcedureMapper {void callProcedure(Map<String, Object> params); // 使用 Map 接收参数
}
2. XML 映射文件
<select id="callProcedure" statementType="CALLABLE">{call your_procedure_name(#{param1, mode=IN, jdbcType=INTEGER},   <!-- 输入参数 -->#{outParam, mode=OUT, jdbcType=INTEGER} <!-- 输出参数 -->)}
</select>
3. Java 调用代码
Map<String, Object> params = new HashMap<>();
params.put("param1", 100); // 设置输入参数procedureMapper.callProcedure(params);// 获取 OUT 参数值
Integer outValue = (Integer) params.get("outParam");
System.out.println("OUT 参数值: " + outValue);

使用实体类代替 Map

实体类定义
@Data // Lombok 注解,自动生成 getter/setter
public class ProcParams {private Integer param1;     // IN 参数private Integer outParam;   // OUT 参数(MyBatis 会自动填充)
}
Mapper 接口
void callProcedure(ProcParams params);
XML 映射文件
<select id="callProcedure" statementType="CALLABLE">{call your_procedure_name(#{param1, mode=IN, jdbcType=INTEGER},#{outParam, mode=OUT, jdbcType=INTEGER})}
</select>
调用方式
ProcParams params = new ProcParams();
params.setParam1(100);procedureMapper.callProcedure(params);// 直接通过实体类获取 OUT 值
System.out.println("OUT 参数值: " + params.getOutParam());

关键注意事项

  1. 参数模式​:必须明确指定 mode=OUTmode=INOUT

  2. JDBC 类型​:通过 jdbcType指定数据库类型(如 VARCHAR, INTEGER

  3. 存储过程语法​:使用 {call proc_name(...)}格式

  4. 事务控制​:确保操作在事务中执行(如添加 @Transactional


常见问题排查

  • 问题​:OUT 参数值为 null

    解决​:检查参数名是否与存储过程声明一致,确认 jdbcType匹配数据库类型。

  • 问题​:类型转换异常

    解决​:在 OUT 参数中显式指定 javaType(如 #{outParam, mode=OUT, jdbcType=INTEGER, javaType=Integer})。

  • 问题​:存储过程未执行

    解决​:检查 MyBatis 日志,确认 SQL 语法是否正确(尤其注意 {call ...}的括号匹配)。


通过以上步骤,即可在 MyBatis 中安全获取存储过程的 OUT 参数值。实际使用时,请替换存储过程名和参数名为实际值。

http://www.dtcms.com/a/456838.html

相关文章:

  • 今日八股——JVM篇
  • 【论文阅读】REACT: SYNERGIZING REASONING AND ACTING IN LANGUAGE MODELS
  • 沈阳做网站比较好的公司做网站需要会的软件
  • ubuntu22.04安装gvm管理go
  • 基于单片机的智能点滴输液速度与液位控制系统设计
  • 嵌入式开发学习日志38——stm32之看门狗
  • golang面经——内存相关模块
  • 成都政务网站建设怎样做视频网站
  • 架构设计常画哪些图
  • 自然语言处理分享系列-词向量空间中的高效表示估计(一)
  • RNN的注意力机制:原理与实现(代码示例)
  • Flutter bottomNavigationBar 底部导航栏
  • 做男装去哪个网站好的网站开发工具有哪些
  • 【Spring 3】深入剖析 Spring 的 Prototype Scope:何时以及如何使用非单例 Bean
  • asp.net+mvc+网站开发wordpress 手机端页面
  • 【开题答辩全过程】以 爱篮球app为例,包含答辩的问题和答案
  • 深入理解跨域问题与解决方案
  • 从零搭建 RAG 智能问答系统1:基于 LlamaIndex 与 Chainlit实现最简单的聊天助手
  • Redis核心通用命令解析
  • 后端(JavaWeb)学习笔记(CLASS 1):maven
  • 后端_Redis 分布式锁实现指南
  • K8s学习笔记(十六) 探针(Probe)
  • 企业个人网站口碑营销策略
  • c语言网站三星网上商城分期
  • Gradient Descent and Its Implementation in TensorFlow|梯度下降及其在 TensorFlow 中的实现
  • 大模型解码策略深度解析:从原理到工程实践
  • 【Java并发】揭秘Lock体系 -- 深入理解ReentrantReadWriteLock
  • xedu和5070
  • gitlab 在centos7 下的安装和基本使用
  • 优化GitHub访问问题