MyBatis 3调用存储过程时如何传递NULL参数?
解决MyBatis调用存储过程时的Parameter 'parameter2' not found异常
我之前也踩过这个坑,咱们一步步拆解问题和解决办法:
这个报错的核心逻辑很清晰:你在XML映射语句里引用了parameter2参数,但实际调用DAO方法时要么没传这个参数,要么参数的绑定方式有问题。另外你写的jdbcType=NULL也有个小错误需要修正。
1. 检查Mapper接口的方法签名
首先确认你的DAO接口方法有没有包含parameter2参数,而且最好用@Param注解明确指定参数名(避免MyBatis自动命名的混乱,比如出现param1这种默认名):
void callPRC_FOO(@Param("parameter1") String parameter1, @Param("parameter2") String parameter2);
如果你的方法现在只传了parameter1,那MyBatis肯定找不到parameter2——这就是报错的直接原因。如果parameter2是可选参数,你依然可以保留这个参数,不需要的时候传null就行。
2. 修正jdbcType=NULL的错误写法
MyBatis的jdbcType枚举里并没有NULL这个值,如果你需要明确处理null参数,应该用jdbcType=OTHER替代。或者你也可以直接省略jdbcType配置——多数场景下MyBatis会自动处理null值。修正后的SQL应该是这样:
{ call PRC_FOO(#{parameter1, mode=IN, jdbcType=VARCHAR}, #{parameter2, mode=IN, jdbcType=OTHER}) }
如果不需要强制指定JDBC类型,还可以简化成:
{ call PRC_FOO(#{parameter1, mode=IN, jdbcType=VARCHAR}, #{parameter2, mode=IN}) }
3. 用动态SQL处理可选的parameter2
如果parameter2是可选的(有时候不需要传入),可以用MyBatis的动态SQL来生成适配的语句,这样就算parameter2为null或者没传,也不会触发绑定异常:
<select id="callPRC_FOO" statementType="CALLABLE"> { call PRC_FOO( #{parameter1, mode=IN, jdbcType=VARCHAR}, <choose> <when test="parameter2 != null"> #{parameter2, mode=IN, jdbcType=VARCHAR} </when> <otherwise> NULL </otherwise> </choose> )} </select>
这样无论parameter2是否存在,生成的SQL都是合法的。
4. 确认参数传递的方式
- 如果是用Map传参,要确保Map里确实包含
parameter2这个key(哪怕它的值是null); - 如果是用实体类传参,要保证实体类有
parameter2的getter方法——MyBatis是通过getter来读取对象里的参数值的。
内容的提问来源于stack exchange,提问作者Rancio
相关产品推荐
相关产品推荐

