先看看这张图,dto所处位置,主要是用于业务逻辑层service和表示层servlet之间的数据传输
什么是DTO(Data Transfer Object)数据传输对象?
DTO是一个比较特殊的对象,他有两种存在形式:
在后端,他的存在形式是java对象,也就是在controller里面定义的那个东东,通常在后端不需要关心怎么从json转成java对象的,这个都是由一些成熟的框架帮你完成啦,比如spring框架
在前端,他的存在形式通常是js里面的对象(也可以简单理解成json),也就是通过ajax请求的那个数据体。
DTO主要用于服务层与控制层之间的数据传输
DTO只取它所需要的字段,也可以定义需要但是数据库中不存在的数据。
一般我们使用DTO类来继承entity实体类,在DTO类里放一些业务字段,并提供get、set方法。
使用DTO的优点
1.依据现有的类代码,即可方便的构造出DTO对象,而无需重新进行分析。
2.减少请求次数,大大提高效率。
3.按需组织DTO对象,页面需要的字段我才组织,不需要的我不组织,可以避免传输整个表的字段,一定程度上提高了安全性。
DTO转实体类
方法1:
一般来说,在我们实际的开发过程,不能直接使用DTO,要转成实体类才能进行使用。
导入依赖:
<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-jdk8</artifactId> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> </dependency>
在mappers包下创建AdminBankDtoMappers接口
MapStruct之@Mapper注解的用法 - 知乎 (zhihu.com)
@Mapper(componentModel="spring") public interface AdminBankDtoMappers{ AdminBankDtoMappers INSTANCE = Mappers.getMapper(AdminBankDtoMappers.class); //dto转实体类 AdminBank toConverEntity(AdminBankDto source); //实体类转dto AdminBankDto toConverDto(AdminBank source); //泛型转泛型 List<AdminBank> toConverEntity(List<AdminBankDto> source); List<AdminBankDto> toConverDto(List<AdminBank> source); }
如果说mappers第一次编译后,进行第二次编译失败,就需要删除mappers,重新写一个mappers,编译后生成的实现类是在idea中看不到的
编译键:
方法2:
关于Spring中的BeanUtils工具类的说明
Spring--BeanUtils工具类--使用/实例 - 知乎 (zhihu.com)
这里对于商品类型表,货车类型表,商品类型与货车类型关联表进行一个举例,通过前面两张表,生成一个的商品类型的时候,同时也要生成一个商品类型与货车类型关联的字段,这个时候需要用到dto,在这里dto相较于商品类型实体类中多了个货车类型id,体现了dto的优势
- 创建实体类对象
- 将dto的成员对象赋值给实体类,就是将要新增的数据赋值给这个实体类,通过实体类去做操作
- 调用商品类型服务中的新增方法,为什么不用mp中的save方法,是因为mp中的save方法生成的id都是自动增长的那种。自己定义的新增方法中需要使用雪花算法对id进行随机分配,也可以实现save方法进行修改
- 得到商品类型id
- 当货车类型不为空时,调用货车类型与商品类型相关联服务的批量新增方法。从dto里拿到货车类型id,进行stream流处理,通过map把货车类型id与商品类型id关联起来,返回出去,转为list
- 最后把实体类的成员对象赋值给dto,加好货车id与商品id之间的关联后,又赋值回去,再去做下一步的操作
- 最后返回dto
自定义的货物类型新增方法
关于其它的vo,bo,po,do等可以看看知乎的这篇文章