1. 程式人生 > >【泛型】一個簡易的物件間轉換的工具類(DO轉VO)

【泛型】一個簡易的物件間轉換的工具類(DO轉VO)

最近專案中經常要將資料庫中查出來的DO類轉換為VO類,之前的做法是每個都對應一個XXConverter,重複程式碼把人寫的精疲力竭,於是開發瞭如下工具類。

首先,直接看工具類程式碼:

public class BaseConverter<DO, VO> {
    private static final Logger logger = LoggerFactory.getLogger(BaseConverter.class);

    /**
     * 單個物件轉換
     */
    public VO convert(DO from, Class<VO> clazz) {
        if
(from == null) { return null; } VO to = null; try { to = clazz.newInstance(); } catch (Exception e) { logger.error("初始化{}物件失敗。", clazz, e); } convert(from, to); return to; } /** * 批量物件轉換 */ public
List<VO> convert(List<DO> fromList, Class<VO> clazz) { if (CollectionUtils.isEmpty(fromList)) { return null; } List<VO> toList = new ArrayList<VO>(); for (DO from : fromList) { toList.add(convert(from, clazz)); } return
toList; } /** * 屬性拷貝方法,有特殊需求時子類覆寫此方法 */ protected void convert(DO from, VO to) { BeanUtils.copyProperties(from, to); } }

工具類利用泛型來實現單個和批量物件的屬性拷貝,留下一個用於過載的方法void convert(DO from, VO to)來在屬性名或屬性型別不一致時覆寫做特殊處理。

下面來新建一個DO和一個VO,省略getter和setter方法如下:

public class PersonDO {
    /** 姓名 */
    private String name;
    /** 生日 */
    private Date   birthDate;

    public PersonDO() {
    }

    public PersonDO(String name, Date birthDate) {
        this.name = name;
        this.birthDate = birthDate;
    }
}
public class PersonVO {
    /** 姓名 */
    private String name;
    /** 生日 */
    private String birthDate;

    @Override
    public String toString() {
        return "PersonVO{" + "name='" + name + '\'' + ", birthDate='" + birthDate + '\'' + '}';
    }
}

下面看轉換器PersonConverter寫法:

public class PersonConverter extends BaseConverter<PersonDO, PersonVO> {
    @Override
    protected void convert(PersonDO from, PersonVO to) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        to.setBirthDate(simpleDateFormat.format(from.getBirthDate()));
        super.convert(from, to);
    }
}

可見轉換器程式碼相當簡潔,只是重寫了convert格式化了以下出生日期,下面寫個main方法測試一下:

public static void main(String[] args) {
    PersonConverter converter = new PersonConverter();
    List<PersonDO> fromList = new ArrayList<PersonDO>();
    fromList.add(new  PersonDO("test1", new Date()));
    fromList.add(new  PersonDO("test2", new Date()));
    List<PersonVO> toList = converter.convert(fromList, PersonVO.class);
    for (PersonVO personVO : toList) {
        System.out.println(personVO);
    }
}

執行結果:

PersonVO{name='test1', birthDate='2017-02-09'}
PersonVO{name='test2', birthDate='2017-02-09'}

可見物件成功轉換了,通過繼承BaseConverter可以省去很多程式碼,避免寫重複程式碼的噁心感。

我的部落格:blog.scarlettbai.com

相關推薦

一個簡易物件轉換工具(DOVO)

最近專案中經常要將資料庫中查出來的DO類轉換為VO類,之前的做法是每個都對應一個XXConverter,重複程式碼把人寫的精疲力竭,於是開發瞭如下工具類。 首先,直接看工具類程式碼: public class BaseConverter<D

Generic

cas 不同 源碼 膨脹 關於 比較 pro -o 微軟雅黑 參考:http://blog.csdn.net/lonelyroamer/article/details/7864531#commentshttp://blog.csdn.net/lonelyroamer/art

java基礎-中級(二)

目錄 2、泛型 2.1 泛型方法 2.2 泛型類 2.3 泛型介面 2.4 泛型的約束與侷限 2.5 泛型型別繼承規則  2.6 Class<T> 2、泛型 Java 泛型(generics)是 JDK 5 中引入的一個新特性, 泛型

《瘋狂Java講義(第4版)》-----第9章

把物件放入Java集合中,編譯的時候都會當成Object型別(執行時還是原來的實際型別),各種物件都可以放入集合,但是帶來的問題是從集合中取物件的時候可能要進行強制型別轉換了。如果集合中放了各種物件,特別是集合元素沒有順序的話,程式設計師只知道當初放進去很多型別

第9章

nbsp 方法重載 ext 泛型 color 方法 推斷 bsp 深入 第9章【泛型】 泛型入門   編譯時不檢查類型的異常   使用泛型   Java7 泛型的“菱形”語法 深入泛型 定義泛型接口、類

微服務應用大行其道,我提供一個dto和entity轉換工具,方便大家做轉換,少寫機械程式碼,多陪陪家人

微服務應用大行其道,我提供一個dto和entity轉換工具類,方便大家做轉換,少寫機械程式碼,多陪陪家人。 該工具類主要是對do

一個例項中所有屬性值賦給另一個同類物件+Linq

public static class ClassCopy { static ConcurrentDictionary<string, object> actions = new ConcurrentDictionary<string, object>(

集合叠代器、增強for、

ons ati 並發 abs 發牌 是什麽 調用 private while java.util.Collection接口 是集合的最頂層的接口,定義了集合共性的方法 接口無法直接創建對象,使用多態的方式創建對象 Collection<集合中的數據類型(泛型)>

java一個小例子

  首先要了解什麼是多型? :在面嚮物件語言中,介面的多種不同的實現方式即為多型。具體來說,就是不同子類作為引數使用同一父類的方法 時的實現方法是不同的。   多型的表現形式有哪些? 1.過載overload,是發生在同一類裡的。 標識一個函式除了函式名外,還有函式的引數(

Java反射技術2個物件除了名不一樣,的定義部分完全一樣;當給定一個物件轉換成另一個物件

1.需求 有時候,在專案開發時候會遇到,特別是Web專案開發,本地工程有一個類A,web工程根據配置檔案會自動生成另外一個class B,而A和B除了類名不同, 其他諸如成員變數以及get\set方法都是相同的(就像下面的Objec1和Object2兩個類一樣),這時候,就

both methods have same erasure, yet neither overrides the other 型別擦除與過載和覆蓋問題

先看一段程式碼public class Father { void test(Object o){} } class Son<T> extends Father{ voi

maven打包時出現java source 1.3中不支援 請使用 -source 5 或更高版本以啟用錯誤時的解決方法

出現【java source 1.3中不支援泛型 請使用 -source 5 或更高版本以啟用泛型】問題的原因是因為jdk版本使用不對,maven編譯打包時找到的是低版本的jdk,可以在總pom中新增以下語句顯示指明使用版本為1.6的jdk即可解決這個問題 <buil

——這才真正的理解你

前言: 曾記得那是機房重構,曾記得那是剛剛聽說有泛型這個東西,曾記得自己實現了datatable轉泛型的例項,而面對泛型,只知道它像一個集合一樣,儲存著資訊。然而,今天對於泛型的認識,讓我認識到了什

HDU 3853 LOOPS:期望dp網格

clu pre 答案 blog printf iostream memset 題意 一個 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=3853 題意:   有一個n*m的網格。   給出在每個格子時:留在原地、向右走一格,向

BZOJ 1616 [Usaco2008 Mar]Cow Travelling遊蕩的奶牛:dp網格

網格 code pac ble () mil 上下 cout 可能 題目鏈接:http://www.lydsy.com/JudgeOnline/problem.php?id=1616 題意:   有一個n*m的網格。   ‘.‘表示平坦的草地,‘*‘表示擋路的樹(不能走)。

C#設計模式之八橋接模式(Bridge)結構

升級 方向 implement 詳細 .cn mage names 這樣的 意圖 一、引言 今天我們要講【結構型】設計模式的第二個模式,該模式是【橋接模式】,也有叫【橋模式】的。大家第一次看到這個名稱會想到什麽呢?我第一次看到這個模式根據名稱猜肯定是連接什麽東西的。因為

計算機網絡 一個小白的DNS學習筆記 (>﹏<)

網絡 relay 自己的 使用 source media top img rdquo 參考書籍 《計算機網絡-自頂向下》 作者 James F. Kurose DNS的作用 DNS是因特網的目錄服務 DNS是因特網的目錄服務,它提供了主機名到IP地址映

算法一個小白的算法筆記:堆排序 (>д<)

根節點 節點和 -- 樹形 new 示例 () 是否 family 參考資料 《算法(第4版)》 — — Robert Sedgewick, Kevin Wayne 什麽是二叉堆 在了解堆排序之前,

算法一個小白的算法筆記: 歸並排序算法的編碼和優化 (,,? ? ?,,)

oid pub 大小 角色 bcd 存在 ffd return 實現 參考資料 《算法(第4版)》 — — Robert Sedgewick, Kevin Wayne 歸並排序的概念 歸並排序的實現我是這樣來描述的:先對

C#設計模式之十二代理模式(Proxy Pattern)結構

ride col 安全 .html 使用權 防火墻 一對多 tro 橋接 原文:C#設計模式之十二代理模式(Proxy Pattern)【結構型】一、引言 今天我們要講【結構型】設計模式的第七個模式,也是“結構型”設計模式中的最後一個模式,該模式是【代理模式】,英文名稱