一,分页查询接口
controll层
前端地址栏参数会自动封装到类中
使用PageResult封装集合以及总数
/**
* 分页查询
* @param setmealPageQueryDTO
* @return
*/
@GetMapping("/page")
@ApiOperation("分页查询接口")
public Result<PageResult> PageQuery(SetmealPageQueryDTO setmealPageQueryDTO){
log.info("分页查询:{}",setmealPageQueryDTO);
PageResult pageResult = setmealService.pageQuery(setmealPageQueryDTO);
return Result.success(pageResult);
}
Service层
使用了PageHelper工具类
步骤:
1.直接调用类.方法
2.然后使用Page<>类接收mapper层返回的数据
/**
* 分页查询
* @param setmealPageQueryDTO
* @return
*/
@Override
public PageResult pageQuery(SetmealPageQueryDTO setmealPageQueryDTO) {
//使用工具开始分页查询
PageHelper.startPage(setmealPageQueryDTO.getPage(), setmealPageQueryDTO.getPageSize());
//得到Page封装类,
Page<Setmeal> page = setmealMapper.pageQuery(setmealPageQueryDTO);
//获取数据数目
long total = page.getTotal();
//获取数据
List<Setmeal> result = page.getResult();
PageResult pageResult = new PageResult(total,result);
return pageResult;
}
mapper层
like模糊匹配 %任意 _一个单词
<select id="pageQuery" resultType="Setmeal">
select * from setmeal
<where>
<if test="name != null">
and name like concat('%',#{name},'%')
</if>
<if test="categoryId != null">
and category_id = #{categoryId}
</if>
<if test="status != null">
and status = #{status}
</if>
</where>
order by create_time desc
</select>
看完标准答案后:在返回套餐时应该返回SetmealVO对象,而不是Setmeal,所以,要联合查询,将种类名称也显示
二,修改套餐接口
controll层
/**
* 修改套餐
*/
@PutMapping
@ApiOperation("修改套餐接口")
public Result update(@RequestBody SetmealDTO setmealDTO){
log.info("开始修改套餐:{}",setmealDTO);
setmealService.update(setmealDTO);
return null;
}
Service层
细节:
- DTO对象要转为实体对象再穿给mapper层,因为在配置文件中Mybatis只配置了实体类对象
- 更新中间表不知道流程(感觉是先把之前的关系先删了,然后再新增)
@Override
public void update(SetmealDTO setmealDTO) {
//更新套餐
Setmeal setmeal = new Setmeal();
BeanUtils.copyProperties(setmealDTO,setmeal);
setmealMapper.update(setmealDTO);
// TODO 更新中间表
}
Mapper层
细节:记得添加自动填充注解
@AutoFill(value = OperationType.UPDATE)
void update(Setmeal setmeal);
xml
<update id="update" parameterType="Setmeal">
update setmeal
<set>
<if test="categoryId != null">category_id = #{categoryId},</if>
<if test="name != null">name = #{name},</if>
<if test="price != null">price = #{price},</if>
<if test="status != null">status = #{status},</if>
<if test="description != null">description = #{description},</if>
<if test="image != null">image = #{image},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="updateUser != null">update_user = #{updateUser},</if>
</set>
<where>
id = #{id}
</where>
</update>
三,批量删除套餐接口
controller层
/**
* 删除套餐
* @param ids
* @return
*/
@DeleteMapping
@ApiOperation("批量删除套餐接口")
public Result delete(@RequestParam List<Integer> ids){
log.info("删除套餐:{}",ids);
setmealService.delete(ids);
return Result.success();
}
sevice层
/**
* 批量删除套餐
* @param ids
*/
@Override
public void delete(List<Integer> ids) {
//删除套餐
setmealMapper.deleteSetmeal(ids);
//删除套餐与菜品的关系
setmealMapper.deleteSetmealDish(ids);
}
mapper层
<delete id="deleteSetmeal" parameterType="integer">
delete from setmeal where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
<delete id="deleteSetmealDish" parameterType="integer">
delete from setmeal_dish where setmeal_id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
四,套餐起销售,停售套餐
controller层
/**
* 启用禁用
*/
@PostMapping("/status/{status}")
@ApiOperation("启用禁用套餐账号")
public Result startOrStop(@PathVariable Integer status,Long id){
log.info("启用禁用套餐账号: {},{}",status,id);
setmealService.startOrStop(status,id);
return Result.success();
}
sevice层
@Override
public void startOrStop(Integer status, Long id) {
//让套餐停售
if (status == StatusConstant.DISABLE) {
setmealMapper.startSetmeal(status, id);
} else {
//让套餐起售,那么得判断其中菜品都在出售中
//1.先得到所有菜品
List<SetmealDish> setmealDishList = setmealMapper.idQuerySetmealDish(id);
for (SetmealDish sd:setmealDishList) {
//2.得到每个菜品的状态
Integer queryStatus = dishMapper.queryDishStatus(id);
//如果存在菜品停售则抛出异常信息
if(queryStatus==StatusConstant.DISABLE){
throw new BaseException(MessageConstant.SETMEAL_ENABLE_FAILED);
}
}
//3.没抛异常说明菜品都在起售中,让套餐也起售
setmealMapper.startSetmeal(status, id);
}
}
mapper层
/**
* 启用禁用套餐
* @param status
* @param id
*/
@Update("update setmeal set status = #{status} where id = #{id}")
void startSetmeal(Integer status, Long id);
五. 自己做后总结
- 起别名,尽量具体,比如查询操作,查询套餐就写querySetmeal,查询套餐菜品表就querySetmealDish
- id数据类型尽量long类型
- 抛异常: throw new BaseException(SETMEAL_ENABLE_FAILED);
- 在想增加套餐样例里面增加菜品,发现没有相应接口,且数据库没有菜品种类表,等我看完标准回答再回来
六,看完标准答案后
1.根据分类id查询菜品
应征了我的想法,缺少这个接口,但是菜品与种类是一对多的关系,不需要中间表
2.解决了在xml让主键返回
3.在删除套餐中,需要使用中间表,所以应该再写一个操作中间表的Mapper类
而且在Service中循环套出每个id,,在mapper层中写单个删除,因为在其他接口也会用到单个删除菜品的Mapper接口
4.更新套餐中需要将套餐关系表全部删除,然后重新增加关系,并且使用的是xml遍历,
原因可能是在其他接口中,不会用到只删除一条菜品与套餐之间的信息.