在许多项目中都会设计实体对象的转换拷贝,如果字段比较多使用set和get会使代码显得比较臃肿,然而大部分工具类比如:
BeanUtils.copyProperties(user, uForm) 等使用反射原理会大大的影响性能。Mapstruct就很好的解决了性能问题,它的原理就是自动帮我们封装get,set方法。
由于本人使用的是Eclipse,在网上看到许多前辈说eclipse 不会自动生成转换接口mapper的实现类(好像idea会)。所以第一步需要在pom文件中添加
<properties>
<m2e.apt.activation>jdt_apt</m2e.apt.activation>
</properties>
引用它之后在编译时就会自动生成实现类了!!
然后添加pom依赖
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.1.0.Final</version>
<scope>provided</scope>
</dependency>
创建DO以及VO对象
package com.xzs.MapstructDemo;
/**
* DO对象
* @Description:TODO
* @exception:
* @author: 徐正顺
* @time:2017年10月27日 下午5:32:27
*/
public class ObjFrom {
private String name;
private String eName;
private String email;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String geteName() {
return eName;
}
public void seteName(String eName) {
this.eName = eName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package com.xzs.MapstructDemo;
/**
* VO 对象
* @Description:TODO
* @exception:
* @author: 徐正顺
* @time:2017年10月27日 下午5:33:44
*/
public class ObjTo {
private String myname;
private String myEmail;
private int age;
public String getMyname() {
return myname;
}
public void setMyname(String myname) {
this.myname = myname;
}
public String getMyEmail() {
return myEmail;
}
public void setMyEmail(String myEmail) {
this.myEmail = myEmail;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "ObjTo [myname=" + myname + ", myEmail=" + myEmail + ", age=" + age + "]";
}
}
package com.xzs.MapstructDemo;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
/**
* 对象属性值copy mapper
* @Description:TODO
* @exception:
* @author: 徐正顺
* @time:2017年10月27日 下午5:34:55
*/
public interface ObjMapper {
ObjMapper INSTANCE = Mappers.getMapper( ObjMapper.class );
/**
* ObjFrom 自动转换为 ObjTo
* @Description:TODO
* @param from
* @return
* ObjTo
* @exception:
* @author: 徐正顺
* @time:2017年10月27日 下午3:29:44
*
* 使用@Mapping 可以指定不同字段名间的转换(类型必须相同)
* source = "eName" ObjFrom的eName属性值copy到ObjTo的myname值 target = "myname"
*/
@Mapping(source = "eName", target = "myname")
@Mapping(source = "email", target = "myEmail")
ObjTo carToCarDto(ObjFrom from);
}
/** 测试方法
* Mapstruct 对象属性值copy
* @Description:TODO
* void
* @exception:
* @author: 徐正顺
* @time:2017年10月27日 下午3:38:46
*/
@Test
public void contextLoads() {
ObjFrom from =new ObjFrom();
from.seteName("哼哈");
from.seteName("HenHa");
from.setEmail("sb110@xzs.cn");
from.setAge(23);
ObjTo to= ObjMapper .INSTANCE.carToCarDto(from);
System.out.println(to.toString());
}
代码地址:https://github.com/xuzhengshun/ObjConvert