mybatis call存储过程调用及out的参数问题
作者:悟能不能悟
在 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=OUT
或mode=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存储过程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!