DTO、对象拷贝——多表查、修改、添加

发布时间 2023-08-19 21:19:48作者: 小徐同学x

问题介绍一:一个分页查询方法,前端页面需要展示菜品信息(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);
    }