2019_07_05stor省市区信息的添加 第七天

36. 收货地址-增加-业务层-补

首先,需要在DistrictMapper.java接口中定义抽象方法:

District findByCode(String code);

然后,在DistrictMapper.xml中配置映射,SQL语句大致是:

select name from t_ditc_district where code=?

完成后,在DistrictMapperTests中编写并执行单元测试:

由于不允许在处理Address的业务层中直接访问以上DistrictMapper接口中的内容,所以,还需要以上功能开发至业务层!使得处理Address的业务层时,可以调用处理District数据的业务层功能!

所以,在IDistrictService中添加抽象方法:

District getByCode(String code);

然后,在业务层中先私有化实现持久层的新方法:

private District findByCode(String code) {
	return districtMapper.findByCode(code);
}

再实现接口中的抽象方法:

public District getByCode(String code) {
	return findByCode(code);
}

完成后,在DistrictServiceTests中编写并执行单元测试:

接下来,就可以在AddressServiceImpl中声明@Autowired IDistrictService districtService;对象,并添加用于“根据省/市/区”代号获取名称的私有方法:

/**
 * 根据省/市/区的代号获取名称
 * @param code 省/市/区的代号
 * @return 省/市/区的代号匹配的名称,如果没有匹配的数据,则返回空字符串
 */
private String getDistrictNameByCode(String code) {
	District result = districtService.getByCode("");
	return result == null ? "" : result.getName();
}

最后,在“增加”功能的业务层中,调用3次以上方法,根据代号获取对应的名称,并装到参数address中执行增加,则最终添加的数量中就是包含省市区数据的!

完全完成后,包括测试也通过后,应该删除现在的全部数据,然后,增加不少于10数据。

37. 收货地址-显示列表-持久层

(a) 规划SQL语句

查询所需要显示的列表的SQL语句大致是:

select 
	*
from 
	t_address 
where 
	uid=?

(b) 接口与抽象方法

AddressMapper中添加抽象方法:

/**
 * 获取某用户的收货地址数据的列表
 * @param uid 用户的id
 * @return 用户的收货地址数据的列表
 */
List<Address> findByUid(Integer uid);

© 配置映射

如果查询列表中的字段列表使用*号,则表示查询所有字段,由于存在查询结果的列名与封装的对象的属性名不匹配的问题,所以,先配置一个<resultMap>(可参考UserMapper.xml中的配置):

<!-- 查询结果与收货地址数据实体的映射 -->
<resultMap id="AddressEntityMap" 
	type="cn.tedu.store.entity.Address">
	<id column="aid" property="aid"/>
	<result column="uid" property="uid"/>
	<result column="name" property="name"/>
	<result column="province_code" property="provinceCode"/>
	<result column="province_name" property="provinceName"/>
	<result column="city_code" property="cityCode"/>
	<result column="city_name" property="cityName"/>
	<result column="area_code" property="areaCode"/>
	<result column="area_name" property="areaName"/>
	<result column="zip" property="zip"/>
	<result column="tel" property="tel"/>
	<result column="phone" property="phone"/>
	<result column="tag" property="tag"/>
	<result column="is_default" property="isDefault"/>
	<result column="created_user" property="createdUser"/>
	<result column="created_time" property="createdTime"/>
	<result column="modified_user" property="modifiedUser"/>
	<result column="modified_time" property="modifiedTime"/>
</resultMap>

然后配置以上接口中的抽象方法:

<!-- 获取某用户的收货地址数据的列表 -->
<!-- List<Address> findByUid(Integer uid) -->
<select id="findByUid"
	resultMap="AddressEntityMap">
	SELECT 
		*
	FROM 
		t_address 
	WHERE 
		uid=#{uid}
	ORDER BY
		is_default DESC,
		modified_time DESC
</select>

AddressMapperTests中测试:

@Test
public void findByUid() {
	Integer uid = 7;
	List<Address> list = mapper.findByUid(uid);
	System.err.println("count=" + list.size());
	for (Address item : list) {
		System.err.println(item);
	}
}

38. 收货地址-显示列表-业务层

(a) 规划异常

(b) 接口与抽象方法

将持久层中的抽象方法复制到业务层接口,然后把方法名的find改成get

/**
 * 获取某用户的收货地址数据的列表
 * @param uid 用户的id
 * @return 用户的收货地址数据的列表
 */
List<Address> getByUid(Integer uid);

© 实现抽象方法

将持久层中的抽象方法复制到业务层实现类,然后私有化实现:

/**
 * 获取某用户的收货地址数据的列表
 * @param uid 用户的id
 * @return 用户的收货地址数据的列表
 */
private List<Address> findByUid(Integer uid) {
	List<Address> addresses = addressMapper.findByUid(uid);
	for (Address address : addresses) {
		address.setTel(null);
		address.setZip(null);
		address.setCreatedUser(null);
		address.setCreatedTime(null);
		address.setModifiedUser(null);
		address.setModifiedTime(null);
	}
	return addresses;
}

然后添加接口中定义的抽象方法:

@Override
public List<Address> getByUid(Integer uid) {
	return findByUid(uid);
}

完成后,进行测试:

@Test
public void getByUid() {
	Integer uid = 7;
	List<Address> list = service.getByUid(uid);
	System.err.println("count=" + list.size());
	for (Address item : list) {
		System.err.println(item);
	}
}

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

(a) 统一处理异常

(b) 设计请求

设计“收货地址-显示列表”的请求方式:

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

© 处理请求

@GetMapping
public JsonResult<List<Address>> getByUid(HttpSession session) {

}

完成后,打开浏览器,可通过http://localhost:8080/addresses/进行测试访问。

40. 收货地址-显示列表-前端界面

41. 收货地址-设为默认-持久层

(a) 规划SQL语句

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

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

除此以外,还需要将原有的默认地址设置为非默认,由于原默认收货地址数据的id可能是未知的,可以“将该用户的所有收货地址设置为非默认,然后再把指定的那条设置为默认”即可,所以,“将该用户的所有收货地址设置为非默认”的SQL语句大致是:

update t_address set is_default=0 where uid=?

在操作数据之前,还是应该对数据进行检查,例如:检查收货地址数据是否存在,对应的SQL查询是:

select aid from t_address where aid=?

以上查询时,查询的字段并不重要,最终只需要判断查询结果是否为null即可,即:用于判断将要被设置为默认的收货地址数据是否存在。

除此以外,由于参数aid是客户端提交的,应该视为不可靠数据,该aid对应的数据可能是不存在的,另外,也可能是他人的数据,所以,在查询时,还应该将uid也查询出来,用于和Session中的uid对比,以判断即将需要操作的数据的归属是否正常:

select uid from t_address where aid=?

(b) 接口与抽象方法

AddressMapper.java接口中,声明3个抽象方法:

updateDefault(
	@Param("aid") Integer aid, 
	@Param("username") String username, 
	@Param("modifiedTime") Date modifiedTime);

updateNonDefault(Integer uid);

Address findByAid(Integer aid);

© 配置映射

42. 收货地址-设为默认-业务层

(a) 规划异常

(b) 接口与抽象方法

© 实现抽象方法

43. 收货地址-设为默认-控制器层

(a) 统一处理异常

(b) 设计请求

设计“收货地址-设为默认”的请求方式:

请求路径:/users/reg
请求参数:User user
请求方式:POST
响应数据:JsonResult<Void>

© 处理请求

44. 收货地址-设为默认-前端界面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员西柚柚

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

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

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

打赏作者

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

抵扣说明:

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

余额充值