mybatis call存储过程调用及out的参数问题

 更新时间:2025年10月09日 11:53:13   作者:悟能不能悟  
在 MyBatis 中调用存储过程并获取 OUT 参数,需通过 XML 映射文件或注解方式实现,下面通过本文给大家介绍mybatis call存储过程调用及out的参数问题,感兴趣的朋友一起看看吧

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

​核心步骤​

  • Mapper 接口定义​:使用 Map或实体类接收参数
  • XML 映射文件​:使用 <select>标签声明 statementType="CALLABLE"
  • 参数设置​:通过 mode=OUT指定输出参数
  • 获取结果​:调用后从参数对象中提取 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());

​关键注意事项​

  • 参数模式​:必须明确指定 mode=OUTmode=INOUT
  • JDBC 类型​:通过 jdbcType指定数据库类型(如 VARCHAR, INTEGER
  • 存储过程语法​:使用 {call proc_name(...)}格式
  • 事务控制​:确保操作在事务中执行(如添加 @Transactional

​常见问题排查​

  • 问题​:OUT 参数值为 null
  • 解决​:检查参数名是否与存储过程声明一致,确认 jdbcType匹配数据库类型。
  • 问题​:类型转换异常
  • 解决​:在 OUT 参数中显式指定 javaType(如 #{outParam, mode=OUT, jdbcType=INTEGER, javaType=Integer})。
  • 问题​:存储过程未执行
  • 解决​:检查 MyBatis 日志,确认 SQL 语法是否正确(尤其注意 {call ...}的括号匹配)。

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

到此这篇关于mybatis call存储过程调用及out的参数问题的文章就介绍到这了,更多相关mybatis call存储过程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • RocketMQ offset确认机制示例详解

    RocketMQ offset确认机制示例详解

    这篇文章主要为大家介绍了RocketMQ offset确认机制示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • JAVAE中servlet的概念及使用示例详解

    JAVAE中servlet的概念及使用示例详解

    servlet是一种实现动态页面的技术,他是由tomcat提供给程序员的一组API可以帮助程序员开发一个web程序,这篇文章主要介绍了JAVAE中servlet的概念及使用,需要的朋友可以参考下
    2024-05-05
  • 解读为什么不推荐使用keySet()进行遍历HashMap

    解读为什么不推荐使用keySet()进行遍历HashMap

    这篇文章主要介绍了我为什么不推荐使用keySet()进行遍历HashMap的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • SpringBoot中登录验证码的4种实现方案

    SpringBoot中登录验证码的4种实现方案

    这篇文章主要介绍了在SpringBoot应用中实现四种登录验证码的技术方案,包括图形验证码、短信验证码、邮箱验证码和滑动拼图验证码,需要的可以参考下
    2025-04-04
  • Maven中错误使用parent.relativePath导致构建失败问题

    Maven中错误使用parent.relativePath导致构建失败问题

    这篇文章主要介绍了Maven中错误使用parent.relativePath导致构建失败问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • 基于Java中字符串indexof() 的使用方法

    基于Java中字符串indexof() 的使用方法

    今天小编就为大家分享一篇基于Java中字符串indexof() 的使用方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Java实现给网站上传图片盖章的方法

    Java实现给网站上传图片盖章的方法

    这篇文章主要介绍了Java实现给网站上传图片盖章的方法,涉及java针对图片的合成操作技巧,类似水印功能,需要的朋友可以参考下
    2015-07-07
  • 一文详解Java中的静态变量是在“堆“还是“方法区“

    一文详解Java中的静态变量是在“堆“还是“方法区“

    在Java编程语言中,静态变量和实例变量是两种不同类型的成员变量,它们在内存中的分配、生命周期、以及使用方式上有着显著的区别,这篇文章主要介绍了Java中静态变量是在“堆“还是“方法区“的相关资料,需要的朋友可以参考下
    2025-09-09
  • Java基础之JDBC的数据库连接与基本操作

    Java基础之JDBC的数据库连接与基本操作

    这篇文章主要介绍了Java基础之JDBC的数据库连接与基本操作,文中有非常详细的代码示例,对正在学习java基础的小伙伴们也有很好的帮助,需要的朋友可以参考下
    2021-05-05
  • 浅析Hadoop完全分布式集群搭建问题

    浅析Hadoop完全分布式集群搭建问题

    Hadoop是一个由Apache基金会所开发的分布式系统基础架构。本文重点给大家介绍Hadoop完全分布式集群搭建问题,感兴趣的朋友跟随小编一起看看吧
    2021-11-11

最新评论