1. 程式人生 > >二、SpringBoot 整合 Mapstuct

二、SpringBoot 整合 Mapstuct

(一)為什麼用?

   apache-beanutils 可以實現物件拷貝,但是其對一些深層次物件拷貝做不到,雖然可以通過改寫其內部原始碼實現對巢狀物件屬性拷貝,但是出現特殊業務轉換,如 屬性名字不匹配,beanutils對於mapstruct就相形見絀了。

(2)怎麼用

1、新增依賴

		<!-- Mapstruct PO 和 DTO 轉換工具 -->
		<dependency>
			<groupId>org.mapstruct</groupId>
			<artifactId>mapstruct</
artifactId
>
<version>1.2.0.Final</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.2.0.Final</version> <scope>provided</scope> </dependency
>
<!-- 案例中需要用到的工具類 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency>

2、準備 POJO 和 DTO

User

@Data
@NoArgsConstructor
public class User implements Serializable {
    private BigInteger id;
private String name; private Integer age; private Date birthdate; private float wallet; }

UserDto

@Data
@NoArgsConstructor
public class UserDto {
    private String name;
    private Integer age;
    //與po物件屬性名不一致
    private Date birth;
    private float wallet;
    //通過po物件的某一屬性擴充套件
    private String birthformat;
}

3、編寫轉換介面

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
import org.pc.mongodb.dto.UserDto;
import org.pc.mongodb.entity.User;

import java.util.List;

/**
 * @author 鹹魚
 * @date 2018/12/13 19:59
 */
@Mapper
public interface User2UserDto {
    User2UserDto MAPPER = Mappers.getMapper(User2UserDto.class);

    /**
     * POJO 轉 DTO
     * 備註:只有屬性名不一樣的才需要單獨寫出來
     */
    @Mappings({
            @Mapping(target = "birth", source = "birthdate"),
            @Mapping(target = "birthformat", expression = "java(org.apache.commons.lang3.time.DateFormatUtils.format(user.getBirthdate(),\"yyyy-MM-dd HH:mm:ss\"))")
    })
    UserDto userToUserDto(User user);

    /**
     * 集合轉集合
     */
    List<UserDto> usersToUserDtos(List<User> users);
}

(1) POJO 轉 DTO

 /**
     * POJO 轉 DTO
     * 備註:只有屬性名不一樣的才需要單獨寫出來
     */
    @Mappings({
            @Mapping(target = "birth", source = "birthdate"),
            @Mapping(target = "birthformat", expression = "java(org.apache.commons.lang3.time.DateFormatUtils.format(user.getBirthdate(),\"yyyy-MM-dd HH:mm:ss\"))")
    })
    UserDto userToUserDto(User user);

    /**
     * POJO集合 轉 DTO集合
     */
    List<UserDto> usersToUserDtos(List<User> users);

驗證:

public class Demo {
    public static void main(String[] args) {
        User user = new User();
        user.setId(BigInteger.valueOf(1));
        user.setName("pc");
        user.setAge(25);
        user.setBirthdate(new Date());
        user.setWallet(1.3467f);
        
        UserDto userDto = User2UserDto.MAPPER.userToUserDto(user);
        System.out.println(userDto);
    }
}

(2)DTO 轉 POJO

	/**
     * DTO  轉 POJO
     */
    @InheritInverseConfiguration
    User userDtoToUser(UserDto userDto);

(3)自定義轉義

  自定義特殊轉義,比如對於 float 型別,四捨五入,保留兩位小數

public class MapStructUtils {
    /**
     * 四捨五入,保留2位小數
     */
    public float asFloat(float inputFloat){
        BigDecimal bigDecimal = new BigDecimal(inputFloat + "");
        return bigDecimal.setScale(2, RoundingMode.HALF_UP).floatValue();
    }
}

mapper上面添加註解

//uses = MapStructUtils.class:會將所有的浮點數,四捨五入,保留2位小數
@Mapper(uses = MapStructUtils.class)
public interface User2UserDto {
...
}

(4)map 對映

 @MapMapping(valueDateFormat ="yyyy-MM-dd HH:mm:ss")
 public Map<String ,String> DateMapToStringMap(Map<String,Date> sourceMap);

驗證

 public void mapMappingTest(){
        Map<String,Date> map=new HashMap<>();
        map.put("key1",new Date());
        map.put("key2",new Date(new Date().getTime()+9800000));
        Map<String, String> stringObjectMap = Person2PersonVoMapper.MAPPER.DateMapToStringMap(map);
    }