
电商上面订单状态的修改是非常普通的业务
随着商品的购买流程,订单的状态有:
0 = 未支付
1 = 已关闭 (超时未支付)
2 = 已取消
3 = 已支付
4 = 已签收
5 = 已拒收
6 = 退款处理中
7 = 已退款
开发更新订单状态的持久层
修改订单状态就是根据订单id修改订单的state
随着业务的发展,订单可能需要更多修改的需求,订单的列(字段)比较多,如果每个字段修改,都需要编写一个方法的话,那么方法的数量会非常多
如果我们编写一个方法,能够接收订单对象的实体类参数(OmsOrder)
我们要实现可以根据OmsOrder对象的实际数据来实现动态的修改需要修改的字段
Mybatis中可以通过编写动态修改sql语句完成这个需求
OmsOrderMapper接口添加方法
// 利用动态sql,实现对订单内容的修改
// 参数是OmsOrder类型,且必须包含id值,id不可修改,其他属性如果不为空,就修改为当前值
int updateOrderById(OmsOrder order);
OmsOrderMapper.xml编写sql
<!--
利用动态sql,实现对订单内容的修改
参数是OmsOrder类型,且必须包含id值,id不可修改,其他属性如果不为空,就修改为当前值
-->
<!--
OmsOrder对象动态修改数据库中数据的sql语句
Mybatis框架动态生成修改的Sql语句,需要<set>标签
1. 在<set>标签的位置生成一个set关键字
2. 在<set></set>标签之间,根据判断动态生成的sql语句,
如果生成的内容最后一个字符是","就会将它删除!
-->
<update id="updateOrderById">
update oms_order
<set>
<if test="contactName!=null">
contact_name=#{contactName},
</if>
<if test="mobilePhone!=null">
mobile_phone=#{mobilePhone},
</if>
<if test="telephone!=null">
telephone=#{telephone},
</if>
<if test="streetCode!=null">
street_code=#{streetCode},
</if>
<if test="streetName!=null">
street_name=#{streetName},
</if>
<if test="detailedAddress!=null">
detailed_address=#{detailedAddress},
</if>
<if test="tag!=null">
tag=#{tag},
</if>
<if test="paymentType!=null">
payment_type=#{paymentType},
</if>
<if test="state!=null">
state=#{state},
</if>
<if test="rewardPoint!=null">
reward_point=#{rewardPoint},
</if>
<if test="amountOfOriginalPrice!=null">
amount_of_original_price=#{amountOfOriginalPrice},
</if>
<if test="amountOfFreight!=null">
amount_of_freight=#{amountOfFreight},
</if>
<if test="amountOfDiscount!=null">
amount_of_discount=#{amountOfDiscount},
</if>
<if test="amountOfActualPay!=null">
amount_of_actual_pay=#{amountOfActualPay},
</if>
<if test="gmtPay!=null">
gmt_pay=#{gmtPay},
</if>
</set>
where
id=#{id}
</update>
开发修改订单状态的业务逻辑层
OmsOrderServiceImpl
// 根据订单id,修改订单的状态
@Override
public void updateOrderState(OrderStateUpdateDTO orderStateUpdateDTO){
// 参数类型是OrderStateUpdateDTO
// 修改方法参数类型是OmsOrder,所以要先实例化OmsOrder对象
OmsOrder order = new OmsOrder();
// 将参数中的属性值赋值到order对象
BeanUtils.copyProperties(orderStateUpdateDTO,order);
// 调用持续层动态修改order的方法即可
omsOrderMapper.updateOrderById(order);
}
开发修改订单状态的控制层
OmsOrderController
@PostMapping("/update/state")
@ApiOperation("修改订单状态的方法")
@PreAuthorize("hasRole('user')")
public JsonResult updateOrderState(@Validated OrderStateUpdateDTO orderStateUpdateDTO){
omsOrderService.updateOrderState(orderStateUpdateDTO);
return JsonResult.ok("修改完成!");
}
测试:
重启order模块
测试时根据实际数据库订单id,修改knife4j的数据然后再运行
运行后查看数据库中订单状态列是否修改