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

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

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

1. MapStruct 是什么?

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

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

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

2. 引入依賴

采用Mapstruct的 最新版本 1.4.2.Final

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

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

下面的插件最好與我的保持一致 否則會(huì)導(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)兩個(gè)對(duì)象屬性完全相同時(shí) User 類

新建 User 類 隨便加點(diǎn)屬性進(jìn)去

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

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

UserVo 類

再新建一個(gè)我們需要拷貝過去的對(duì)象 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 獲取對(duì)應(yīng)的實(shí)體類 編譯后會(huì)生成對(duì)應(yīng)的實(shí)現(xiàn)類
    UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);

    UserVo convert(User user);
}

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

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

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

測試屬性賦值

在對(duì)應(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)對(duì)象屬性有所差別時(shí) UserVo2

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

將原先的name改成了UserName

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

這時(shí)候我們要將User的屬性值直接賦予 其實(shí)是不會(huì)報(bào)錯(cuò)的 只不過name不會(huì)映射給UserName 而已

修改轉(zhuǎn)換類

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

    UserVo convert(User user);
	//新增一個(gè)方法
    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 其實(shí)也很簡單 操作如下

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

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

    UserVo convert(User user);

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

}

再次運(yùn)行測試類

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

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

5. IDEA插件

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

插件鏈接

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

我們執(zhí)著于那些遺憾,并非那些事情有多重要,而是那些時(shí)光里的自己,是真誠坦率且可愛的,也許這才是我們執(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)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • MyBatis傳遞多個(gè)參數(shù)方式

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

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

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

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

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

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

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

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

    IDEA報(bào)錯(cuò):Process terminated的問題及解決

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

    Java多線程中Callable和Future的解讀

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

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

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

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

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

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

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

最新評(píng)論