Java实体类之间的相互转换方式
作者:与黑夜为伍
这篇文章主要介绍了Java实体类之间的相互转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
Java实体类之间的相互转换
为什么要实体类之间相互转换呢?
1.防止数据的泄露,比如使用Hibernate查询用户表,用户表有用户的账号和密码,我们后端给前端数据的时候并不希望给前端传递密码这个字段。
2.防止数据过大,前端无法接收,hibernate使用的是关联查询,如果关联的表非常多的话前端接收会报错。
3.更好的前后端分离,前端不用考虑后端的业务逻辑。而后端只需要给出返回的结果是否成功的编码和具体提示内容以及其它信息。
在pom.xml配置文件中添加依赖
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>23.4-jre</version> </dependency>
创建第一个实体类School
public class School { private Integer schoolId; private String schoolName; private String name; //省略getter和setter方法 }
创建第二个实体类
public class SchoolDTO { private Integer schoolId; private String schoolName; //省略getter和setter方法 //创建转换方法 public School convertTo() { OrderConverter convert = new OrderConverter(); return convert.convert(this); } public SchoolDTO convertFrom(School order) { OrderConverter convert = new OrderConverter(); return convert.reverse().convert(order); } private static class OrderConverter extends Converter<SchoolDTO, School> { @Override protected School doForward(SchoolDTO schoolDTO) { return null; } //具体的转换内容 @Override protected SchoolDTO doBackward(School school) { SchoolDTO dto = new SchoolDTO(); dto.setSchoolId(school.getSchoolId()); dto.setSchoolName(school.getSchoolName()); return dto; } } }
创建测试类(一条数据转换)
public class test { public static void main(String[] args) { //一条数据转换 School school = new School(); school.setSchoolId(1); school.setSchoolName("上海理工大学"); school.setName("李四"); SchoolDTO dto = new SchoolDTO().convertFrom(school); System.out.println(dto); //Page类型数据转换 //schools.map(s -> new SchoolDTO().convertFrom(s)); //List类型 /* List<SchoolDTO> list = dto.stream().map(address -> { return new SchoolDTO().convertFrom(address); }).collect(Collectors.toList()); */ }
输入结果:
SchoolDTO{schoolId=1, schoolName='上海理工大学'}
第二种:直接使用this
1、首先创建一个操作数据库的实体类:School,和用来给前端传递内容的实体类SchoolDTO
public class School { private Integer id; private String schoolName; private String address; //省略getter和setter方法 } public class SchoolDTO { private Integer id; private String schoolName; private String address; //省略getter和setter方法 //省略toString方法 //转换方法 public SchoolDTO toSchool(School dto){ this.setId(dto.getId()); this.setAddress("转换的结果是:"+dto.getAddress()); this.setSchoolName("转换的结果是:"+dto.getSchoolName()); return this; } }
2、测试方法进行测试
public class TestController { public static void main(String[] args) { School school = new School(); school.setId(1); school.setSchoolName("北京大学"); school.setAddress("北京"); //打印内容 System.out.println(new SchoolDTO().toSchool(school)); } }
3、打印结果
这种方法比较方便,不用引用jar的依赖
实体类相互转换工具类
场景
不同的实体类之间取相同数据赋值
package com.lrhealth.mappingintegration.utils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @Slf4j public class BeanHelper { public static <T> T copyProperties(Object source, Class<T> target){ try { T t = target.newInstance(); BeanUtils.copyProperties(source, t); return t; } catch (Exception e) { log.error("【数据转换】数据转换出错,目标对象{}构造函数异常", target.getName(), e); return null; } } public static <T> List<T> copyWithCollection(List<?> sourceList, Class<T> target){ try { return sourceList.stream().map(s -> copyProperties(s, target)).collect(Collectors.toList()); } catch (Exception e) { log.error("【数据转换】数据转换出错,目标对象{}构造函数异常", target.getName(), e); return null; } } public static <T> Set<T> copyWithCollection(Set<?> sourceList, Class<T> target){ try { return sourceList.stream().map(s -> copyProperties(s, target)).collect(Collectors.toSet()); } catch (Exception e) { log.error("【数据转换】数据转换出错,目标对象{}构造函数异常", target.getName(), e); return null; } } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。