機能要件と設計
インターフェース設計:
- IDによる料品の検索
- カテゴリによる分類検索(実装済み)
- ファイルアップロード(実装済み)
- 料品情報の修正
まず、データの表示機能(回显)を実装し、次に修正機能を実装します。
IDによる料品検索
Controller層:
@GetMapping("/{id}")
@ApiOperation("IDで料品を検索")
public Result<DishVO> fetchDishById(@PathVariable Long id){
log.info("IDで料品を検索: {}",id);
DishVO dishVO = dishService.fetchDishWithFlavor(id);
return Result.success(dishVO);
}
Service層:
DishVO fetchDishWithFlavor(Long id);
Service実装:
public DishVO fetchDishWithFlavor(Long id) {
// IDで料品テーブルを検索
Dish dish = dishMapper.findById(id);
// 料品IDに対応する味を検索
List<DishFlavor> dishFlavors = dishFlavorMapper.findFlavorsByDishId(id);
// 検索データをVOに格納
DishVO dishVO = new DishVO();
BeanUtils.copyProperties(dish, dishVO);
dishVO.setFlavors(dishFlavors);
return dishVO;
}
Mapperインターフェース:
@Select("select * from dish_flavor where dish_id = #{dishId}")
List<DishFlavor> findFlavorsByDishId(Long dishId);
料品情報の修正
追加と修正ではデータ形式が同じなので、パラメータもDTOを使用します。
味の修正は複雑で、変更されたもの、追加されたもの、削除されたものがある可能性があります。簡単な方法として、まず既存のデータをすべて削除し、新しいデータを挿入します。
Controller層:
@PutMapping
@ApiOperation("料品情報を修正")
public Result modifyDish(@RequestBody DishDTO dishDTO){
log.info("料品情報を修正: {}",dishDTO);
dishService.updateDishWithFlavor(dishDTO);
return Result.success();
}
Service実装:
public void updateDishWithFlavor(DishDTO dishDTO) {
// 味の修正は複雑 - 変更、追加、削除の可能性がある
// シンプルな方法: まず削除してから再挿入
Dish dish = new Dish();
BeanUtils.copyProperties(dishDTO, dish);
// 料品基本情報を修正
dishMapper.modifyDish(dish);
// 元の味を削除
dishFlavorMapper.removeByDishId(dishDTO.getId());
// 新しい味を挿入
List<DishFlavor> flavors = dishDTO.getFlavors();
if (flavors != null && flavors.size() > 0){
flavors.forEach(flavor -> {
flavor.setDishId(dishDTO.getId());
});
dishFlavorMapper.batchInsert(flavors);
}
}
注: BeanUtils.copyPropertiesの引数順序に注意してください。第一引数の属性値が第二引数にコピーされます。