AddressBookController:
/**
* 查询当前登录用户的所有地址信息
*
* @return
*/
@GetMapping("/list")
@ApiOperation("查询当前登录用户的所有地址信息")
public Result> list() {
AddressBook addressBook = new AddressBook();
addressBook.setUserId(BaseContext.getCurrentId());
List list = addressBookService.list(addressBook);
return Result.success(list);
}
返回类型是 Result>,一个包含 AddressBook 对象列表的 Result 对象。Result 通常用于封装返回结果,包含成功或失败的状态信息。
AddressBook包含以下属性:
private static final long serialVersionUID = 1L;
private Long id;
//用户id
private Long userId;
//收货人
private String consignee;
//手机号
private String phone;
//性别 0 女 1 男
private String sex;
//省级区划编号
private String provinceCode;
//省级名称
private String provinceName;
//市级区划编号
private String cityCode;
//市级名称
private String cityName;
//区级区划编号
private String districtCode;
//区级名称
private String districtName;
//详细地址
private String detail;
//标签
private String label;
//是否默认 0否 1是
private Integer isDefault;
AddressBook addressBook = new AddressBook();
new一个addressBook的对象,用于存储查询条件。
addressBook.setUserId(BaseContext.getCurrentId());
BaseContext.getCurrentId() 获取当前登录用户的ID,并将其设置到 addressBook 对象中。这样在查询时,只会返回该用户的地址信息。
List
list = addressBookService.list(addressBook);
调用 addressBookService 的 list 方法,传入 addressBook 对象作为查询条件,返回符合条件的 AddressBook 对象列表。最后返回list。
addressBookService.list :
接口:
List list(AddressBook addressBook);
实现类:
/**
* 条件查询
*
* @param addressBook
* @return
*/
public List list(AddressBook addressBook) {
return addressBookMapper.list(addressBook);
}
Mapper :
/**
* 条件查询
* @param addressBook
* @return
*/
List list(AddressBook addressBook);
xml :
将传入的addressBook对象中的userid解析并作为条件查询。
parameterType="AddressBook" 的含义:
指定 SQL 语句中传入的参数类型为 AddressBook 类。
这意味着在 SQL 语句中,可以通过 #{属性名} 的方式访问 AddressBook 对象的属性。
resultType 的含义
指定 SQL 查询结果的返回类型。
MyBatis 会将查询结果自动映射到 resultType 指定的 Java 类型。
/**
* 新增地址
*
* @param addressBook
* @return
*/
@PostMapping
@ApiOperation("新增地址")
public Result save(@RequestBody AddressBook addressBook) {
addressBookService.save(addressBook);
return Result.success();
}
将前端传入的AddressBod的Json数据解析为,AddressBook对象。
调用save方法保存地址到数据库。
接口:
void save(AddressBook addressBook);
实现类:
/**
* 新增地址
*
* @param addressBook
*/
public void save(AddressBook addressBook) {
addressBook.setUserId(BaseContext.getCurrentId());
addressBook.setIsDefault(0);
addressBookMapper.insert(addressBook);
}
//是否默认 0否 1是 private Integer isDefault;
设置addressBook对象中的UserId和是否默认的值。(由于是新增地址,这里默认为0)
Mapper.insert :
/**
* 新增
* @param addressBook
*/
@Insert("insert into address_book" +
" (user_id, consignee, phone, sex, province_code, province_name, city_code, city_name, district_code," +
" district_name, detail, label, is_default)" +
" values (#{userId}, #{consignee}, #{phone}, #{sex}, #{provinceCode}, #{provinceName}, #{cityCode}, #{cityName}," +
" #{districtCode}, #{districtName}, #{detail}, #{label}, #{isDefault})")
void insert(AddressBook addressBook);
@GetMapping("/{id}")
@ApiOperation("根据id查询地址")
public Result getById(@PathVariable Long id) {
AddressBook addressBook = addressBookService.getById(id);
return Result.success(addressBook);
}
@PathVariable Long id:@PathVariable 是 Spring 注解,表示从 URL 路径中提取 {id} 的值,并将其绑定到方法参数 id 上。Long 是参数的类型。
调用 addressBookService 的 getById 方法,传入 id 作为参数,查询对应的 AddressBook 对象。
返回addressBook对象。
Impl:
/**
* 根据id查询
*
* @param id
* @return
*/
public AddressBook getById(Long id) {
AddressBook addressBook = addressBookMapper.getById(id);
return addressBook;
}
/**
* 根据id修改地址
*
* @param addressBook
* @return
*/
@PutMapping
@ApiOperation("根据id修改地址")
public Result update(@RequestBody AddressBook addressBook) {
addressBookService.update(addressBook);
return Result.success();
}
调用Service的update方法,将addressBook对象传入该方法。
接口:
void update(AddressBook addressBook);
实现类:
/**
* 根据id修改地址
*
* @param addressBook
*/
public void update(AddressBook addressBook) {
addressBookMapper.update(addressBook);
}
Mapper:
/**
* 根据id修改
* @param addressBook
*/
void update(AddressBook addressBook);
xml:
update address_book
consignee = #{consignee},
sex = #{sex},
phone = #{phone},
detail = #{detail},
label = #{label},
is_default = #{isDefault},
where id = #{id}
/**
* 设置默认地址
*
* @param addressBook
* @return
*/
@PutMapping("/default")
@ApiOperation("设置默认地址")
public Result setDefault(@RequestBody AddressBook addressBook) {
addressBookService.setDefault(addressBook);
return Result.success();
}
传入addressBook对象,调用setDefault方法。
接口:
void setDefault(AddressBook addressBook);
实现类:
/**
* 设置默认地址
*
* @param addressBook
*/
@Transactional
public void setDefault(AddressBook addressBook) {
//1、将当前用户的所有地址修改为非默认地址 update address_book set is_default = ? where user_id = ?
addressBook.setIsDefault(0);
addressBook.setUserId(BaseContext.getCurrentId());
addressBookMapper.updateIsDefaultByUserId(addressBook);
//2、将当前地址改为默认地址 update address_book set is_default = ? where id = ?
addressBook.setIsDefault(1);
addressBookMapper.update(addressBook);
}
方法使用了 @Transactional 注解,确保两个操作(将所有地址设置为非默认,将当前地址设置为默认)在同一个事务中执行。
如果其中一个操作失败,事务会回滚,保证数据的一致性。
通过 addressBookMapper.updateIsDefaultByUserId 方法,将当前用户的所有地址的 isDefault 字段设置为 0(非默认)。
xml:
/**
* 根据 用户id修改 是否默认地址
* @param addressBook
*/
@Update("update address_book set is_default = #{isDefault} where user_id = #{userId}")
void updateIsDefaultByUserId(AddressBook addressBook);
修改当前地址为默认地址:
通过 addressBookMapper.update 方法,将当前地址的 isDefault 字段设置为 1(默认)。
/**
* 查询默认地址
*/
@GetMapping("default")
@ApiOperation("查询默认地址")
public Result getDefault() {
//SQL:select * from address_book where user_id = ? and is_default = 1
AddressBook addressBook = new AddressBook();
addressBook.setIsDefault(1);
addressBook.setUserId(BaseContext.getCurrentId());
List list = addressBookService.list(addressBook);
if (list != null && list.size() == 1) {
return Result.success(list.get(0));
}
return Result.error("没有查询到默认地址");
}
根据当前登录用户的 userId 和 isDefault 字段(值为 1),查询用户的默认地址。
如果查询到默认地址,返回该地址;否则,返回错误信息。
AddressBook addressBook = new AddressBook();
addressBook.setIsDefault(1);
addressBook.setUserId(BaseContext.getCurrentId())
创建一个 AddressBook 对象,并设置 isDefault 为 1(表示默认地址)。
设置 userId 为当前登录用户的 ID(通过 BaseContext.getCurrentId() 获取)。
List
list = addressBookService.list(addressBook);
调用 addressBookService.list 方法,根据查询条件获取地址列表。
如果查询结果列表不为空且大小为 1,返回该默认地址。
否则,返回错误信息“没有查询到默认地址”。