二、SpringBoot 整合 Mapstuct
阿新 • • 發佈:2018-12-31
(一)為什麼用?
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);
}