使用Mapstruct来进行PO与VO之间的映射
区别与mvc模型的 mvvm模型,将模型对象与视图对象view model分离开,来做到与底层model分离开来。大大解耦底层model与界面vo的关系,至此就需要一个工具来做到po与vo分离开来。
最初的想法是使用apache-beanutils 但是其对一些深层次对象拷贝做不到,虽然可以通过改写其内部源码实现对嵌套对象属性拷贝,但是出现特殊业务转换,如 属性名字不匹配,beanutils对于mapstruct就相形见绌了。
话不多说:
maven引入
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.1.0.Final</version>
</dependency>
模拟po对象
public class Person {
private String name;
private Integer age;
private Date birthdate;
private float wallet;
...setter getter
}
创建vo对象
public class PersonVo {
private String name;
private Integer age;
private Date birth;//与po对象属性名不一致
private float wallet;
private String birthformat;//通过po对象的某一属性扩展
...setter getter
}
创建mapstuct 接口
@Mapper
public interface Persion2PersonVoMapper {
Persion2PersonVoMapper MAPPER = Mappers.getMapper(Persion2PersonVoMapper.class);
@Mappings({
@Mapping(source = "birthdate", target = "birth"),//属性名不一致映射
@Mapping(target = "birthformat", expression = "java(org.apache.commons.lang3.time.DateFormatUtils.format(person.getBirthdate(),\"yyyy-MM-dd HH:mm:ss\"))"),//自定义属性通过java代码映射
})
public PersonVo PersonToPersonVo(Person person);
public List<PersonVo> PersonToPersonVos(List<Person> list);
}
创建测试类
public class MapStuctTest {
//单个对象映射
@Test
public void singleTest(){
Person person=new Person("wayne",12,new Date(),12f);
PersonVo personVo = Persion2PersonVoMapper.MAPPER.PersonToPersonVo(person);
Assert.assertTrue(personVo.getName().equals(person.getName()));
Assert.assertTrue(personVo.getAge().equals(person.getAge()));
Assert.assertTrue(personVo