最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot + MapStruct 屬性映射工具的使用詳解

 更新時間:2021年09月18日 08:39:33   作者:機智的爆爆哥  
MapStruct 是一個代碼生成器,簡化了不同的 Java Bean 之間映射的處理,所謂的映射指的就是從一個實體變化成一個實體。接下來通過本文給大家介紹SpringBoot + MapStruct 屬性映射工具的使用,需要的朋友可以參考下

1. MapStruct 是什么?

截取下官方的原話 我給翻譯了一下 說白了 當(dāng)你的對象A有幾十個屬性 而另一個對象B 與A比較只有一些細微的差別

那么這時候只需要映射過去即可 而不需要瘋狂的調(diào)用set方法 進行屬性的拷貝 這就是這個工具給我們帶來的最大便利

官方github鏈接 點擊跳轉(zhuǎn)

2. 引入依賴

采用Mapstruct的 最新版本 1.4.2.Final

SpringBoot版本不要選新版的 我對比了下 2.3.02.5.4 后者會出現(xiàn)屬性映射為null的情況

已經(jīng)將問題反饋了 具體不知道是和原因 所以先用老版本吧

下面的插件最好與我的保持一致 否則會導(dǎo)致一些問題

 <properties>
        <java.version>1.8</java.version>
        <mapstruct.version>1.4.2.Final</mapstruct.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>${mapstruct.version}</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <annotationProcessorPaths>
                        <!-- 引入 mapstruct-processor -->
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>${mapstruct.version}</version>
                        </path>
                        <!-- 引入 lombok-processor -->
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>${lombok.version}</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>
    </build>

3.當(dāng)兩個對象屬性完全相同時 User 類

新建 User 類 隨便加點屬性進去

@Data
@Accessors(chain = true)
public class User {

    private String name;
    private String password;
    private String money;
}

UserVo 類

再新建一個我們需要拷貝過去的對象 UserVo 屬性完全相同

@Data
@Accessors(chain = true)
public class UserVo {

    private String name;
    private String password;
    private String money;
}

轉(zhuǎn)換接口 UserConvert

@Mapper// 注意 這里的注解是org.mapstruct包下的
public interface UserConvert {
    //默認(rèn)寫法 調(diào)用getMapper 獲取對應(yīng)的實體類 編譯后會生成對應(yīng)的實現(xiàn)類
    UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);

    UserVo convert(User user);
}

我們將代碼編譯一下 在 target目錄下 找到對應(yīng)的實現(xiàn)類 UserConvertImpl

可以發(fā)現(xiàn)他其實就是將對應(yīng)的屬性設(shè)置到了 Vo對象中罷了 只不過這是自動生成的

public class UserConvertImpl implements UserConvert {
    public UserConvertImpl() {
    }

    public UserVo convert(User user) {
        if (user == null) {
            return null;
        } else {
            UserVo userVo = new UserVo();
            userVo.setName(user.getName());
            userVo.setPassword(user.getPassword());
            userVo.setMoney(user.getMoney());
            return userVo;
        }
    }
}

測試屬性賦值

在對應(yīng)的測試類里 轉(zhuǎn)化打印

    @Test
    void contextLoads() {
        User user = new User().setName("爆爆").setPassword("123").setMoney("500");
        UserVo userVo = UserConvert.INSTANCE.convert(user);
        System.out.println(userVo);
    }

打印結(jié)果如下

UserVo(name=爆爆, password=123, money=500)

4. 當(dāng)對象屬性有所差別時 UserVo2

對應(yīng)的User 不變 新增 一個 UserVo2

將原先的name改成了UserName

@Data
@Accessors(chain = true)
public class UserVo2 {
    //name--->userName
    private String userName;
    private String password;
    private String money;
}

這時候我們要將User的屬性值直接賦予 其實是不會報錯的 只不過name不會映射給UserName 而已

修改轉(zhuǎn)換類

@Mapper// 注意 這里的注解是org.mapstruct包下的
public interface UserConvert {
    //默認(rèn)寫法 調(diào)用getMapper 獲取對應(yīng)的實體類 編譯后會生成對應(yīng)的實現(xiàn)類
    UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);

    UserVo convert(User user);
	//新增一個方法
    UserVo2 convert2(User user);

}

再次測試

@Test
    void contextLoads() {
        User user = new User().setName("爆爆").setPassword("123").setMoney("500");
        UserVo2 userVo2 = UserConvert.INSTANCE.convert2(user);
        System.out.println(userVo2);
    }

打印結(jié)果

UserVo2(userName=null, password=123, money=500)

如果要要將 name 賦值給 userName 其實也很簡單 操作如下

新增 @Mappings@Mapping注解 指明對應(yīng)哪個屬性賦值給哪個就可以了

@Mapper// 注意 這里的注解是org.mapstruct包下的
public interface UserConvert {
    //默認(rèn)寫法 調(diào)用getMapper 獲取對應(yīng)的實體類 編譯后會生成對應(yīng)的實現(xiàn)類
    UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);

    UserVo convert(User user);

    @Mappings({
            //對應(yīng) source指向的是User targer指向的是UserVo2
            @Mapping(source = "name",target = "userName")
    })
    UserVo2 convert2(User user);

}

再次運行測試類

打印結(jié)果 發(fā)現(xiàn)沒有問題

UserVo2(userName=爆爆, password=123, money=500)

5. IDEA插件

mapstrut有對應(yīng)的idea插件 其實我覺得作用一般吧 還是放上吧

插件鏈接

由于自己研究的也不多 暫時寫到這里

我們執(zhí)著于那些遺憾,并非那些事情有多重要,而是那些時光里的自己,是真誠坦率且可愛的,也許這才是我們執(zhí)著的意義。

到此這篇關(guān)于SpringBoot + MapStruct 屬性映射工具的使用的文章就介紹到這了,更多相關(guān)SpringBoot屬性映射工具內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Java讀取Word文件的簡單例子分享

    使用Java讀取Word文件的簡單例子分享

    這篇文章主要介紹了使用Java讀取Word文件的簡單例子分享,包括讀取word文件的表格數(shù)據(jù)的示例,需要的朋友可以參考下
    2015-10-10
  • 教你Java中的Lock鎖底層AQS到底是如何實現(xiàn)的

    教你Java中的Lock鎖底層AQS到底是如何實現(xiàn)的

    本文是基于ReentrantLock來講解,ReentrantLock加鎖只是對AQS的api的調(diào)用,底層的鎖的狀態(tài)(state)和其他線程等待(Node雙向鏈表)的過程其實是由AQS來維護的,對Java?Lock鎖AQS實現(xiàn)過程感興趣的朋友一起看看吧
    2022-05-05
  • Springboot中yml文件沒有葉子圖標(biāo)的解決

    Springboot中yml文件沒有葉子圖標(biāo)的解決

    這篇文章主要介紹了Springboot中yml文件沒有葉子圖標(biāo)的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • java實現(xiàn)登錄之后抓取數(shù)據(jù)

    java實現(xiàn)登錄之后抓取數(shù)據(jù)

    這篇文章給大家分享了用JAVA實現(xiàn)在登陸以后抓取網(wǎng)站的數(shù)據(jù)的相關(guān)知識,有興趣的朋友可以測試參考下。
    2018-07-07
  • Java設(shè)計模式之迭代器模式

    Java設(shè)計模式之迭代器模式

    這篇文章介紹了Java設(shè)計模式之迭代器模式,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • Maven中plugins與pluginManagement的區(qū)別說明

    Maven中plugins與pluginManagement的區(qū)別說明

    這篇文章主要介紹了Maven中plugins與pluginManagement的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • java實現(xiàn)同步的幾種方式(示例詳解)

    java實現(xiàn)同步的幾種方式(示例詳解)

    這篇文章主要介紹了java實現(xiàn)同步的幾種方式,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2024-12-12
  • 案例講解SpringBoot?Starter的使用教程

    案例講解SpringBoot?Starter的使用教程

    SpringBoot中的starter是一種非常重要的機制,能夠拋棄以前繁雜的配置,將其統(tǒng)一集成進starter,應(yīng)用者只需要在maven中引入starter依賴,SpringBoot就能自動掃描到要加載的信息并啟動相應(yīng)的默認(rèn)配置,本文通過案例講解SpringBoot?Starter的使用,感興趣的朋友一起看看吧
    2023-12-12
  • Spring?Cache抽象-使用SpEL表達式解析

    Spring?Cache抽象-使用SpEL表達式解析

    這篇文章主要介紹了Spring?Cache抽象-使用SpEL表達式解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 如何使用CountDownLatch同步j(luò)ava多線程

    如何使用CountDownLatch同步j(luò)ava多線程

    這篇文章主要介紹了如何使用CountDownLatch同步j(luò)ava多線程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08

最新評論

永昌县| 方正县| 吉首市| 临沂市| 青龙| 宁乡县| 苗栗县| 靖宇县| 来宾市| 合水县| 微山县| 安仁县| 江永县| 攀枝花市| 芷江| 安庆市| 灵璧县| 双流县| 衢州市| 垦利县| 登封市| 闽侯县| 潜山县| 疏附县| 凌云县| 如皋市| 和田县| 盱眙县| 新丰县| 瓦房店市| 深水埗区| 华坪县| 屏山县| 衡阳县| 哈巴河县| 德化县| 肇庆市| 东乡| 浏阳市| 毕节市| 东宁县|