欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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 {
    //默認寫法 調(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 {
    //默認寫法 調(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 {
    //默認寫法 調(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)文章

  • Spring配置多數(shù)據(jù)源切換

    Spring配置多數(shù)據(jù)源切換

    今天小編就為大家分享一篇關(guān)于Spring配置多數(shù)據(jù)源切換,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • MyBatis傳遞多個參數(shù)方式

    MyBatis傳遞多個參數(shù)方式

    這篇文章主要介紹了MyBatis傳遞多個參數(shù)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • JavaSwing FlowLayout 流式布局的實現(xiàn)

    JavaSwing FlowLayout 流式布局的實現(xiàn)

    這篇文章主要介紹了JavaSwing FlowLayout 流式布局的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 詳談java命令的本質(zhì)邏輯揭秘

    詳談java命令的本質(zhì)邏輯揭秘

    一個簡單的java命令背后究竟做了些什么事情,很多朋友提出幾個問題,下面帶領(lǐng)大家一起學(xué)習(xí)Java命令的本質(zhì)邏輯問題,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • 使用IDEA查看jar包及jar包的正確打開方式

    使用IDEA查看jar包及jar包的正確打開方式

    IDEA 是把 jar 包添加為 Libraries,然后展開后即可查看,因為是編譯后的 class 文件,所以注釋是沒有的,今天小編給大家介紹下使用IDEA查看jar包及jar包的正確打開方式,感興趣的朋友一起看看吧
    2023-07-07
  • IDEA報錯:Process terminated的問題及解決

    IDEA報錯:Process terminated的問題及解決

    這篇文章主要介紹了IDEA報錯:Process terminated的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java多線程中Callable和Future的解讀

    Java多線程中Callable和Future的解讀

    這篇文章主要介紹了Java多線程中Callable和Future的解讀,Callable接口類似于Runnable,從名字就可以看出來了,但是Runnable不會返回結(jié)果,并且無法拋出返回結(jié)果的異常,而Callable功能更強大一些,被線程執(zhí)行后,可以返回值,這個返回值可以被Future拿到,需要的朋友可以參考下
    2023-09-09
  • JDK21無法導(dǎo)入TimeUnit類的解決辦法

    JDK21無法導(dǎo)入TimeUnit類的解決辦法

    這篇文章主要給大家介紹了關(guān)于JDK21無法導(dǎo)入TimeUnit類的解決辦法,TimeUnit是java.util.concurrent包下面的一個類,TimeUnit提供了可讀性更好的線程暫停操作,通常用來替換Thread.sleep(),需要的朋友可以參考下
    2024-01-01
  • 淺談Java變量賦值運算符及相關(guān)實例

    淺談Java變量賦值運算符及相關(guān)實例

    這篇文章主要介紹了Java賦值運算符的一些知識,需要的朋友可以參考下。
    2017-09-09
  • Spring Bean配置方式總結(jié)

    Spring Bean配置方式總結(jié)

    定義Spring Bcan的3種方式分別是:基于XML 的方式配置、基于注解掃播方式配置、基于元數(shù)據(jù)類的配置,本文就通過代碼示例給大家詳細講講這三種配置方式,需要的朋友可以參考下
    2023-12-12

最新評論