三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

dto 转entity方法

dto 转entity方法

一、正确思路(先记住这句)

Controller 收 DTO → Service 转 Entity → Mapper 写表

永远不要让 DTO 直接进 Mapper。


二、最常用、最推荐的转换方式(✅ 强烈推荐)

✅ 使用BeanUtils.copyProperties

示例场景

DTO(比实体多两个字段)
publicclassUserSaveDTO{privateLonguserId;privateStringuserName;privateStringpassword;// DTO 多出来的字段privateStringconfirmPassword;privateStringcode;}
Entity
publicclassSysUserextendsBaseEntity{privateLonguserId;privateStringuserName;privateStringpassword;}

Service 中转换

@ServicepublicclassSysUserService{publicvoidsaveUser(UserSaveDTOdto){// 1. DTO -> EntitySysUseruser=newSysUser();BeanUtils.copyProperties(dto,user);// 2. 处理多余字段(DTO 有,Entity 没有)user.setCreateTime(newDate());// 3. 入库sysUserMapper.insert(user);}}

只复制同名同类型字段
✅ DTO 多的字段会被自动忽略
✅ 非常干净、可读性高


三、如果字段名不一样怎么办?

DTO

privateStringpwd;

Entity

privateStringpassword;

手动赋值即可

user.setPassword(dto.getPwd());

四、若依官方更优雅的方式(✅ 推荐)

若依里通常会这样写:

SysUseruser=BeanUtils.copyBean(dto,SysUser.class);

或直接封装一个convert方法:

publicclassUserConvert{publicstaticSysUsertoEntity(UserSaveDTOdto){SysUseruser=newSysUser();BeanUtils.copyProperties(dto,user);returnuser;}}

Service 中:

SysUseruser=UserConvert.toEntity(dto);sysUserMapper.insert(user);

✅ 解耦
✅ 好维护
✅ 后期加字段不怕乱


五、DTO 中带“校验字段”的正确处理方式(你现在的场景)

比如:

  • confirmPassword:只做校验
  • code:只做验证码校验
publicvoidsaveUser(UserSaveDTOdto){// 1. 校验 DTOif(!dto.getPassword().equals(dto.getConfirmPassword())){thrownewRuntimeException("两次密码不一致");}// 2. DTO -> EntitySysUseruser=newSysUser();BeanUtils.copyProperties(dto,user);// 3. 入库sysUserMapper.insert(user);}

校验用 DTO
持久化用 Entity
绝不混用


六、❌ 千万不要这样做(反例)

sysUserMapper.insert(dto);// ❌ 错误

❌ DTO 污染数据库
❌ 后期字段变动爆炸
❌ 不符合分层设计


七、进阶:MapStruct(企业级项目)

如果你项目规模大,推荐用MapStruct

@MapperpublicinterfaceUserConvert{SysUsertoEntity(UserSaveDTOdto);}

✅ 编译期生成代码
✅ 性能最好
✅ 类型安全

(若依 Cloud 版就在用)


八、一句话总结

DTO 接前端 → 手动 / BeanUtils 转 Entity → Entity 入库
DTO 多出来的字段,在 Service 里处理或忽略即可

如果你愿意,我可以帮你:

  • 写一个若依风格的 Convert 工具类
  • 看你现在 DTO 的字段,帮你设计最合理的转换方式
  • 讲清楚什么时候用 DTO / VO / Entity

你可以直接把你现在的 DTO 贴出来 👍

← 返回列表