接口说明:“房间属性管理”,需要用到AttrKeyService和AttrValueService。
@Tag(name = "房间属性管理")
@RestController
@RequestMapping("/admin/attr")
public class AttrController {
@Autowired
private AttrKeyService attrKeyService;
@Autowired
private AttrValueService attrValueService;
}
一、查询全部属性名称和属性值列表接口
接口名称:listAttrInfo
请求方式:Get
请求路径:/admin/attr/list
请求参数:无
返回类型:List<AttrKeyVo>
首先我们要查看属性名称和属性值的表结构:属性id在属性值表中作为外键连接属性名称表,一个属性名称对应多个属性值,即一对多的关系。我们在查询属性名称时,还需要展示该属性名称的所有属性值。因此我们需要用到多表查询。

由于我们持久层用到的技术为MybatisPlus,而MybatisPlus只能为我们实现了单表操作的方法,并不能实现复杂的多表操作方法。因此我们需要根据开发需求自定义mapper方法。
1.1 controller层:
@Operation(summary = "查询全部属性名称和属性值列表")
@GetMapping("list")
public Result<List<AttrKeyVo>> listAttrInfo() {
List<AttrKeyVo> list=attrKeyService.listAttrInfo();
return Result.ok(list);
}
1.2 service层
@Service
public class AttrKeyServiceImpl extends ServiceImpl<AttrKeyMapper, AttrKey>
implements AttrKeyService{
@Autowired
private AttrKeyMapper attrKeyMapper;
@Override
public List<AttrKeyVo> listAttrInfo() {
return attrKeyMapper.listAttrInfo();
}
}
1.3 mapper层
public interface AttrKeyMapper extends BaseMapper<AttrKey> {
List<AttrKeyVo> listAttrInfo();
}
xml文件配置
<resultMap id="AttrKeyVoMap" type="com.atguigu.lease.web.admin.vo.attr.AttrKeyVo">
<id property="id" column="id"/>
<result property="name" column="name"/>
<collection property="attrValueList" ofType="com.atguigu.lease.model.entity.AttrValue">
<id property="id" column="attr_value_id"/>
<result property="name" column="attr_value_name"/>
<result property="attrKeyId" column="attr_key_id"/>
</collection>
</resultMap>
<select id="listAttrInfo" resultMap="AttrKeyVoMap">
select k.id,
k.name,
v.id attr_value_id,
v.name attr_value_name,
v.attr_key_id
from attr_key k
left join attr_value v
on k.id = v.attr_key_id and v.is_deleted = 0
where k.is_deleted = 0
</select>
Sql错误写法❌:
select k.id,
k.name,
v.id attr_value_id,
v.name attr_value_name,
v.attr_key_id
from attr_key k
join attr_value v
on k.id = v.attr_key_id
where k.is_deleted = 0 and v.is_deleted = 0
为何说错误❌:因为该接口需要用到的是多表查询,因此需要用到 “join...on”,需要attr_key表连接attr_value表。当如果只是添加了属性名称,没有属性值时,查询全部时查不出来新添加的属性名称。因此我们需要用到left join。
但是按逻辑使用左外连接后应该能够查询出来了,但是测试之后还是查不出来。原因是发生在过滤条件where上。因为当只添加属性名称的情况下,属性值的表是没有任何数据的,而过滤条件上需要'k.is_deleted = 0 and v.is_deleted = 0'的情况下才可以满足条件,显然是不符合我们需求的。
再复习一下Mybatis的xml配置:
select标签下的属性resultType和resultMap的使用场景:
- resultType:适用于简单的条件场景,返回简单的数据类型。
- resultMap:适用于复杂的关联映射、列名和属性名不匹配的场景下。
二、新增或更新属性名称接口
接口名称:saveOrUpdateAttrKey
请求方式:Post
请求路径:/admin/attr/key/saveOrUpdate
请求参数:@RequestBody AttrKey attrKey
返回类型:无
@Operation(summary = "新增或更新属性名称")
@PostMapping("key/saveOrUpdate")
public Result saveOrUpdateAttrKey(@RequestBody AttrKey attrKey) {
attrKeyService.saveOrUpdate(attrKey);
return Result.ok();
}
三、新增或更新属性值接口
接口名称:saveOrUpdateAttrValue
请求方式:Post
请求路径:/admin/attr/value/saveOrUpdate
请求参数:@RequestBody AttrValue attrValue
返回类型:无
@Operation(summary = "新增或更新属性值")
@PostMapping("value/saveOrUpdate")
public Result saveOrUpdateAttrValue(@RequestBody AttrValue attrValue) {
attrValueService.saveOrUpdate(attrValue);
return Result.ok();
}
四、根据id删除属性名称接口
接口名称:removeAttrKeyById
请求方式:Delete
请求路径:/admin/attr/key/deleteById
请求参数:@RequestParam Long attrKeyId
返回类型:无
该接口需要使用到条件查询删除,当删除该属性名称时需要同时删除该属性名称下的属性值。
@Operation(summary = "根据id删除属性名称")
@DeleteMapping("key/deleteById")
public Result removeAttrKeyById(@RequestParam Long attrKeyId) {
//删除属性名
attrKeyService.removeById(attrKeyId);
//删除属性值
LambdaUpdateWrapper<AttrValue> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(AttrValue::getAttrKeyId,attrKeyId);
attrValueService.remove(wrapper);
return Result.ok();
}
五、根据id删除属性值接口
接口名称:removeAttrValueById
请求方式:Delete
请求路径:/admin/attr/value/deleteById
请求参数:@RequestParam Long id
返回类型:无
@Operation(summary = "根据id删除属性值")
@DeleteMapping("value/deleteById")
public Result removeAttrValueById(@RequestParam Long id) {
attrValueService.removeById(id);
return Result.ok();
}
1349

被折叠的 条评论
为什么被折叠?



