【项目实践】公寓租赁项目(三):基于SpringBoot房间属性管理接口开发

接口说明:“房间属性管理”,需要用到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();
    }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值