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 参数值。实际使用时,请替换存储过程名和参数名为实际值。