我想使用MyBatis& amp;来调用Java的MySQL存储过程。弹簧。我需要使用POJO来做吗?
我使用以下版本:
以下代码摘要代码 工作。
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。
任何帮助或指导都将不胜感激。
答案 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}