在牛某网看见了牛肉哥的帖子之后,打算向牛肉大佬学习,故开始书写优快云博客,通过博客的方式来巩固自身知识学习。
因为之前有粗略的学习了Java Web的基础课程,所以博客内容主要是巩固之前学习当中的模糊点,以及一些自己认为重要的内容,用于自己进一步的掌握开发技能。
内容:
-
新增套餐
-
分页查询套餐
-
删除套餐
-
修改套餐
-
启动与停售套餐
新增套餐:
@Override
@Transactional
public void saveWithDish(SetmealDTO setmealDTO) {
Setmeal setmeal = new Setmeal();
BeanUtils.copyProperties(setmealDTO, setmeal);
//setmealDTO 中存在但 setmeal 中没有的属性,会被直接忽略,不会对 setmeal 产生任何影响。
setmealMapper.insert(setmeal);
Long setmealId = setmeal.getId();
//1. 初始化 setmeal → id = null
//2. BeanUtils 拷贝 DTO → id 仍为 null(DTO 里的 setmealId 无效)
//3. 调用 setmealMapper.insert(setmeal) →
// a. 数据库/后端生成有效 id(比如 1001)
// b. MyBatis 自动把 1001 回写到 setmeal 的 id 字段
//4. 执行 Long setmealId = setmeal.getId() → 拿到 1001(有效值)
List<SetmealDish> setmealDishes = setmealDTO.getSetmealDishes();
//由于get到除了setmealid的信息,所以需要遍历进行补足
setmealDishes.forEach(setmealDish -> {
setmealDish.setSetmealId(setmealId);
});
setmealDishMapper.insertBatch(setmealDTO.getSetmealDishes());
}
- setmealDTO 中存在但 setmeal 中没有的属性,会被直接忽略,不会对 setmeal 产生任何影响。
- 1. 初始化 setmeal → id = null
- 2. BeanUtils 拷贝 DTO → id 仍为 null(DTO 里的 setmealId 无效)
- 3. 调用 setmealMapper.insert(setmeal) →
- a. 数据库/后端生成有效 id(比如 1001)
- b. MyBatis 自动把 有效id 回写到 setmeal 的 id 字段
- 4. 执行 Long setmealId = setmeal.getId() → 拿到 有效id(有效值)
- 由于get到除了setmealid的信息,所以需要遍历进行补足
分页查询套餐:
<select id="pageQuery" resultType="com.sky.vo.SetmealVO">
select s.*, c.name as categoryName from setmeal as s left outer join category as c on s.category_id =c.id
<where>
<if test="categoryId !=null ">
and s.category_id=#{categoryId}
</if>
<if test="name !=null">
and s.name like concat('%',#{name},'%')
</if>
<if test="status !=null ">
and s.status=#{status}
</if>
</where>
order by s.create_time desc
</select>
注意点:
<if>:if里要写明是谁的字段:例如:and s.name
删除套餐:
@DeleteMapping
@ApiOperation("删除套餐")
public Result deleteBatch(@RequestParam List<Long> ids) {
log.info("删除套餐:{}",ids);
setmealService.deleteBatch(ids);
return Result.success();
}
注意点:
请求参数名要保持一致,同时要加上@RequestParam来将string型ids变为List<Long>型。
@Override
@Transactional
public void deleteBatch(List<Long> ids) {
ids.forEach( id -> {
Setmeal setmeal = setmealMapper.getById(id);
if(setmeal.getStatus() == StatusConstant.ENABLE){
throw new DeletionNotAllowedException(MessageConstant.SETMEAL_ON_SALE);
}
});
//先删除掉setmeal_dish表的数据
setmealDishMapper.deleteByIds(ids);
//再删除掉setmeal表里的套餐
setmealMapper.deleteByIds(ids);
}
注意点:
删除操作前要记住先检查售卖情况,遍历操作是ids,foreach
修改套餐:
@Transactional
@Override
public void update(SetmealDTO setmealDTO) {
//先删除掉setmeal_dish里的原套餐内容
Long setmealId = setmealDTO.getId();
setmealDishMapper.deleteById(setmealId);
//再插入进去新的数据
List<SetmealDish> setmealDishes = setmealDTO.getSetmealDishes();
if (setmealDishes != null && setmealDishes.size() > 0){
setmealDishes.forEach(setmealDish -> {
setmealDish.setSetmealId(setmealId);
});
}
setmealDishMapper.insertBatch(setmealDishes);
Setmeal setmeal=new Setmeal();
BeanUtils.copyProperties(setmealDTO, setmeal);
//再更新setmeal表里的数据
setmealMapper.update(setmeal);
}
启动与停售套餐:
@Override
public void startOrStop(Integer status, Long id) {
//起售套餐时,判断套餐内是否有停售菜品,有停售菜品提示"套餐内包含未启售菜品,无法启售"
//通过套餐菜品表联系到菜品表,通过套餐id得到套餐菜品id,从而去菜品表里查status
List<SetmealDish> setmealDishes =setmealDishMapper.getBySetmealId(id);
setmealDishes.forEach(setmealDish -> {
Long dishId=setmealDish.getDishId();
Dish dish=dishMapper.getById(dishId);
if(dish.getStatus() == StatusConstant.DISABLE){
throw new SetmealEnableFailedException(MessageConstant.SETMEAL_ENABLE_FAILED);
}
});
Setmeal setmeal = Setmeal.builder()
.id(id)
.status(status)
.build();
setmealMapper.update(setmeal);
}
@Transactional
@Override
public void startOrStop(Integer status, Long id) {
//起售套餐时,判断套餐内是否有停售菜品,有停售菜品提示"套餐内包含未启售菜品,无法启售"
if(status == StatusConstant.ENABLE){
//select a.* from dish a left join setmeal_dish b on a.id = b.dish_id where b.setmeal_id = ?
List<Dish> dishList = dishMapper.getBySetmealId(id);
if(dishList != null && dishList.size() > 0){
dishList.forEach(dish -> {
if(StatusConstant.DISABLE == dish.getStatus()){
throw new SetmealEnableFailedException(MessageConstant.SETMEAL_ENABLE_FAILED);
}
});
}
}
Setmeal setmeal = Setmeal.builder()
.id(id)
.status(status)
.build();
setmealMapper.update(setmeal);
}
注意点:
第一种没有第二种的效果好:
- 如果套餐内有停售菜品,直接抛出
- 提前校验能避免无效操作
1万+

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



