网站代备案系统,网站策划制作,黄冈网站免费投放平台免费下载,建筑培训机构po转vo工具类 1.反射调用2.JSON序列化方式3.注解驱动4.ModelMappe5.手动映射6.总结7.扩展方法 1.反射调用 这个方法会创建一个新的实例#xff0c;并将所有公共字段复制到目标对象中#xff0c;而不修改原来的实例。因此#xff0c;如果目标类包含 private 或 final 字段并将所有公共字段复制到目标对象中而不修改原来的实例。因此如果目标类包含 private 或 final 字段则需要额外的手动处理。 1.工具类
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;public class PoVoConverterT, V {protected final ClassT clazz;public PoVoConverter(ClassT clazz) {this.clazz clazz;}public T voToPo(V vo) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {T po clazz.newInstance();Field[] declaredFields clazz.getDeclaredFields();for (Field declaredField : declaredFields) {declaredField.setAccessible(true);Field voField vo.getClass().getDeclaredField(declaredField.getName());voField.setAccessible(true);declaredField.set(po, voField.get(vo));}return po;}public V poToVo(T po) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {V vo clazz.newInstance();Field[] declaredFields clazz.getDeclaredFields();for (Field declaredField : declaredFields) {declaredField.setAccessible(true);Field poField po.getClass().getDeclaredField(declaredField.getName());poField.setAccessible(true);declaredField.set(vo, poField.get(po));}return vo;}
}2.使用方式
PoVoConverterUser, UserVo converter new PoVoConverter(User.class);
User user converter.voToPo(userVo);
UserVo userVo converter.poToVo(user);3.总结 优势简单易懂不需要任何额外配置 劣势性能较差因为需要多次反射调用而且有可能遇到安全限制
2.JSON序列化方式 该方法使用 Jackson 库将 VO 对象转换为 JSON 字符串并将字符串反序列化回 PO 类型以此实现转换注意此方法的优点是效率较高但是可能需要管理 JSON 库的依赖关系 1.工具类
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.TypeFactory;public class PoVoConverterT, V {protected final ClassT clazz;public PoVoConverter(ClassT clazz) {this.clazz clazz;}public T voToPo(V vo) throws IOException {ObjectMapper mapper new ObjectMapper();return mapper.readValue(mapper.writeValueAsString(vo), TypeFactory.defaultInstance().constructType(clazz));}public V poToVo(T po) throws IOException {ObjectMapper mapper new ObjectMapper();return mapper.readValue(mapper.writeValueAsString(po), TypeFactory.defaultInstance().constructType(clazz));}
}2.使用方式
PoVoConverterUser, UserVo converter new PoVoConverter(User.class);
User user converter.voToPo(userVo);
UserVo userVo converter.poToVo(user);3.总结 优势高性能适用于大数据量的情况 劣势需要额外的 JSON 库支持如果 JSON 字符串过大则可能导致内存溢出
3.注解驱动 推荐使用 JSON 序列化方法因为它具有较高的性能并且易于理解和维护。如果需要更高的安全性可以考虑使用注解驱动方法 1.代码
Service
MapperScan(com.andy.mapper)
public interface UserMapper {Mappings({Mapping(source vo.id, target id),Mapping(source vo.name, target name),Mapping(source vo.age, target age)})User poToVo(UserVo vo);Mappings({Mapping(source id, target vo.id),Mapping(source name, target vo.name),Mapping(source age, target vo.age)})UserVo voToPo(User po);
}2.总结 优势简洁明了易于维护。 劣势需要使用第三方库比如 MyBatis
4.ModelMappe 这里模型映射器会自动检测用户类和 VO 类型上的 Mapping 注解并将 VO 类型映射到 PO 类型反之亦然 1.导入坐标
dependencygroupIdorg.modelmapper/groupIdartifactIdmodelmapper/artifactIdversion3.2.0/version
/dependency2.使用方式
public class UserService {private ModelMapper modelMapper new ModelMapper();public UserVo toVo(User po) {return modelMapper.map(po, UserVo.class);}public User toPo(UserVo vo) {return modelMapper.map(vo, User.class);}
}3.总结 优势无须手动编写映射代码易于维护 劣势可能导致依赖冲突
5.手动映射 这种方式就是我们常用的get()和set() 1.使用方式
public T voToPo(V vo) {T po clazz.newInstance();po.setId(vo.getId());po.setName(vo.getName());po.setEmail(vo.getEmail());return po;
}public V poToVo(T po) {V vo clazz.newInstance();vo.setId(po.getId());vo.setName(po.getName());vo.setEmail(po.getEmail());return vo;
}3.总结 优势有更多的控制权适合特定场景 劣势代码中有大量的get/set
6.总结
方法缺点优点反射调用性能较低可能受到安全限制简单易懂适合小型项目JSON 序列化需要额外的 JSON 库支持可能产生大量垃圾信息高效适合大型项目注解驱动需要第三方库复杂度较高易于维护性能良好ModelMapper可能导致冲突无须手动编写映射代码易于维护手动映射手动编写映射代码更多控制权
7.扩展方法
1.BeanUtils.copyProperties();
2.UserVo userVo JSON.parseObject(JSON.toJSONString(user), UserVo.class);