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也能夠找到該參數