一款 IDEA 插件幫你優(yōu)雅轉(zhuǎn)化 DTO、VO、BO、PO、DO
閱讀本文大概需要 4.5 分鐘。
來自:juejin.cn/post/705326463126287158
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ù)對象
https://juejin.cn/post/6952848675924082718
https://juejin.cn/post/6844904046097072141
https://zhuanlan.zhihu.com/p/2646753951. 定義方法出入?yún)?/span>
2. 光標(biāo)定位方法內(nèi),使用快捷鍵ALT+INSERT(WIN) 、 command + N(mac) ,或者右鍵鼠標(biāo)選擇Generate,彈出生成選項(xiàng)框后,選擇genCopyMethod,代碼就生成好了



@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;
} 1、Spring BeanUtils?(copyProperties)
2、Cglib ?BeanCopier (copyProperties)
3、Apache BeanUtils (copyProperties)
4、Apache PropertyUtils?(copyProperties)
5、Dozer
6、mapstruct
7、JSON 序列化 再反序列化
1. mapstruct
@Mapper(componentModel =?"spring",uses = {RoleVOMapper.class,RoomVOMapper.class})
public?interface?UserMapper?{
????UserConverter INSTANCE = Mappers.getMapper(UserConverter.class);
????
????UserVO?toUserVO(UserDTO userDTO);
}
@Mapper(componentModel =?"spring")
public?interface?RoleMapper?{
????RoleVO?toRoleVO(RoleDTO roleDTO);
}
@Mapper(componentModel =?"spring")
public?interface?RoomMapper?{
????RoomVO?toRoomVO(RoomDTO roomDTO);
}
public?class?Main?{
????public?static?void?main(String[] args)?{
????????UserDTO user = ;
????????UserVO userVO = UserMapper.INSTANCE.toUserVO(user);
????????userVO.getRoomVO().setRoomName("大廳1");
????????userVO.getRoomVO().setBuildingName("尚德樓");
????}
}@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();
????????BeanUtils.copyProperties(item,result);
????????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();
????????BeanUtils.copyProperties(item,result);
????????
????????result.setRoomName();
????????result.setBuildingName();
????????return?result;
????}
????public?static?RoleVO?convertToRoleVO(RoleDTO item)?{
????????if?(item ==?null) {
????????????return?null;
????????}
????????RoleVO result =?new?RoleVO();
????????BeanUtils.copyProperties(item,result);
????????return?result;
????}
} 

推薦閱讀:
內(nèi)容包含Java基礎(chǔ)、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬并發(fā)、消息隊(duì)列、高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper......等技術(shù)棧!
?戳閱讀原文領(lǐng)??!? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??朕已閱?

