问题介绍一:一个分页查询方法,前端页面需要展示菜品信息(dish表),和菜品类型id信息(categoryId),但是菜品类型类中的菜品分类属性字段,菜品表中没有,所以使用DTO类,将两类信息保存到一个DTO类中。
1、DishDto类
其中该类继承Dish,所以有Dish类中的所有字段属性,本身自带categoryName属性与List<DishFlavor>类型的flavors属性,在这个问题中与List<DishFlavor>类型的flavors属性没关系。
2、分页查询方法
public R<Page> page(int page, int pageSize, String name){ log.info("得到了:page={},pageSize={},name={}",page,pageSize,name); //构造分页构造器 Page<Dish> dishPageInfo=new Page(page,pageSize); //构造条件构造器 LambdaQueryWrapper<Dish> queryWrapper=new LambdaQueryWrapper(); //添加过滤条件 queryWrapper.like(name!=null,Dish::getName,name); //添加排序条件 queryWrapper.orderByDesc(Dish::getUpdateTime); //执行查询 dishService.page(dishPageInfo,queryWrapper); /* 上面根据条件查询得到的dish数据中不能返回,因为缺少菜品分类属性,所以需要我们进行修改 */ /* 下面创建一个Page<DishDto> 类型的分页构造器,通过BeanUtils.copyProperties方法,将page类中对于 分页等相关信息copy过去。但是dishDtoPage对象中还有别的属性没赋值,比如菜品分类信息,还有dish相关 展示信息。dish相关信息都存储在Page类中records属性当中,代表着在前端页面展示的每一行数据。 */ Page<DishDto> dishDtoPage=new Page<>(); BeanUtils.copyProperties(dishPageInfo,dishDtoPage,"records"); /* 下面我们先得到records,也就是dish相关的基本属性,然后再将dish相关属性copy到dishDto类的对象当中 但是我们还缺少菜品分类属性,所以我们先从records中得到categoryId,然后在通过Id去找到对应的菜品分 类名称属性,再将该属性赋值到dishDto对象当中,最终封装为list集合,再将封装好装到dishDtoPage的Records 属性中,然后返回到前端页面 */ List<Dish> records=dishPageInfo.getRecords(); List<DishDto> list=records.stream().map((item)->{ DishDto dishDto=new DishDto(); //这里item是records集合中的对象,类型是Dish,将item对象赋值给dishDto对象 BeanUtils.copyProperties(item,dishDto); //这里通过item对象得到菜品类型id Long categoryId=item.getCategoryId(); //根据id查询菜品分类表,得到菜品分类对象 Category category=categoryService.getById(categoryId); //只要能查到才执行 if(category!=null){ //将菜品分类对象中的菜品分类名称得到 String categoryName=category.getName(); //然后将分类名称传递给dishDto对象 dishDto.setCategoryName(categoryName); } //做完上面一系列之后,dishDto对象中既有了dish对象中属性值,也有了categoryName属性值。 return dishDto; }).collect(Collectors.toList());//最后将这一个个DishDto对象装进list集合中 //将封装好的DishDto集合装进dishDtoPage的records中 dishDtoPage.setRecords(list); //返回 return R.success(dishDtoPage); }
3、前端展示页面
问题介绍二:根据id查询菜品信息和对应菜品口味表的信息(关于两张表的查询),将信息返回到前端页面。
1、Dto类
2、查询方法
@Override public DishDto getByIdWithFlavor(Long id) { //查询菜品基本信息,从dish表查询 Dish dish=this.getById(id); //因为除了查询菜品的基本信息,还要去口味表中根据dishId去查找对应口味 DishDto dishDto=new DishDto(); BeanUtils.copyProperties(dish,dishDto); //查询当前菜品对应的口味信息,从dish_flavor表查询 LambdaQueryWrapper<DishFlavor> queryWrapper=new LambdaQueryWrapper<>(); queryWrapper.eq(DishFlavor::getDishId,dish.getId()); List<DishFlavor> flavors=dishFlavorService.list(queryWrapper); dishDto.setFlavors(flavors); return dishDto; }
3、前端页面展示
问题介绍三:将前段菜品信息以及菜品口味信息保存到对应的两个表中
1、Dto类
2、添加方法
注意同时对两个表的添加、删除、修改等操作,要加事务。
@Transactional public void saveWithFlavor(DishDto dishDto) { //保存菜品的基本信息到菜品表dish //这个this指的是DishServiceImpl类对象,该对象又实现DishService,继承ServiceImpl<DishMapper, Dish> //所以可以使用mp中save方法 this.save(dishDto); //这个id是经过MP保存之后生成的 Long dishId=dishDto.getId();//菜品id //但是此时只保存了dish表中的属性,下面还需要将dishDto中关于菜品口味表中的属性保存 //菜品口味 List<DishFlavor> flavors=dishDto.getFlavors(); //注意上面只有Flavors的数据,没有dishId数据,而dish_flavors数据库表中有,所以我们需要将该dishId数据 //传入flavors集合中,然后在保存到flavors表中 flavors=flavors.stream().map((item)->{ item.setDishId(dishId); return item; }).collect(Collectors.toList()); //保存菜品口味到菜品口味表dish_flavor, dishFlavorService.saveBatch(flavors); }
问题介绍四:将前端菜品信息以及对应的菜品口味信息进行修改
1、Dto类
2、添加方法
注意同时对两个表的添加、删除、修改等操作,要加事务。
@Override @Transactional public void updateWithFlavor(DishDto dishDto) { //更新菜品表 this.updateById(dishDto); //清理当前菜品对应口味数据——dish_flavors表的删除操作 LambdaQueryWrapper<DishFlavor> queryWrapper=new LambdaQueryWrapper<>(); queryWrapper.eq(DishFlavor::getDishId,dishDto.getId()); dishFlavorService.remove(queryWrapper); //添加当前提交过来的口味数据——dish_flavors表的添加操作 //这里更上面新增一样,除了将口味数据修改,还要将菜品的ID传到口味表中去 List<DishFlavor> flavors=dishDto.getFlavors(); flavors=flavors.stream().map((item)->{ item.setDishId(dishDto.getId()); return item; }).collect(Collectors.toList()); dishFlavorService.saveBatch(flavors); }
标签:flavors,dishDto,item,多表查,菜品,dish,DTO,拷贝,属性 From: https://www.cnblogs.com/xdqx/p/17643129.html