概要
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);
}
}
8059

被折叠的 条评论
为什么被折叠?



