一款I(lǐng)DEA插件神器,幫你一鍵轉(zhuǎn)換DTO、VO、BO、PO、DO
點(diǎn)擊下方“IT牧場”,選擇“設(shè)為星標(biāo)”

1、什么是DTO、VO、BO、PO、DO、POJO
POJO的定義是無規(guī)則簡單的對象,在日常的代碼分層中pojo會被分為VO、BO、 PO、 DTO
VO (view object/value object)表示層對象
1、前端展示的數(shù)據(jù),在接口數(shù)據(jù)返回給前端的時候需要轉(zhuǎn)成VO
2、個人理解使用場景,接口層服務(wù)中,將DTO轉(zhuǎn)成VO,返回給前臺
B0(bussines object)業(yè)務(wù)層對象
1、主要在服務(wù)內(nèi)部使用的業(yè)務(wù)對象
2、可以包含多個對象,可以用于對象的聚合操作
3、個人理解使用場景,在服務(wù)層服務(wù)中,由DTO轉(zhuǎn)成BO然后進(jìn)行業(yè)務(wù)處理后,轉(zhuǎn)成DTO返回到接口層
PO(persistent object)持久對象
1、出現(xiàn)位置為數(shù)據(jù)庫數(shù)據(jù),用來存儲數(shù)據(jù)庫提取的數(shù)據(jù)
2、只存儲數(shù)據(jù),不包含數(shù)據(jù)操作
3、個人理解使用場景,在數(shù)據(jù)庫層中,獲取的數(shù)據(jù)庫數(shù)據(jù)存儲到PO中,然后轉(zhuǎn)為DTO返回到服務(wù)層中
DTO(Data Transfer Object)數(shù)據(jù)傳輸對象
1、在服務(wù)間的調(diào)用中,傳輸?shù)臄?shù)據(jù)對象
2、個人理解,DTO是可以存在于各層服務(wù)中(接口、服務(wù)、數(shù)據(jù)庫等等)服務(wù)間的交互使用DTO來解耦
DO(domain object)領(lǐng)域?qū)嶓w對象
DO 現(xiàn)在主要有兩個版本:
①阿里巴巴的開發(fā)手冊中的定義,DO( Data Object)這個等同于上面的PO
②DDD(Domain-Driven Design)領(lǐng)域驅(qū)動設(shè)計(jì)中,DO(Domain Object)這個等同于上面的BO
參考文檔:
https://juejin.cn/post/6952848675924082718 https://juejin.cn/post/6844904046097072141 https://zhuanlan.zhihu.com/p/264675395
2、插件如何完成轉(zhuǎn)化
插件名稱:Simple Object Copy
1、定義方法出入?yún)?/p>
2、光標(biāo)定位方法內(nèi),使用快捷鍵ALT+INSERT(WIN) 、 command + N(mac) ,或者右鍵鼠標(biāo)選擇Generate,彈出生成選項(xiàng)框后,選擇genCopyMethod,代碼就生成好了


復(fù)雜對象轉(zhuǎn)化展示

代碼展示:
@Data
public?class?UserVO?{
private?String?name;
private?Date?entryDate;
private?String?userId;
private?List?roleList;
private?RoomVO?room;
public?static?UserVO?convertToUserVO(UserDTO?item)?{
????if?(item?==?null)?{
????????return?null;
????}
????UserVO?result?=?new?UserVO();
????result.setName(item.getName());
????result.setEntryDate(item.getEntryDate());
????result.setUserId(item.getUserId());
????List?roleList?=?item.getRoleList();
????if?(roleList?==?null)?{
????????result.setRoleList(null);
????}?else?{
?result.setRoleList(roleList.stream().map(UserVO::convertToRoleVO).collect(Collectors.toList());
????}
????result.setRoom(convertToRoomVO(item.getRoom()));
????return?result;
}
public?static?RoomVO?convertToRoomVO(RoomDTO?item)?{
????if?(item?==?null)?{
????????return?null;
????}
????RoomVO?result?=?new?RoomVO();
????result.setRoomId(item.getRoomId());
????result.setBuildingId(item.getBuildingId());
????result.setRoomName();
????result.setBuildingName();
????return?result;
}
public?static?RoleVO?convertToRoleVO(RoleDTO?item)?{
????if?(item?==?null)?{
????????return?null;
????}
????RoleVO?result?=?new?RoleVO();
????result.setRoleId(item.getRoleId());
????result.setRoleName(item.getRoleName());
????result.setCreateTime(item.getCreateTime());
????return?result;
}
}
@Data
public?class?UserDTO?{
private?String?name;
private?Date?entryDate;
private?String?userId;
private?List?roleList;
private?RoomDTO?room;
}
@Data
public?class?RoleVO?{
private?String?roleId;
private?String?roleName;
private?LocalDateTime?createTime;
}
@Data
public?class?RoleDTO?{
private?String?roleId;
private?String?roleName;
private?LocalDateTime?createTime;
}
@Data
public?class?RoomVO?{
private?String?roomId;
private?String?buildingId;
private?String?roomName;
private?String?buildingName;
}
@Data
public?class?RoomDTO?{
private?String?roomId;
private?String?buildingId;
}
3、其他轉(zhuǎn)化方式
1.無入侵
市面上有很多類似的工具類,比較常用的有
Spring BeanUtils?(copyProperties) Cglib ?BeanCopier (copyProperties) Apache BeanUtils (copyProperties) Apache PropertyUtils?(copyProperties) Dozer mapstruct JSON 序列化 再反序列化
這些工具,不僅要引入相應(yīng)的依賴jar包,而且對代碼有入侵,要調(diào)用對應(yīng)得api方法才能進(jìn)行轉(zhuǎn)化,一旦遇到類型不一致,字段名稍有變動,就需要另寫java代碼補(bǔ)全字段,整體代碼非常丑陋。
2.性能優(yōu)勢
相比上面的工具類,不是使用反射、就是是用代理、序列化操作。相比于純正的set方法去轉(zhuǎn)化,差距不是一個量級。此次不贅述。
3.靈活性、兼容性
跟上述工具類相比插件有很大優(yōu)勢,不再贅述,下面我們比較一下,我之前常用的idea插件generateO2O

在此推薦其他一個我常用插件:generateAllSetter,搭配食用更佳
4、如何下載
打開idea plugins,切market place 搜索:Simple Object Copy

插件優(yōu)點(diǎn):
1、可以節(jié)省一個個字段的設(shè)置的開發(fā)時間
2、避免了漏字段設(shè)置,ps:前端同學(xué)總是來問為啥字段總是null。
3、而且通過出入?yún)⒌脑O(shè)計(jì)思想去開發(fā),規(guī)范了代碼,在有特殊請求轉(zhuǎn)化的時候也比較方便。
注意:該插件需要付費(fèi),6元(人民幣)每年,當(dāng)然學(xué)生、教育機(jī)構(gòu)、公益免費(fèi)。
來源:juejin.cn/post/7053264631262871583
干貨分享
最近將個人學(xué)習(xí)筆記整理成冊,使用PDF分享。關(guān)注我,回復(fù)如下代碼,即可獲得百度盤地址,無套路領(lǐng)??!
?001:《Java并發(fā)與高并發(fā)解決方案》學(xué)習(xí)筆記;?002:《深入JVM內(nèi)核——原理、診斷與優(yōu)化》學(xué)習(xí)筆記;?003:《Java面試寶典》?004:《Docker開源書》?005:《Kubernetes開源書》?006:《DDD速成(領(lǐng)域驅(qū)動設(shè)計(jì)速成)》?007:全部?008:加技術(shù)群討論
加個關(guān)注不迷路
喜歡就點(diǎn)個"在看"唄^_^
