iBATIS 将存储过程输出参数设置回 POJO

Posted

技术标签:

【中文标题】iBATIS 将存储过程输出参数设置回 POJO【英文标题】:Stored procedure output parameter set back to POJO by iBATIS 【发布时间】:2010-03-18 11:40:07 【问题描述】:

我正在使用 iBATIS 调用 MSSQL Server 上的存储过程,输入参数是 POJO 上的属性,该 POJO 被放入映射中:

Map<String, Object> saveMap = new HashMap<String, Object>();
saveMap.put("obj", myArticle);
update("save", saveMap);

所有参数都已正确设置为程序的输入,因此没有任何问题。但是其中一个参数是输出参数,我希望它被设置回 POJO,但是 iBATIS 将一个额外的映射 "obj.new"=false 放置在了映射中。 这是显示基本思想的简化版映射:

    <procedure id="save">
    <include refid="Core.returned_value" />
    CALL SPRC_ARTICLE_NAME_SAVE (
        <include refid = "Core.common_fields" />
        @pArticle_id = #obj.art_id#
    ,   @pArtname = #obj.artname#
    ,   @pNewArticleName_flg = #obj.new,mode=INOUT#
    )
</procedure>

调用该过程后,我将 Map 中的两个映射传递给 iBATIS:

"obj"=POJO "obj.new"=False

现在我看到iBatis documentation 说“在执行存储过程时 – iBATIS 将为 OUTPUT 参数创建对象”,所以这是有道理的。但我的问题是,是否有办法指示 iBATIS 在调用过程后将布尔值放回 POJO?我宁愿不做额外的工作,将值从地图中取出并将其设置为我自己的 POJO。

// 乌伦

【问题讨论】:

当我遇到类似问题时,我发现 Jeff Butler 对这个 Jeff Butler 对这个 groups.google.com/group/mybatis-user/browse_thread/thread/… 帖子的回答非常有帮助(尽管使用的是选择语句而不是更新) 【参考方案1】:

您可以使用显式参数映射。见Page 21 of the manual

它相当冗长,但过去对我有用。

<parameterMap id="swapParameters" class="map" >
    <parameter property="email1" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
    <parameter property="email2" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
</parameterMap>

<procedure id="swapEmailAddresses" parameterMap="swapParameters" >
    call swap_email_address (?, ?)
</procedure>

【讨论】:

以上是关于iBATIS 将存储过程输出参数设置回 POJO的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis学习笔记

Mybatis——简介

mybatis调用存储过程 无参带有输入输出参数,输出游标类型的 存储

数据库存储过程和触发器

MybatisMyBatis调用带有返回结果output参数的存储过程上与ibatis的区别

手写Mybatis,彻底搞懂框架原理