天天看點

mybatis調用sqlserver存儲過程

sqlserver中存儲過程函數為:

ALTER    PROCEDURE [dbo].[egl_point_ship]
    @order_id     varchar(32),
    @b_Success        int        OUTPUT, 
    @c_errmsg        varchar(250)    OUTPUT 
  ...      
order_id是傳入的值,b_Success和c_errmsg是執行完存儲過程後傳回輸出的值      

DAO接口與mapper檔案如下:

// mapper接口
void eglPointShip(Map map);
// mapper.xml檔案
  <update id="eglPointShip" parameterType="map" statementType="CALLABLE">
    {
      call egl_point_ship(
                #{order_id,mode=IN,jdbcType=VARCHAR},
                #{b_Success,mode=OUT,jdbcType=INTEGER},
                #{c_errmsg,mode=OUT,jdbcType=VARCHAR}
                )
        }
  </update>      

server層調用dao接口:

@Transactional
    public ProcedureDto pointSend(String moveOrderId) {
        Map<String, String> map = new HashMap<>();
        map.put(Procedure.orderId, moveOrderId);
        // 調用存儲過程
        this.moveOrdersMapper.eglPointShip(map);
        // map裡得到傳回資訊
        String bSuccess = String.valueOf(map.get(Procedure.bSuccess));
        String cErrmsg = map.get(Procedure.cErrmsg);
        if ("0".equals(bSuccess)) {
            throw new ApplicationException(cErrmsg);
        }
    }      

 2018/9/7修改:存儲過程不傳map,傳對象也是可以的,并且更加清晰

service層方法如下:

public void pointSend(String moveOrderId) {
        PointProcedure pointProcedure = new PointProcedure();
        pointProcedure.setOrderId(moveOrderId);
     // 調用存儲過程
        this.moveOrdersMapper.eglPointShip(pointProcedure);
     // 回調資訊
        if (0 == pointProcedure.getSuccess()) {
            throw new ApplicationException(pointProcedure.getMsg());
        }
}      

mapper檔案裡的parameterType需改為傳入的對象,也可以删掉不寫,mybatis也能夠找到該參數