使用MapStruct简化Java对象映射

概要

MapStruct是一个基于注解的Java对象映射框架,它通过在编译时生成映射实现代码来避免运行时的反射开销。

为什么要使用MapStruct?

传统方式如使用BeanUtil.copyProperties()通常基于反射机制,虽然在编码上较为便捷,但在性能上存在明显开销。为解决这一问题,MapStruct应运而生。它通过在编译期自动生成类型安全的映射代码,避免了运行时的反射操作,从而显著提升了执行效率,同时也在编译阶段确保了类型安全,极大地提高了开发体验与代码可维护性。

实体类

@Data
public class User {
    private Long id;
    private String username;
    private String email;
    private String password; // 敏感信息,不应暴露给前端
    private Date createTime;
    private Integer status;
}

@Data
public class UserVO {
    private Long id;
    private String username;
    private String email;
    private String createTime; // 格式化为字符串
    private String statusDesc; // 状态码转换为描述
}

MapStruct映射器实现

@Mapper(componentModel = "spring") //spring方式注入
public interface UserMapper {
    UserMapper INSTANCE = Mappers.getMapper(UserMapper.class); //静态注入
    
    @Mapping(target = "password", ignore = true)
    @Mapping(source = "createTime", target = "createTime", dateFormat = "yyyy-MM-dd HH:mm:ss")
    @Mapping(source = "status", target = "statusDesc", qualifiedByName = "statusToDesc")
    UserVO userToUserVO(User user);
    
    List<UserVO> usersToUserVOs(List<User> users);
    
    @Named("statusToDesc")
    static String statusToDesc(Integer status) {
        switch (status) {
            case 0: return "禁用";
            case 1: return "正常";
            case 2: return "锁定";
            default: return "未知";
        }
    }
}

依赖配置

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.5.3.Final</version>
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>1.5.3.Final</version>
    <scope>provided</scope>
</dependency>

实际应用示例

@Service
public class UserService {
    
    @Autowired
    private UserRepository userRepository;
    
    @Autowired
    private UserMapper userMapper;
    
    public List<UserDTO> getAllActiveUsers() {
        List<User> activeUsers = userRepository.findByStatus(1);
        return userMapper.usersToUserVOs(activeUsers);
    }
    
    public UserDTO getUserById(Long id) {
        return userRepository.findById(id)
                .map(userMapper::userToUserVO);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值