MyBatis调用存储过程时,如何忽略部分OUT参数的对象映射?
解决MyBatis调用存储过程时忽略指定OUT参数的问题
嗨,这个场景我太熟悉了!其实要忽略不需要的OUT参数,MyBatis里有几种很直接的实现方式,结合你用map作为参数的情况,我推荐这两种方案:
方案一:使用「匿名」OUT参数(最简便)
你只需要在定义那个要忽略的OUT参数时,指定一个不存在于你的传入map中的key,MyBatis执行完存储过程后,会把这个参数的结果放到map里,但因为你不会去读取这个不存在的key,就相当于直接忽略了它。
修改你的代码片段示例:
<select id="getDetails" statementType="CALLABLE" parameterType="map" > {call GET_DETAILS( #{Null,javaType=String,jdbcType=VARCHAR,mode=IN}, --P_MSG_ID #{header.sourceId,javaType=String,jdbcType=VARCHAR,mode=IN}, --SC_ND #{discardThisParam,jdbcType=VARCHAR,mode=OUT}, -- 这里就是要忽略的OUT参数,随便起个map里没有的名字 -- 其他参数继续保持原样... )} </select>
注意:这里的jdbcType要和存储过程中该OUT参数的实际类型保持一致,比如如果是数字类型就写jdbcType=INTEGER,避免类型转换错误。
方案二:事后手动移除Map中的参数(备选)
如果因为某些原因你必须用真实的参数名,那可以在调用完mapper方法后,手动从map中移除这个不需要的参数:
Map<String, Object> paramMap = new HashMap<>(); // 填充你的IN参数... mapper.getDetails(paramMap); // 移除不需要的OUT参数 paramMap.remove("不需要的参数名");
不过这种方法是事后处理,不如方案一直接高效,更适合临时应急的场景。
总结一下,方案一最推荐,只需要在XML里简单修改参数名就能实现忽略OUT参数的需求,完全不会影响其他参数的映射逻辑。
内容的提问来源于stack exchange,提问作者osama yaccoub
相关产品推荐
相关产品推荐

