本文简单的介绍了当联表查询时,不用联表查询的思想。mybatis-plus处理联表查询,直接封装一个dto类。以及数据库设计方面的小思想~
前言
- 这个瑞吉外卖博客项目系列,用于我个人梳理知识与经验总结,所以写的文章不够体系化,比较零散,大家不喜勿喷😁。
- 接下来几天我将会更新关于mysql、ssm系列知识体系,敬请期待~🤧。
- 后续我也会将我自己打造的博客网站开源在这里,虽然现在已经上线了,但是优化还不够😒。
一、新增菜品
- 在新增菜品中用到了两张表,因为既要考虑菜品的口味、又要保存菜品的基本信息🤷♂️。
- 虽然操作两张表,但是这个项目并没有用到联表查询,而是分别单独操作一张表👻。
- 这也是一种思想,也给了我很大的启发,为了下步我优化个人博客1.0版本做了铺垫🤧。
@Transactional
public void saveWithFlavor(DishDto dishDto) {
//保存菜品的基本信息到菜品表dish
this.save(dishDto);
Long dishId = dishDto.getId(); //菜品id
List<DishFlavor> flavors = dishDto.getFlavors();
flavors = flavors.stream().map((item)-> {
item.setDishId(dishId);
return item;
}).collect(Collectors.toList());
//保存菜品口味数据到菜品口味表dish_flavor
dishFlavorService.saveBatch(flavors);
}
- 同时对于多表需要查出来的数据,都用了JavaBean的思想,单独封装了一个dto类,用来接收dao层的数据。
- 在Controller返回数据类型的时候,都是用的统一RESTful风格,对数据进行了统一的封装,同时还有提示信息,也方便了前后端的处理。
- 前端的每个请求都是通过ajax请求。
二、删除套餐
@Override
@Transactional
public void removeWithDish(List<Long> ids) {
//查询套餐状态,确定是否可用删除
LambdaQueryWrapper<SetMeal> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(SetMeal::getId,ids);
queryWrapper.eq(SetMeal::getStatus,1);
int count = this.count(queryWrapper);
if(count > 0) {
//如果不能删除,抛出一个异常业务异常
throw new CustomException("套餐正在售卖中,不能删除");
}
//如果可以删除,先删除套餐表中的数据
this.removeByIds(ids);
//删除关系表中的数据
LambdaQueryWrapper<SetmealDish> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.in(SetmealDish::getSetmealId,ids);
setMealDishService.remove(lambdaQueryWrapper);
}
- 我就用博客和分类进行举例说明吧。
- 一个标签:Java基础知识。在这个标签下面会有很多个博客,如果我们要直接删除标签那肯定是不行的,这样博客就没有了标签,而直接删除博客却是可以的。
- 这里的数据库设置就是将标签的id保存在博客数据库表中。在我们进行删除的时候需要判断,同时可以定一个异常类。
三、结尾
- 对于瑞吉外卖项目内容就总结这么多,若想深入学习等待后续更新。
- 我将会继续更新关于Java方向的学习知识,感兴趣的小伙伴可以关注一下。
- 文章写得比较走心,用了很长时间,绝对不是copy过来的!
- 尊重每一位学习知识的人,同时也尊重每一位分享知识的人。
- 😎你的点赞与关注,是我努力前行的无限动力。🤩