1理论
需求是新增菜品eg:菜名:豆腐脑;口味:甜口,咸口,
菜单表:dish;口味表dish_flavor;
1dto:数据传输对象
新建一个dishDto对象有两个表里的属性
2用到两个表,dish,dish_flavor
flavors返回的是口味的集合,它属于dish_flavor表。1是豆腐脑,多是甜口,咸口。
2代码实现:
1建一个dishDto的对象,包含了两个表里用到的属性。
@Data
public class DishDto extends Dish {private List<DishFlavor> flavors = new ArrayList<>();//口味表返回的口味集合private String categoryName;private Integer copies;
}
2在dish的service接口层写保存新增菜品的方法。
3在它的实现类里实现该方法saveWithFlavor(DishDto dishDto)
在菜品DishServiceImpl里注入口味的DishFlavorService;
@Autowired
private DishFlavorService dishFlavorService;
有多表操作,用了事务,@Transactional,要在启动类里加@EnableTransactionManagement激活
@Service
public class DishServiceImpl extends ServiceImpl<DishMapper, Dish> implements DishService {//多张表的操作,加入事务控制@Autowiredprivate DishFlavorService dishFlavorService;/*** 新增菜品同时保存口味数据** @param dishDto*/@Override@Transactionalpublic void saveWithFlavor(DishDto dishDto) {
//保存菜品的基本信息到菜品表dish,this.save(dishDto);Long dishId = dishDto.getId();//菜品的idList<DishFlavor> flavors = dishDto.getFlavors();//菜品口味
// 处理元素并赋值flavors = flavors.stream().map((item) -> {item.setDishId(dishId);return item;}).collect(Collectors.toList());//java8新特性stream流的使用//保存菜品口味数据到菜品口味表dish_flavor}
}
4Controller层
@Slf4j
@RestController
@RequestMapping("/dish")
public class DishController {@Autowiredprivate DishService dishService;@Autowiredprivate DishFlavorService dishFlavorService;@PostMappingpublic R<String> save(@RequestBody DishDto dishDto){//dto对象dishService.saveWithFlavor(dishDto);//调用事务方法return R.success("新增菜品成功");}
总结:
多表调用,建立dto,返回口味数据用集合接收,遍历口味,赋值给菜品。具体实现在业务层写了,也可以在sql里写。