首页 > 其他分享 >DTO、对象拷贝——多表查、修改、添加

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

时间:2023-08-19 21:22:04浏览次数:28  
标签:flavors dishDto item 多表查 菜品 dish DTO 拷贝 属性

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

相关文章

  • 浅拷贝和深拷贝
    前言面试的时候经常会问到深拷贝和浅拷贝,那么python的深拷贝和浅拷贝有什么区别呢?思考题先来看2个简单的案例,对元素a/aa重新赋值一个新的变量b/bb后,改变原来a/aa的值,看会不会影响新的变量b/bb的值#1.stra="hello"b=aa="world"print('a:{}'.format(a))......
  • MySQL-基础篇 ( 多表查询:相关 + 内连接 + 外连接 + 自链接 + 联合查询 + 子查询 )
    MySQL-基础篇(多表查询)目录MySQL-基础篇(多表查询)多表查询分类多表关系概述一对多(多对一)多对多一对一多表查询概述笛卡尔积内连接隐式内连接显式内连接外连接左外连接右外连接自连接联合查询-union,unionall子查询标量子查询列子查询行子查询表子查询多表查询案......
  • PWA 应用 addToHomeScreen 功能概述
    PWA,全称为ProgressiveWebApp,即渐进式网页应用。它是一种将网页应用和原生应用相结合的新型应用模式,能够在用户没有安装应用的情况下,提供和原生应用相似的用户体验。在PWA中,addToHomeScreen是一个非常重要的功能。它允许用户将PWA应用添加到设备的主屏幕上,就像添加一个原生......
  • winform编译时怎么把指定dll拷贝到debug里面(非引用)
    选中winform项目-》右键属性-》选择生成事件-》在生成后事件命令行配置以下代码Copy"$(ProjectDir)dll\*.*""$(ProjectDir)$(OutDir)" ......
  • 8.1 C++ STL 变易拷贝算法
    C++STL中的变易算法(ModifyingAlgorithms)是指那些能够修改容器内容的算法,主要用于修改容器中的数据,例如插入、删除、替换等操作。这些算法同样定义在头文件<algorithm>中,它们允许在容器之间进行元素的复制、拷贝、移动等操作,从而可以方便地对容器进行修改和重组。主要包括以下......
  • 8.1 C++ STL 变易拷贝算法
    C++STL中的变易算法(ModifyingAlgorithms)是指那些能够修改容器内容的算法,主要用于修改容器中的数据,例如插入、删除、替换等操作。这些算法同样定义在头文件<algorithm>中,它们允许在容器之间进行元素的复制、拷贝、移动等操作,从而可以方便地对容器进行修改和重组。主要包括以下......
  • 对象拷贝方法
    C#中4种深拷贝方法介绍概述为什么要用到深拷贝呢?比如我们建了某个类Person,并且实例化出一个对象,然后,突然需要把这个对象复制一遍,并且复制出来的对象要跟之前的一模一样,来看下我们一般会怎么做。1、利用反射实现publicstaticTDeepCopy(Tobj){//如果是字符串或值类型则......
  • Python 对象拷贝的详细教程
    在本篇文章中,会先介绍Python中对象的基础概念,之后会提到对象的深浅拷贝以及区别。在阅读后,应该掌握如下的内容:理解变量、引用和对象的关系理解Python对象中identity,type和value的概念什么是mutable和immutable对象?以及它们和hashable的关系深浅拷贝的过程以及区别1.......
  • 解读 --- 对象的深拷贝
    合集-c#基础(12) 1.编码技巧---如何实现字符串运算表达式的计算07-122.编码技巧---同步锁对象的选定07-133.编码技巧---使用dynamic简化反射07-244.编码技巧---谨防闭包陷阱07-195.并发编程---信号量线程同步07-186.并发编程---为何要线程池化07-187.并发编程......
  • 解读 --- 深拷贝
    引言深拷贝是指创建一个新对象,该对象的值与原始对象完全相同,但在内存中具有不同的地址。这意味着如果您对原始对象进行更改,则不会影响到复制的对象常见的C#常见的深拷贝方式有以下4类:各种形式的序列化及反序列化。通过反射机制获取该对象的所有字段和属性信息。遍历所有字段......