MapStruct使用方法

目前代码中对象的copy大家使用的基本都是spring提供的BeanUtils.copyProperties,但是这个方法的实现都是基于反射,性能差而且容易出异常,很多规范严禁使用这种途径。效率最高的还是传统的get、set方法类似这种,但是这种方法重复又无聊,那么有什么方法可以解决呢?
我们可以试试MapStruct:
1.引入依赖

1.3.1.Final


org.mapstruct
mapstruct
m a p s t r u c t . v e r s i o n < / v e r s i o n > < s c o p e > c o m p i l e < / s c o p e > < / d e p e n d e n c y > < d e p e n d e n c y > < g r o u p I d > o r g . m a p s t r u c t < / g r o u p I d > < a r t i f a c t I d > m a p s t r u c t − p r o c e s s o r < / a r t i f a c t I d > < v e r s i o n > {mapstruct.version} compile org.mapstruct mapstruct-processor mapstruct.version</version><scope>compile</scope></dependency><dependency><groupId>org.mapstruct</groupId><artifactId>mapstructprocessor</artifactId><version>{mapstruct.version}
compile

2.User和UserDTO的转换,我们定义一个UserConvertMapper接口
@Mapper
public interface UserConvertMapper {

UserConvertMapper INSTANCE = Mappers.getMapper( UserConvertMapper.class );

//如果字段不一致也可以加映射关系
@Mappings ({@Mapping(target = "phone", source = "telNum")
})    
UserDTO UserToUserDTO(User user);

List UsersToUserDTOs(List users);

}

3.使用方法:
UserDTO userdto = UserDAOMapper.INSTANCE.UserToUserDTO(user);
List userDTOs = UserDAOMapper.INSTANCE.UsersToUserDTOs(list);

4.原理分析:MapStruct是一个代码生成器,它基于约定优先于配置的方法,极大地简化了javabean类型之间映射的实现。多层应用程序通常需要在不同的对象模型(例如实体和DTO)之间进行映射,编写这样的映射代码是一项乏味且容易出错的任务。MapStruct旨在通过尽可能自动化来简化这项工作。
与其他映射框架相比,MapStruct在编译时生成bean映射,这确保了高性能。在编译过程中,MapStruct将生成该接口的实现。此实现使用纯Java的方法调用源对象和目标对象之间进行映射,并非Java反射机制。编译后在target\generated-sources\annotations下的子目录发现生成了一个实现类,可以等价为我们手写。
public class UserDAOMapperImpl implements UserDAOMapper {

@Override
public UserDTO UserToUserDTO(User user) {
    if ( user == null ) {
        return null;
    }

    UserDTO userDTO = new UserDTO();

    userDTO.setPhone( user.getTelNum() );
    userDTO.setId( user.getId() );
    userDTO.setAge( user.getAge() );
    userDTO.setEmail( user.getEmail() );
    List list = user.getList();
    if ( list != null ) {
        userDTO.setList( new ArrayList( list ) );
    }

    return userDTO;
}

@Override
public List UsersToUserDTOs(List users) {
    if ( users == null ) {
        return null;
    }

    List list = new ArrayList( users.size() );
    for ( User user : users ) {
        list.add( UserToUserDto( user ) );
    }

    return list;
}

}

你可能感兴趣的:(java基础)