是否可以在不使用POJO的情况下从MyBatis调用MySQL存储过程?

时间:2013-12-18 16:54:03

标签: mysql spring mybatis

我想使用MyBatis& amp;来调用Java的MySQL存储过程。弹簧。我需要使用POJO来做吗?

我使用以下版本:

  • Java 1.6
  • MyBatis 3.2.2
  • Spring / MyBatis
  • 1.2 Spring 3.2.3
  • MySQL 5.1

以下代码摘要代码 工作。

Mapper XML:

<update id="calculateNonTaxableOrderAmount"
        parameterType="CalculateNonTaxableAmountDTO"  
        statementType="CALLABLE" >

    { call sp_calc_non_taxable_order_amount( 
              #{orderNum,jdbcType=INTEGER,mode=IN}, 
              #{nonTaxableAmount,jdbcType=DECIMAL,mode=OUT} )
        }       
</update>

DAO接口上的方法:

public void calculateNonTaxableOrderAmount(CalculateNonTaxableAmountDTO dto);

CalculateNonTaxableAmountDTO:

public class CalculateNonTaxableAmountDTO {

private Long orderNum;
private BigDecimal nonTaxableAmount;

public Long getOrderNum() {
    return orderNum;
}
public void setOrderNum(Long orderNum) {
    this.orderNum = orderNum;
}
public BigDecimal getNonTaxableAmount() {
    return nonTaxableAmount;
}
public void setNonTaxableAmount(BigDecimal nonTaxableAmount) {
    this.nonTaxableAmount = nonTaxableAmount;
}
}

以上效果很好,但我想做的是这样的事情:

Mapper XML: 请注意这个缺少的parameterType属性。

<update id="calculateNonTaxableOrderAmount"             
        statementType="CALLABLE" >

    { call sp_calc_non_taxable_order_amount( 
              #{orderNum,jdbcType=INTEGER,mode=IN}, 
              #{nonTaxableAmount,jdbcType=DECIMAL,mode=OUT} )
        }       
</update>

DAO接口上的方法:

public void calculateNonTaxableOrderAmount(
            @Param("orderNum") Long orderNum, 
            @Param("nonTaxableAmount") BigDecimal nonTaxableAmount);

使用类似于:

的代码调用DAO方法
BigDecimal nonTaxAmount = new BigDecimal(-1).setScale(2);
orderHeaderDAO.calculateNonTaxableOrderAmount(new Long(11111), nonTaxAmount);
System.out.println("nonTaxAmount = " + nonTaxAmount);

代码执行成功,但nonTaxAmount永远不会更新。 println打印出-1。

任何帮助或指导都将不胜感激。

1 个答案:

答案 0 :(得分:2)

我认为这是不可能的,因为MyBatis将nonTaxableAmount值设置为BigDecimal的新实例,并且您引用了原始的BigDecimal实例。为了解决这个问题,我使用了某种数据持有者(类似于jax-ws数据持有者):

public class Holder<T> {
    private T data;

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data= data;
    }
}

MyBatis config(假设nonTaxableAmount是Holder的实例):

#{nonTaxableAmount.data,jdbcType=DECIMAL,mode=OUT}