mapstruct的使用


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());
            }

        }
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM