32. 收货地址-增加-前端页面
33. 省市区-导入数据表及数据
下载t_dict_district.zip
得到SQL脚本,然后,登录MySQL控制台,使用tedu_store
数据库,并执行
source 脚本文件的路径
34. 省市区-创建实体类
在cn.tedu.store.entity
下创建District
类,实现Serializable
接口:
public class District implements Serializable {
private Integer id;
private String parent;
private String code;
private String name;
// SET/GET/基于id的hashCode和equals/toString
}
35. 省市区-获取列表-持久层
获取全国所有省/获取某省所有市/获取某市所有区时,需要执行的SQL语句是相同的,大致是:
select * from t_dict_district where parent=? order by code
则在编写代码时,先在cn.tedu.store.mapper
下创建DistrictMapper
接口,并在接口中添加抽象方法:
/**
* 处理省/市/区数据的持久层接口
*/
public interface DistrictMapper {
/**
* 查询全国所有省/某省所有市/某市所有区的列表
* @param parent 父级单位的行政代号,如果需要查询全国所有省,则使用"86"作为父级代号
* @return 匹配的全国所有省/某省所有市/某市所有区的列表
*/
List<District> findByParent(String parent);
}
在src/main/resources/mappers下将AddressMapper.xml复制,并得到DistrictMapper.xml,在DistrictMapper.xml中,删除原有配置代码,并配置以上抽象方法的映射:
<mapper namespace="cn.tedu.store.mapper.DistrictMapper">
<!-- 查询全国所有省/某省所有市/某市所有区的列表 -->
<!-- List<District> findByParent(String parent) -->
<select id="findByParent"
resultType="cn.tedu.store.entity.District">
SELECT
*
FROM
t_dict_district
WHERE
parent=#{parent}
ORDER BY
code ASC
</select>
</mapper>
在src/test/java的cn.tedu.store.mapper
下创建DistrictMapperTests
测试类,在测试类的声明之前添加2项注解,并测试以上抽象方法的功能:
@RunWith(SpringRunner.class)
@SpringBootTest
public class DistrictMapperTests {
@Autowired
private DistrictMapper mapper;
@Test
public void findByParent() {
String parent = "86";
List<District> list = mapper.findByParent(parent);
System.err.println("count=" + list.size());
for (District item : list) {
System.err.println(item);
}
}
}
36. 省市区-获取列表-业务层
在cn.tedu.store.service
包中创建IDistrictService
业务接口,并在接口中添加抽象方法:
/**
* 处理省/市/区数据的业务层接口
*/
public interface IDistrictService {
/**
* 查询全国所有省/某省所有市/某市所有区的列表
* @param parent 父级单位的行政代号,如果需要查询全国所有省,则使用"86"作为父级代号
* @return 匹配的全国所有省/某省所有市/某市所有区的列表
*/
List<District> getByParent(String parent);
}
在cn.tedus.store.service.impl
包中创建DistrictServiceImpl
业务实现类,实现以上接口,添加@Service
注解,添加@Autowired private DistrictMapper districtMapper;
持久层对象,并重写抽象方法:
public List<District> getByParent(String parent) {
// 调用持久层对象的查询,得到列表
// 遍历查询到的列表
// -- 将列表项的id和parent设置为null
// 返回列表
}
具体代码为:
/**
* 处理省/市/区数据的业务层实现类
*/
@Service
public class DistrictServiceImpl implements IDistrictService {
@Autowired
private DistrictMapper districtMapper;
@Override
public List<District> getByParent(String parent) {
// 调用持久层对象的查询,得到列表
List<District> list = districtMapper.findByParent(parent);
// 遍历查询到的列表
for (District district : list) {
// 将列表项的id和parent设置为null
district.setId(null);
district.setParent(null);
}
// 返回列表
return list;
}
}
最后,在src/test/java的cn.tedu.store.service
下创建DistrictServiceTests
测试类,在测试类的声明之前添加2项注解,并测试以上抽象方法的功能:
@RunWith(SpringRunner.class)
@SpringBootTest
public class DistrictServiceTests {
@Autowired
private IDistrictService service;
@Test
public void getByParent() {
String parent = "86";
List<District> list = service.getByParent(parent);
System.err.println("count=" + list.size());
for (District item : list) {
System.err.println(item);
}
}
}
37. 省市区-获取列表-控制器层
关于需要处理的请求:
请求路径:/districts/
请求参数:String parent
请求方式:GET
响应结果:JsonResult<List<District>>
是否拦截:否,不需要登录就可以访问
由于不需要拦截,所以,先在拦截器的配置类InterceptorConfigurer
类中添加/district/**
到白名单!
先在cn.tedu.store.controller
包中创建DistrictController
类,继承自BaseController
,在类的声明之前添加@RestController
和@RequestMapping("districts")
注解,并在类中声明@Autowired private IDistrictService districtService;
业务接口:
/**
* 处理省/市/区数据相关请求的控制器类
*/
@RestController
@RequestMapping("districts")
public class DistrictController extends BaseController {
@Autowired
private IDistrictService districtService;
}
然后,在类中添加处理请求的方法:
// http://localhost:8080/districts/?parent=86
@GetMapping({"", "/"})
public JsonResult<List<District>> getByParent(String parent) {
// 调用业务对象获取数据
// 返回OK与数据
}