2013-12-18 16 views
1

我想從Java使用MyBatis & Spring調用MySQL存儲過程。我是否需要使用POJO來做到這一點?是否可以在不使用POJO的情況下從MyBatis調用MySQL存儲過程?

我使用以下版本:

  • 的Java 1.6
  • 的MyBatis 3.2.2
  • 春/ MyBatis的
  • 1.2春天3.2.3
  • MySQL 5.1中

以下代碼片段代碼確實工作。

XML映射:

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; 
} 
} 

以上的偉大工程,但我想這樣做是

<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接口中的方法像這樣:

映射程序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。

任何幫助,或指導,將不勝感激。

回答

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配置(asume即nonTaxableAmount是持有人的情況下):

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

啊,這是有道理的,MyBatis正在創建一個新的對象實例。謝謝。 – CyclingBloke

相關問題