dto 转entity方法

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

✅ Controller 收 DTO → Service 转 Entity → Mapper 写表

永远不要让 DTO 直接进 Mapper。


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

✅ 使用 BeanUtils.copyProperties

示例场景

DTO(比实体多两个字段)
java 复制代码
public class UserSaveDTO {
    private Long userId;
    private String userName;
    private String password;

    // DTO 多出来的字段
    private String confirmPassword;
    private String code;
}
Entity
java 复制代码
public class SysUser extends BaseEntity {
    private Long userId;
    private String userName;
    private String password;
}

Service 中转换

java 复制代码
@Service
public class SysUserService {

    public void saveUser(UserSaveDTO dto) {
        // 1. DTO -> Entity
        SysUser user = new SysUser();
        BeanUtils.copyProperties(dto, user);

        // 2. 处理多余字段(DTO 有,Entity 没有)
        user.setCreateTime(new Date());

        // 3. 入库
        sysUserMapper.insert(user);
    }
}

✅ 只复制同名同类型字段

✅ DTO 多的字段会被自动忽略

✅ 非常干净、可读性高


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

DTO

java 复制代码
private String pwd;

Entity

java 复制代码
private String password;

手动赋值即可

java 复制代码
user.setPassword(dto.getPwd());

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

若依里通常会这样写:

java 复制代码
SysUser user = BeanUtils.copyBean(dto, SysUser.class);

或直接封装一个 convert 方法:

java 复制代码
public class UserConvert {

    public static SysUser toEntity(UserSaveDTO dto) {
        SysUser user = new SysUser();
        BeanUtils.copyProperties(dto, user);
        return user;
    }
}

Service 中:

java 复制代码
SysUser user = UserConvert.toEntity(dto);
sysUserMapper.insert(user);

✅ 解耦

✅ 好维护

✅ 后期加字段不怕乱


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

比如:

  • confirmPassword:只做校验
  • code:只做验证码校验
java 复制代码
public void saveUser(UserSaveDTO dto) {

    // 1. 校验 DTO
    if (!dto.getPassword().equals(dto.getConfirmPassword())) {
        throw new RuntimeException("两次密码不一致");
    }

    // 2. DTO -> Entity
    SysUser user = new SysUser();
    BeanUtils.copyProperties(dto, user);

    // 3. 入库
    sysUserMapper.insert(user);
}

✅ 校验用 DTO

✅ 持久化用 Entity

✅ 绝不混用


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

java 复制代码
sysUserMapper.insert(dto); // ❌ 错误

❌ DTO 污染数据库

❌ 后期字段变动爆炸

❌ 不符合分层设计


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

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

java 复制代码
@Mapper
public interface UserConvert {
    SysUser toEntity(UserSaveDTO dto);
}

✅ 编译期生成代码

✅ 性能最好

✅ 类型安全

(若依 Cloud 版就在用)


八、一句话总结

✅ DTO 接前端 → 手动 / BeanUtils 转 Entity → Entity 入库

✅ DTO 多出来的字段,在 Service 里处理或忽略即可

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

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

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

相关推荐
xiaoye-duck2 分钟前
《C++ 项目:手写大模型接入 SDK》LLMManager架构设计与实现
开发语言·网络·c++·语言模型
一条大祥脚25 分钟前
CuTe 与 CuTe DSL:从 C++ 模板元编程到 Python DSL 的 GPU 编程演进
开发语言·c++·python·cutlass·cute·cute dsl
学长毕设1 小时前
基于SpringBoot的野生动物公益保护平台设计与实现-附源码
java·spring boot·后端
FRing031 小时前
vue2干货总结8(路由模块封装、router-link、声明式导航、路由重定向、编程式导航)
开发语言·前端·vue.js·vue2
旖旎夜光1 小时前
【C++ 基础入门】C++ 多态(上):虚函数、重写、override/final 与抽象类
开发语言·c++·笔记·学习
SL_staff1 小时前
离散制造排程破局:JVS-APS 四步闭环落地实践(开发者视角)
java·产品·全栈
这个昵称不容易2 小时前
SpringBoot 美容院管理系统:232个Java文件315个接口,5套角色从预约到发货一整条链路
java·springboot·毕设
starzy19902 小时前
深入理解Scala嵌套函数:作用域封装之道
开发语言·scala
Sakura_j_h_2 小时前
从零写一个 MCP stdio Server:用 Python 校验博客文章格式
开发语言·python·自动化·ai工具·mcp·json-rpc
装不满的克莱因瓶2 小时前
【SpringAI Alibaba】ReactAgent记忆管理MessageTrimmingHook与MessageDeletionHook
java·人工智能·ai·ai编程·springai·springaialibaba