Dto和Entity如何优雅的相互转换

摘要:
什么是Dto,Entity,用来干什么?这个时候就有一个麻烦事,Entity和Dto的互转。通常的转换方法有两个途径,一个是通过反射的方式,来进行对象属性的复制;另一种是,通过硬编码进行对象属性的赋值;1.在service层中添加实体类转换函数@ServicepublicMyEntityService{publicSomeDtogetEntityById{SomeEntitydbResult=someDao.findById;SomeDtodtoResult=convert;//...morelogichappensreturndtoResult;}publicSomeDtoconvert{//...Objectcreationandusinggetter/setterforconverting}}2.在各自的实体类中添加转换函数publicclassSomeDto{//...someattributespublicSomeDto{this.attribute=entity.getAttribute();//...nestingconvertion&convertionoflistsandarrays}}3.通过反射的方式来进行,目前有common-beanutils,或者springframework的beanutils,或者modelmapper进行更复杂的定制。

什么是Dto,Entity,用来干什么?

Dto data transfer object 数据传输实体,主要用于数据传输的实体模型;
Entity 持久层的领域模型;
当我在做分布式微服务的时候,通常是用Entity来做持久层的实体类,Dto来做接口传输的实体类。这个时候就有一个麻烦事,Entity和Dto的互转。通常的转换方法有两个途径,一个是通过反射的方式,来进行对象属性的复制;另一种是,通过硬编码进行对象属性的赋值;

1. 在service层中添加实体类转换函数
@Service
public MyEntityService {

  public SomeDto getEntityById(Long id){
    SomeEntity dbResult = someDao.findById(id);
    SomeDto dtoResult = convert(dbResult);
    // ... more logic happens
    return dtoResult;
  }

  public SomeDto convert(SomeEntity entity){
   //... Object creation and using getter/setter for converting
  }
}
2. 在各自的实体类中添加转换函数
public class SomeDto {

 // ... some attributes

 public SomeDto(SomeEntity entity) {
  this.attribute = entity.getAttribute();
  // ... nesting convertion & convertion of lists and arrays
 }

}

3. 通过反射的方式来进行,目前有common-beanutils,或者springframework的beanutils,或者modelmapper进行更复杂的定制。这样做得有点就是完全没有额外的编码负担,且通用性强;但是缺点是,性能很低(这里可能比硬编码的转换方式多上100倍时间左右)所以对于大数据量的转换,或者对反应时间敏感的场景,请不要使用;
ModelMapper modelMapper = new ModelMapper();
UserDTO userDTO = modelMapper.map(user, UserDTO.class);
4. 通过mapstruct在编译阶段,创建一个convert类,来进行转化,优点是自动代码生成,转换效率优良;缺点是虽然省略的硬编码,但是每个实体都需要写一个转换接口,着实不是很优雅。
@Mapper
public interface SheetConverter {

    @Mappings({})
    SheetDto sheetToSheetDto(Sheet sheet);

    @Mappings({})
    Sheet sheetDtoToSheet(SheetDto sheetDto);
}

免责声明:文章转载自《Dto和Entity如何优雅的相互转换》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JavaScript算法学习:获取字符串最后一位方法及判断是否以指定字符串开始或结尾MySQL 字段类型占用空间下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MyBatis学习4---使用MyBatis_Generator生成Dto、Dao、Mapping

由于MyBatis属于一种半自动的ORM框架,所以主要的工作将是书写Mapping映射文件,但是由于手写映射文件很容易出错,所以查资料发现有现成的工具可以自动生成底层模型类、Dao接口类甚至Mapping映射文件。 一、建立表结构 CREATE TABLE `user` (`id` varchar(50) NOT NULL,`username` varch...

UML类图一

转自:http://blog.csdn.net/lovelion/article/details/7838679 类图用于描述系统中所包含的类以及它们之间的相互关系,帮助人们简化对系统的理解,它是系统分析和设计阶段的重要产物,也是系统编码和测试的重要模型依据。 1.类 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性、操作、关系...

hibernate自动建表

x'ml配置文件 <!-- 扫描所有实体类 --> <property name="packagesToScan"> <list> <value>com.fit.core.pojo</value>...

浅入 ABP 系列(7):对象映射

目录 基础 DTO和实体 麻烦的映射 AutoMapper 集成 IObjectMapper/ObjectMapper 对象拓展 写博客的过程中,发现很多基础理论太薄弱,因此很多专业词汇可能会解释错误或者不准确,建议读者多参考官方文档或者其它书籍。 本篇主要讲解 ABP 中如何配置、使用对象映射,其中大部分跟 AutoMapper 这个框架有...

Swagger学习笔记

查看swagger教学视频,请点击 《狂神说java》: https://www.bilibili.com/video/BV1Y441197Lw?p=1 记得投币三连呀~~ Swagger 学习目标: 了解Swagger的作用和概念 了解前后端分离 在SpringBoot中继承Swagger Swagger简介 前后端分离 Vue + SpringBo...

Green.AgileMapper项目(2)新增DO和DTO代码生成

     如果你还不了解Green.AgileMapper的用意,作用请先一步到上篇Green.AgileMapper开源项目的使用,如果你觉得运行时(Runtime)的Mapper效率存在问题,在这个版本中有了更新,新增了C#直接代码的生成,这里的生成都已3.0后的扩展方法实现,你可以很方便的一句代码实现两者的转化。     代码生成我本想利用T4模板,...