https://juejin.cn/post/6952848675924082718
https://juejin.cn/post/6844904046097072141
https://zhuanlan.zhihu.com/p/264675395
插件名称:Simple Object Copy
1. 定义方法出入参
2. 光标定位方法内,使用快捷键ALT+INSERT(WIN) 、 command + N(mac) ,或者右键鼠标选择Generate,弹出生成选项框后,选择genCopyMethod,代码就生成好了
需要手写的代码



@Data
public class UserVO {
private String name;
private Date entryDate;
private String userId;
private List<RoleVO> roleList;
private RoomVO room;
public static UserVO convertToUserVO(UserDTO item) {
if (item == ) {
return ;
}UserVO result = new UserVO;
result.setName(item.getName);result.setEntryDate(item.getEntryDate);result.setUserId(item.getUserId);List<RoleDTO> roleList = item.getRoleList;if (roleList == ) {
result.setRoleList;} 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 == ) {
return ;
}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 == ) {
return ;
}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<RoleDTO> 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.无入侵市面上有很多类似的工具类,比较常用的有
1、Spring BeanUtils (copyProperties)
2、Cglib BeanCopier (copyProperties)
3、Apache BeanUtils (copyProperties)
4、Apache PropertyUtils (copyProperties)
5、Dozer
6、mapstruct
7、JSON 序列化 再反序列化
这些工具,不仅要引入相应的依赖jar包,而且对代码有入侵,要调用对应得api方法才能进行转化,一旦遇到类型不一致,字段名稍有变动,就需要另写java代码补全字段,整体代码非常丑陋。
举例:
1. mapstruct
同样的代码,,不仅要引入依赖、写如下转化mapper,还要,在对应地方调用对应api(代码入侵验证),然而Simple Object Copy 只需要一键生成。 RoomDTO中不存在的roomName、buildingName还要mapstruct另写方法,很容易忽略。源实体中不存在的属性,没有提示,小心前端总是问为啥都是。 在Simple Object Copy 插件代码生成后,不存在的字段也生成了空方法,直接编译提示补充,不容易忽略 需要手写的代码:@Mapper(componentModel = "spring",uses = {RoleVOMapper.class,RoomVOMapper.class})
publicinterfaceUserMapper{
UserConverter INSTANCE = Mappers.getMapper(UserConverter.class);
UserVO toUserVO(UserDTO userDTO);
}@Mapper(componentModel = "spring")
publicinterfaceRoleMapper{
RoleVO toRoleVO(RoleDTO roleDTO);
}@Mapper(componentModel = "spring")
publicinterfaceRoomMapper{
RoomVO toRoomVO(RoomDTO roomDTO);
}publicclassMain{
publicstaticvoidmain(String[] args) {
UserDTO user = ;UserVO userVO = UserMapper.INSTANCE.toUserVO(user);userVO.getRoomVO.setRoomName("大厅1");
userVO.getRoomVO.setBuildingName("尚德楼");
}}
1. BeanUtils文章源自懂站帝-http://www.sfdkj.com/11982.html 性能稍差。 不支持复杂对象还是要写大量代码,代码字段不清晰不易理解,别人接手难。RoomDTO中不存在的roomName、buildingName还要BeanUtils另写方法,很容易忽略。源实体中不存在的属性,没有提示,小心前端总是问为啥都是。 需要手写的代码
@Data
publicclassUserVO{
private String name;
private Date entryDate;
private String userId;
private List<RoleVO> roleList;
private RoomVO room;
public static UserVO convertToUserVO(UserDTO item) {
if (item == ) {
return ;
}UserVO result = new UserVO;
BeanUtils.copyProperties(item,result);List<RoleDTO> roleList = item.getRoleList;if (roleList == ) {
result.setRoleList;} 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 == ) {
return ;
}RoomVO result = new RoomVO;
BeanUtils.copyProperties(item,result);result.setRoomName;result.setBuildingName;return result;
}public static RoleVO convertToRoleVO(RoleDTO item) {
if (item == ) {
return ;
}RoleVO result = new RoleVO;
BeanUtils.copyProperties(item,result);return result;
}}
2.性能优势
相比上面的工具类,不是使用反射、就是是用代理、序列化操作。相比于纯正的set方法去转化,差距不是一个量级。此次不赘述。
3.灵活性、兼容性
跟上述工具类相比插件有很大优势,不再赘述,下面我们比较一下,我之前常用的idea插件generateO2O
