1. mapstruct的優點: 在編譯期生成接口 的實現類,實現類中就是重寫了接口方法,方法 中使用的是get,set操作,相比BeanUtil,PropertiesUtil,Cglib的BeanCopier的優點也就在於不用再賦值期間使用反射來賦值。記住一句話: set,get賦值是最快的。mapstruct 就可以幫助我們生成繁瑣的get,set操作的代碼,而且 還能判斷是否為null,為null,則不賦值。
2. 添加依賴
<properties>
<java.version>1.8</java.version>
<org.mapstruct.version>1.3.0.Final</org.mapstruct.version>
</properties>
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
</dependencies>
3.創建接口類
package com.ws;
import com.ws.mybatis.model.UserInfo;
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;
import org.mapstruct.NullValuePropertyMappingStrategy;
/**
* @author :wangsun
* @date :Created in 2020/10/20 17:25
* @project : mybatis-test
* @package : com.ws
* @description: NullValuePropertyMappingStrategy 是增加null值的判斷策略
*/
@Mapper(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
public interface UserCopier {
// 創建一個新的對象,並將參數中的對象的值賦值給新對象
UserInfo cp2UserInfo(UserInfo userInfo);
// 將 對象b賦值給對象a
void updateAFromB(UserInfo b, @MappingTarget UserInfo a);
}
4. 測試類
@Test
public void testBeanCopyByMapWithoutNull(){
UserInfo userInfo = new UserInfo();
userInfo.setId(1);
userInfo.setAddress("單獨");
UserInfo newUserInfo = new UserInfo();
newUserInfo.setAge(1);
newUserInfo.setPhone("2156345");
UserCopier mapper = Mappers.getMapper(UserCopier.class);
mapper.updateAFromB(userInfo,newUserInfo);
System.out.println("newUser is "+newUserInfo.toString());
System.out.println("userInfo is "+userInfo.toString());
}
5. 編譯工具生成的實現類,不用自己手寫,這步才是真的減輕我們的工作量
注意: a.setId(b.getId()); id 會直接賦值,,在真實業務場景中要注意id覆蓋的問題。
package com.ws;
import com.ws.mybatis.model.UserInfo;
public class UserCopierImpl implements UserCopier {
public UserCopierImpl() {
}
public UserInfo cp2UserInfo(UserInfo userInfo) {
if (userInfo == null) {
return null;
} else {
UserInfo userInfo1 = new UserInfo();
userInfo1.setId(userInfo.getId());
userInfo1.setNameStr(userInfo.getNameStr());
userInfo1.setAge(userInfo.getAge());
userInfo1.setSalary(userInfo.getSalary());
userInfo1.setAddress(userInfo.getAddress());
userInfo1.setPhone(userInfo.getPhone());
userInfo1.setUpdateTime(userInfo.getUpdateTime());
userInfo1.setUpdateLongTime(userInfo.getUpdateLongTime());
return userInfo1;
}
}
public void updateAFromB(UserInfo b, UserInfo a) {
if (b != null) {
a.setId(b.getId());
if (b.getNameStr() != null) {
a.setNameStr(b.getNameStr());
}
if (b.getAge() != null) {
a.setAge(b.getAge());
}
if (b.getSalary() != null) {
a.setSalary(b.getSalary());
}
if (b.getAddress() != null) {
a.setAddress(b.getAddress());
}
if (b.getPhone() != null) {
a.setPhone(b.getPhone());
}
if (b.getUpdateTime() != null) {
a.setUpdateTime(b.getUpdateTime());
}
if (b.getUpdateLongTime() != null) {
a.setUpdateLongTime(b.getUpdateLongTime());
}
}
}
}