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

Java對象字段拷貝最佳實踐分享

 更新時間:2025年03月03日 08:29:15   作者:碼農(nóng)研究僧  
文章介紹了幾種常見的對象字段拷貝方法,包括手動set、BeanUtils.copyProperties、Lombok的@Builder和MapStruct,每種方法都有其優(yōu)缺點和適用場景,推薦使用MapStruct,因為它在編譯期生成代碼,性能最優(yōu),支持復雜對象映射,需要的朋友可以參考下

前言

一開始在線表和歷史表都是一張表,只不過字段設置不一樣,顯示不一樣

但后續(xù)數(shù)據(jù)越來越多,為了不影響在線表,數(shù)據(jù)最終得落入歷史表,不影響在線表的CRUD

以下章節(jié)圍繞如何克隆在線表的數(shù)據(jù)

對象字段拷貝 的需求,比如從數(shù)據(jù)庫查詢出的對象需要轉換成 DTO,或者在審核流程中更新一張表的同時寫入歷史表等

如果手動 set 字段,代碼會變得繁瑣,難以維護

1. 傳統(tǒng)set(不推薦)

最簡單的方法是 手動賦值,但是當字段較多時,代碼冗長且容易遺漏。

示例代碼:

CheckBoxDetailDO checkBoxDetailDO = new CheckBoxDetailDO();
checkBoxDetailDO.setCheckStatus(1L);
checkBoxDetailDO.setCntr(checkBox.getCntr());
checkBoxDetailDO.setImgCntrF(checkBox.getImgCntrF());
checkBoxDetailDO.setCreateTime(checkBox.getCreateTime());

缺點:

  • 代碼冗長:如果 CheckBoxDO有幾十個字段,手寫 set 非常麻煩
  • 易出錯:如果 CheckBoxDO結構變化,必須手動修改所有 set 邏輯,維護成本高

適用場景:

字段較少(少于 3 個字段)

除了set,還有一種跟他很像,我也放在這個章節(jié)

Lombok 的 @Builder,可以使用 builder() 方法來 鏈式賦值,提高可讀性(但我感覺沒啥差異)

CheckBoxDetailDO checkBoxDetailDO = CheckBoxDetailDO.builder()
        .checkStatus(1L)
        .cntr(checkBox.getCntr())
        .imgCntrF(checkBox.getImgCntrF())
        .createTime(checkBox.getCreateTime())
        .build();

2. copyProperties(有局限)

CheckBoxDetailDO checkBoxDetailDO = new CheckBoxDetailDO();
BeanUtils.copyProperties(checkBox, checkBoxDetailDO);
checkBoxDetailDO.setCheckStatus(1L); // 額外賦值

優(yōu)點:

  • 代碼簡潔,自動拷貝 相同字段,避免手動 set
  • 無需額外依賴,Spring 內置

缺點:

  • 性能一般,使用了 反射,比手動 set 慢
  • 字段名必須完全匹配,如果 CheckBoxDetailDO 和 CheckBoxDO字段名不一樣,無法拷貝
  • 不支持復雜轉換,比如 數(shù)據(jù)類型不同(int vs String)、默認值設置 等

適用場景:

  • 字段名和類型完全匹配的簡單拷貝
  • 項目已經(jīng)使用 Spring,避免額外依賴

3. MapStruct(推薦)

如果 CheckBoxDO和 CheckBoxDetailDO 結構類似,并且字段較多,推薦使用 MapStruct 進行自動對象映射
MapStruct 在編譯期生成代碼,相比 BeanUtils 性能更優(yōu),并且支持字段轉換

1、定義轉換接口

創(chuàng)建一個 Mapper 接口,并用 @Mapper 注解標識。

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper(componentModel = "spring")
public interface CheckBoxConverter {
    CheckBoxConverter INSTANCE = Mappers.getMapper(CheckBoxConverter.class);

    @Mapping(target = "checkStatus", constant = "1L") // 強制設定 checkStatus 為 1
    CheckBoxDetailDO toDetailDO(CheckBoxDO checkBox);
}

2、調用轉換

@Resource
private ChekBoxDetailMapper chekBoxDetailMapper;

CheckBoxDetailDO checkBoxDetailDO = CheckBoxConverter.INSTANCE.toDetailDO(checkBox);
chekBoxDetailMapper.insert(checkBoxDetailDO);

優(yōu)點:

  • 高性能,編譯期生成代碼,沒有反射開銷
  • 自動映射字段,省去 set 代碼
  • 支持類型轉換,例如 String -> Long、Date -> LocalDateTime 等
  • 字段名不同也能映射,可以用 @Mapping(source = “oldField”, target = “newField”) 自定義映射關系

缺點:

需要引入 MapStruct 依賴,但一次配置,終身受益

適用場景:

  • 字段較多且映射規(guī)則較復雜
  • 項目對性能要求較高(比 BeanUtils 更快)

但是會有bug:

后續(xù)發(fā)現(xiàn)id自增字段也被復刻了!

采取忽略的方式:

@Mapper
public interface CheckBoxConverter {
    CheckBoxConverter INSTANCE = Mappers.getMapper(CheckBoxConverter.class);

    @Mapping(target = "id", ignore = true) // 忽略 id 字段
    @Mapping(target = "checkStatus", constant = "1L") // 強制設定 checkStatus 為 1
    CheckBoxDetailDO toDetailDO(CheckBoxDO checkBox);
}

截圖如下:

這里拓展下這種方式其他的知識點:

使用 @BeanMapping(ignoreByDefault = true)(僅拷貝指定字段)

類似如下代碼:

@Mapper(componentModel = "spring")
public interface CheckBoxConverter {
    CheckBoxConverter INSTANCE = Mappers.getMapper(CheckBoxConverter.class);

    @BeanMapping(ignoreByDefault = true)
    @Mapping(target = "cntr", source = "cntr")
    @Mapping(target = "imgCntrF", source = "imgCntrF")
    @Mapping(target = "createTime", source = "createTime")
    @Mapping(target = "checkStatus", constant = "1L")
    CheckBoxDetailDO toDetailDO(CheckBox checkBox);
}

如果不想修改代碼:

CheckBoxDetailDO checkBoxDetailDO = CheckBoxConverter.INSTANCE.toDetailDO(checkBox);
checkBoxDetailDO.setId(null); // 手動清除 id

最后,不要忘記insert,否則它只是一個對象,沒有存儲

CheckBoxDetailDO checkBoxDetailDO = CheckBoxConverter.INSTANCE.toDetailDO(checkBox);
checkBoxDetailMapper.insert(checkBoxDetailDO); // 插入數(shù)據(jù)庫

4. 總結

方案代碼簡潔度性能適用場景
手動 set? 差?
BeanUtils.copyProperties? 好?一般字段完全匹配,簡單拷貝
Lombok @Builder? 好? 快代碼可讀性強,構建新對象
MapStruct? 最優(yōu)? 最優(yōu)復雜對象映射,性能高

以上就是Java對象字段拷貝最佳實踐分享的詳細內容,更多關于Java對象字段拷貝的資料請關注腳本之家其它相關文章!

相關文章

  • Spring?Boot網(wǎng)絡配置之server.address超詳細講解

    Spring?Boot網(wǎng)絡配置之server.address超詳細講解

    在Spring Boot中,我們可以通過配置server.address屬性來指定應用程序綁定的IP地址,下面這篇文章主要介紹了Spring?Boot網(wǎng)絡配置之server.address的相關資料,需要的朋友可以參考下
    2025-09-09
  • Java中的CopyOnWriteArrayList原理詳解

    Java中的CopyOnWriteArrayList原理詳解

    這篇文章主要介紹了Java中的CopyOnWriteArrayList原理詳解,如源碼所示,CopyOnWriteArrayList和ArrayList一樣,都在內部維護了一個數(shù)組,操作CopyOnWriteArrayList其實就是在操作內部的數(shù)組,需要的朋友可以參考下
    2023-12-12
  • Spring?Cloud整合XXL-Job的示例代碼

    Spring?Cloud整合XXL-Job的示例代碼

    這篇文章主要介紹了springcloud整合xxl-job的示例代碼,主要分為四個過程,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • Springboot多數(shù)據(jù)源配置之整合dynamic-datasource方式

    Springboot多數(shù)據(jù)源配置之整合dynamic-datasource方式

    這篇文章主要介紹了Springboot多數(shù)據(jù)源配置之整合dynamic-datasource方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java接口回調和方法回調的簡單實現(xiàn)步驟

    Java接口回調和方法回調的簡單實現(xiàn)步驟

    這篇文章主要介紹了Java接口回調和方法回調的相關資料,接口回調是一種設計模式,實現(xiàn)三方解耦,調用者提供接口實現(xiàn),文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-03-03
  • 利用POI讀取word、Excel文件的最佳實踐教程

    利用POI讀取word、Excel文件的最佳實踐教程

    Apache POI 是用Java編寫的免費開源的跨平臺的 Java API,Apache POI提供API給Java程式對Microsoft Office格式檔案讀和寫的功能。 下面這篇文章主要給大家介紹了關于利用POI讀取word、Excel文件的最佳實踐的相關資料,需要的朋友可以參考下。
    2017-11-11
  • IDEA使用GsonFormat完成JSON和JavaBean之間的轉換

    IDEA使用GsonFormat完成JSON和JavaBean之間的轉換

    這篇文章主要介紹了IDEA使用GsonFormat完成JSON和JavaBean之間的轉換,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • 如何合理管控Java語言的異常

    如何合理管控Java語言的異常

    這篇文章主要介紹了如何合理管控Java語言的異常問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • 詳解Java中restTemplate的使用

    詳解Java中restTemplate的使用

    這篇文章主要為大家詳細介紹了Java中restTemplate用法的相關資料,文中的示例代碼講解詳細,對我們學習Java有一定的幫助,需要的可以參考一下
    2022-11-11
  • Java讀取圖片EXIF信息的方法

    Java讀取圖片EXIF信息的方法

    這篇文章主要介紹了Java讀取圖片EXIF信息的方法,較為詳細的分析了圖片EXIF信息的概念、功能及java讀取EXIF信息的實現(xiàn)技巧,需要的朋友可以參考下
    2015-07-07

最新評論

漳州市| 北票市| 富平县| 扶沟县| 大埔区| 积石山| 洛扎县| 历史| 陵川县| 龙南县| 金华市| 日照市| 神农架林区| 诸暨市| 清水河县| 永泰县| 车险| 伽师县| 香格里拉县| 曲松县| 抚远县| 元谋县| 武城县| 北辰区| 扶绥县| 五常市| 浦北县| 榆树市| 武隆县| 湾仔区| 深圳市| 石景山区| 罗江县| 怀仁县| 娄底市| 杂多县| 孝感市| 德令哈市| 义乌市| 禹城市| 贵港市|