50. 收货地址-删除-持久层
(a) 规划所需要执行的SQL语句
删除收货地址需要执行的SQL语句大致是:
delete from t_address where aid=?
在执行删除之前,还应该检查数据是否存在、数据归属是否正确,相关功能已经完成,无需重复开发!
如果删除的是默认收货地址,基于“每个用户始终有且仅有1条默认收货地址”的数据规则,还需要考虑“自动将剩余的某条收货地址设置为默认”,到底是哪一条,可以添加规则“将最后修改的收货地址设置为默认”,那么,就需要找出“最后修改的收货地址”,需要执行的SQL语句大致是:
select * from t_address where uid=? order by modified_time desc limit 0,1
同时,如果用户删除的是默认收货地址,但是,这也是该用户的最后一条收货地址,则不需要执行以上操作!可以通过此前已经完成的countByUid()
来实现!
最后,如果需要将剩余的某条收货地址设置为默认,可以直接通过此前已经完成的updateDefaultByAid()
来实现!
(b) 接口与抽象方法
在AddressMapper
接口中添加:
Integer deleteByAid(Integer aid);
Address findLastModifiedByUid(Integer uid);
(c) 配置映射
51. 收货地址-删除-业务层
(a) 规划可能出现的异常
需要创建DeleteException
。
(b) 业务接口及抽象方法
在IAddressService
中添加:
void delete(Integer aid, Integer uid, String username);
(c) 实现抽象方法
在AddressServiceImpl
中实现抽象方法,分析步骤:
@Transactional
public void delete(Integer aid, Integer uid, String username) {
// 根据aid查询收货地址数据
// 判断查询结果是否为null
// 是:AddressNotFoundException
// 判断查询结果中的uid与参数uid是否不同
// 是:AccessDeniedException
// 执行删除,并获取返回值
// 判断返回值是否不为1
// 是:DeleteException
// 判断查询结果(对应刚刚删除的数据)中的isDefault是否不为1
// return;
// 统计当前用户还有多少收货地址
// 判断统计结果是否为0
// return;
// 查询当前用户的最后修改的那一条收货地址
// 从本次查询中取出数据的aid
// 执行设置默认收货地址,获取返回值
// 判断返回值是否不为1
// 是:UpdateException
}
52. 收货地址-删除-控制器层
(a) 处理新创建的异常
(b) 设计所需要处理的请求
请求路径:
请求参数:
请求方式:
响应结果:JsonResult<?>
(c) 处理请求