Java實(shí)體類之間的相互轉(zhuǎn)換方式
Java實(shí)體類之間的相互轉(zhuǎn)換
為什么要實(shí)體類之間相互轉(zhuǎn)換呢?
1.防止數(shù)據(jù)的泄露,比如使用Hibernate查詢用戶表,用戶表有用戶的賬號(hào)和密碼,我們后端給前端數(shù)據(jù)的時(shí)候并不希望給前端傳遞密碼這個(gè)字段。
2.防止數(shù)據(jù)過(guò)大,前端無(wú)法接收,hibernate使用的是關(guān)聯(lián)查詢,如果關(guān)聯(lián)的表非常多的話前端接收會(huì)報(bào)錯(cuò)。
3.更好的前后端分離,前端不用考慮后端的業(yè)務(wù)邏輯。而后端只需要給出返回的結(jié)果是否成功的編碼和具體提示內(nèi)容以及其它信息。
在pom.xml配置文件中添加依賴
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.4-jre</version>
</dependency>創(chuàng)建第一個(gè)實(shí)體類School
public class School {
private Integer schoolId;
private String schoolName;
private String name;
//省略getter和setter方法
}創(chuàng)建第二個(gè)實(shí)體類
public class SchoolDTO {
private Integer schoolId;
private String schoolName;
//省略getter和setter方法
//創(chuàng)建轉(zhuǎn)換方法
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;
}
//具體的轉(zhuǎn)換內(nèi)容
@Override
protected SchoolDTO doBackward(School school) {
SchoolDTO dto = new SchoolDTO();
dto.setSchoolId(school.getSchoolId());
dto.setSchoolName(school.getSchoolName());
return dto;
}
}
}創(chuàng)建測(cè)試類(一條數(shù)據(jù)轉(zhuǎn)換)
public class test {
public static void main(String[] args) {
//一條數(shù)據(jù)轉(zhuǎn)換
School school = new School();
school.setSchoolId(1);
school.setSchoolName("上海理工大學(xué)");
school.setName("李四");
SchoolDTO dto = new SchoolDTO().convertFrom(school);
System.out.println(dto);
//Page類型數(shù)據(jù)轉(zhuǎn)換
//schools.map(s -> new SchoolDTO().convertFrom(s));
//List類型
/*
List<SchoolDTO> list = dto.stream().map(address -> {
return new SchoolDTO().convertFrom(address);
}).collect(Collectors.toList());
*/
}輸入結(jié)果:
SchoolDTO{schoolId=1, schoolName='上海理工大學(xué)'}
第二種:直接使用this
1、首先創(chuàng)建一個(gè)操作數(shù)據(jù)庫(kù)的實(shí)體類:School,和用來(lái)給前端傳遞內(nèi)容的實(shí)體類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方法
//轉(zhuǎn)換方法
public SchoolDTO toSchool(School dto){
this.setId(dto.getId());
this.setAddress("轉(zhuǎn)換的結(jié)果是:"+dto.getAddress());
this.setSchoolName("轉(zhuǎn)換的結(jié)果是:"+dto.getSchoolName());
return this;
}
}2、測(cè)試方法進(jìn)行測(cè)試
public class TestController {
public static void main(String[] args) {
School school = new School();
school.setId(1);
school.setSchoolName("北京大學(xué)");
school.setAddress("北京");
//打印內(nèi)容
System.out.println(new SchoolDTO().toSchool(school));
}
}3、打印結(jié)果

這種方法比較方便,不用引用jar的依賴
實(shí)體類相互轉(zhuǎn)換工具類
場(chǎng)景
不同的實(shí)體類之間取相同數(shù)據(jù)賦值
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("【數(shù)據(jù)轉(zhuǎn)換】數(shù)據(jù)轉(zhuǎn)換出錯(cuò),目標(biāo)對(duì)象{}構(gòu)造函數(shù)異常", 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("【數(shù)據(jù)轉(zhuǎn)換】數(shù)據(jù)轉(zhuǎn)換出錯(cuò),目標(biāo)對(duì)象{}構(gòu)造函數(shù)異常", 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("【數(shù)據(jù)轉(zhuǎn)換】數(shù)據(jù)轉(zhuǎn)換出錯(cuò),目標(biāo)對(duì)象{}構(gòu)造函數(shù)異常", target.getName(), e);
return null;
}
}
}總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot + WebSocket 實(shí)現(xiàn)答題對(duì)戰(zhàn)匹配機(jī)制案例詳解
這篇文章主要介紹了SpringBoot + WebSocket 實(shí)現(xiàn)答題對(duì)戰(zhàn)匹配機(jī)制,分別為每個(gè)用戶擬定四種在線狀態(tài),通過(guò)流程圖給大家展示,需要的朋友可以參考下2021-05-05
java判斷用戶輸入的是否至少含有N位小數(shù)的實(shí)例
下面小編就為大家分享一篇java判斷用戶輸入的是否至少含有N位小數(shù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
簡(jiǎn)單了解SpringBoot HATEOAS使用方法
這篇文章主要介紹了簡(jiǎn)單了解SpringBoot HATEOAS使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
Java變量與常量一文全掌握(包含常量類、interface 與 final 的比較)
本文介紹Java變量與常量的基本概念,涵蓋變量分類(局部/實(shí)例/類)、聲明語(yǔ)法及使用場(chǎng)景,常量定義方式(final/字面量/枚舉)與命名規(guī)范,結(jié)合實(shí)例代碼給大家的非常詳細(xì),感興趣的朋友一起看看吧2025-08-08
Java7之forkjoin簡(jiǎn)介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
Java7引入了Fork Join的概念,來(lái)更好的支持并行運(yùn)算。接下來(lái)通過(guò)本文給大家分享Java7之forkjoin簡(jiǎn)介,感興趣的朋友一起看看吧2017-06-06
Mybatis中強(qiáng)大的resultMap功能介紹
這篇文章主要給大家介紹了關(guān)于Mybatis中強(qiáng)大的resultMap功能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Mybatis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06

