一、正确思路(先记住这句)
✅ 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 贴出来 👍