store(商城项目)Springboot+springmvc+ajax+mybatis(11)

44. 收货地址-显示列表-控制器层

(a) 处理新创建的异常

(b) 设计所需要处理的请求

请求路径:/addresses/
请求参数:HttpSession session
请求方式:GET
响应结果:JsonResult<List<Address>>

(c) 处理请求

// http://localhost:8080/addresses
@GetMapping("")
public JsonResult<List<Address>> getByUid(HttpSession session) {
    Integer uid = getUidFromSession(session);
    List<Address> data = addressService.getByUid(uid);
    return new JsonResult<>(OK, data);
}

45. 收货地址-显示列表-前端页面

46. 收货地址-设置默认-持久层

(a) 规划所需要执行的SQL语句

如果需要将某条收货地址设置为默认,需要执行的SQL语句大致是:

update t_address set is_default=1, modified_user=?, modified_time=? where aid=?

除了将这条收货地址设置为默认,还应该将原来默认的收货地址设置为非默认!这项操作应该在以上“设置默认”之前执行,需要执行的SQL语句大致是:

update t_address set is_default=0 where uid=?

另外,在执行更新之前,还应该检查被设置默认的收货地址是否存在,及数据归属是否正确!需要执行的SQL语句大致是:

select * from t_address where aid=?

(b) 接口与抽象方法

AddressMapper中添加:

/**
 * 将指定的收货地址设置为默认
 * @param aid 收货地址的id
 * @param modifiedUser 修改执行人
 * @param modifiedTime 修改时间
 * @return 受影响的行数
 */
Integer updateDefaultByAid(
        @Param("aid") Integer aid, 
        @Param("modifiedUser") String modifiedUser, 
        @Param("modifiedTime") Date modifiedTime);

/**
 * 将某用户的收货地址全部设置为非默认
 * @param uid 用户id
 * @return 受影响的行数
 */
Integer updateNonDefaultByUid(Integer uid);

/**
 * 根据收货地址id查询收货地址详情
 * @param aid 收货地址id
 * @return 匹配的收货地址详情,如果没有匹配的数据,则返回null
 */
Address findByAid(Integer aid);

(c) 配置映射

AddressMapper.xml中配置映射:

<!-- 将指定的收货地址设置为默认 -->
<!-- Integer updateDefaultByAid(
        @Param("aid") Integer aid, 
        @Param("modifiedUser") String modifiedUser, 
        @Param("modifiedTime") Date modifiedTime) -->
<update id="updateDefaultByAid">
    UPDATE
        t_address
    SET
        is_default=1,
        modified_user=#{modifiedUser},
        modified_time=#{modifiedTime}
    WHERE
        aid=#{aid}
</update>

<!-- 将某用户的收货地址全部设置为非默认 -->
<!-- Integer updateNonDefaultByUid(Integer uid) -->
<update id="updateNonDefaultByUid">
    UPDATE
        t_address
    SET
        is_default=0
    WHERE
        uid=#{uid}
</update>

<!-- 根据收货地址id查询收货地址详情 -->
<!-- Address findByAid(Integer aid) -->
<select id="findByAid"
    resultMap="AddressEntityMap">
    SELECT
        *
    FROM
        t_address
    WHERE
        aid=#{aid}
</select>

AddressMapperTests中测试:

@Test
public void updateDefaultByAid() {
    Integer aid = 28;
    String modifiedUser = "默认管理员";
    Date modifiedTime = new Date();
    Integer rows = mapper.updateDefaultByAid(aid, modifiedUser, modifiedTime);
    System.err.println("rows=" + rows);
}

@Test
public void updateNonDefaultByUid() {
    Integer uid = 18;
    Integer rows = mapper.updateNonDefaultByUid(uid);
    System.err.println("rows=" + rows);
}

@Test
public void findByAid() {
    Integer aid = 26;
    Address result = mapper.findByAid(aid);
    System.err.println(result);
}

47. 收货地址-设置默认-业务层

(a) 规划可能出现的异常

在执行设置默认之前,应该先检查数据是否存在,如果不存在,则抛出AddressNotFoundException

还需要判断数据归属是否正确,如果不正确,则抛出AccessDeniedException

最终将执行更新数据的操作,则可能抛出UpdateException

则需要创建AddressNotFoundExceptionAccessDeniedException

(b) 业务接口及抽象方法

IAddressService接口中添加抽象方法:

void setDefault(Integer aid, Integer uid, String username);

(c) 实现抽象方法

AddressServiceImpl中实现:

@Transactional
public void setDefault(Integer aid, Integer uid, String username) {
    // 根据参数aid查询收货地址数据
    // 判断查询结果是否为null
    // 是:AddressNotFoundException

    // 判断查询结果中的uid与参数uid是否不一致
    // 是:AccessDeniedException

    // 将该用户的所有收货地址设置为非默认,并获取返回值
    // 判断返回值是否小于1
    // 是:UpdateException

    // 将指定的收货地址设置为默认,并获取返回值
    // 判断返回值是否不为1
    // 是:UpdateException
}

具体代码:

@Override
@Transactional
public void setDefault(Integer aid, Integer uid, String username) {
    // 根据参数aid查询收货地址数据
    Address result = addressMapper.findByAid(aid);
    // 判断查询结果是否为null
    if (result == null) {
        // 是:AddressNotFoundException
        throw new AddressNotFoundException(
            "设置默认收货地址失败!尝试访问的数据不存在!");
    }

    // 判断查询结果中的uid与参数uid是否不一致
    if (!result.getUid().equals(uid)) {
        // 是:AccessDeniedException
        throw new AccessDeniedException(
            "设置默认收货地址失败!非法访问已经被拒绝!");
    }

    // 将该用户的所有收货地址设置为非默认,并获取返回值
    Integer rows = addressMapper.updateNonDefaultByUid(uid);
    // 判断返回值是否小于1
    if (rows < 1) {
        // 是:UpdateException
        throw new UpdateException(
            "设置默认收货地址失败[1]!更新收货地址数据时出现未知错误,请联系系统管理员!");
    }

    // 将指定的收货地址设置为默认,并获取返回值
    rows = addressMapper.updateDefaultByAid(aid, username, new Date());
    // 判断返回值是否不为1
    if (rows != 1) {
        // 是:UpdateException
        throw new UpdateException(
            "设置默认收货地址失败[2]!更新收货地址数据时出现未知错误,请联系系统管理员!");
    }
}

然后,在AddressServiceImpl中测试:

@Test
public void setDefault() {
    try {
        Integer aid = 25;
        Integer uid = 18;
        String username = "收货地址管理员";
        service.setDefault(aid, uid, username);
        System.err.println("OK.");
    } catch (ServiceException e) {
        System.err.println(e.getClass().getName());
        System.err.println(e.getMessage());
    }
}

48. 收货地址-设置默认-控制器层

(a) 处理新创建的异常

(b) 设计所需要处理的请求

请求路径:
请求参数:
请求方式:
响应结果:JsonResult<?>

(c) 处理请求

49. 收货地址-设置默认-前端页面

-----------------------------------

附1:关于事务(Transaction)

事务是数据库领域中,能保证同一个业务中需要执行的多次增删改操作全部成功或全部失败的机制!

在基于SpringJDBC的开发模式下,对业务方法添加@Transactional注解,即可表示“该业务方法中将执行的多次增删改操作将以事务的方式执行”,可以达到“全部执行成功”或“全部执行失败”的效果!

账户          余额
苍松          100
国斌          1000

国斌向苍松转账500元

update xx set 余额=余额+500 where 账户=苍松
update xx set 余额=余额-500 where 账户=国斌
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饭九钦vlog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值