DTO(Data Transfer Object):數(shù)據(jù)傳輸對象,這個(gè)概念來源于J2EE的設(shè)計(jì)模式,原來的目的是為了EJB的分布式應(yīng)用提供粗粒度的數(shù)據(jù)實(shí)體,以減少分布式調(diào)用的次數(shù),從而提高分布式調(diào)用的性能和降低網(wǎng)絡(luò)負(fù)載,但在這里,我泛指用于展示層與服務(wù)層之間的數(shù)據(jù)傳輸對象。再通俗一點(diǎn)來說就是前端傳給后端的JSON數(shù)據(jù)其為數(shù)據(jù)庫對應(yīng)實(shí)體的部分字段(這樣做的目的也很好理解,比如你在修改的接口使用的是完整實(shí)體,那么你可能在前端只傳了你想要的改的,但是不排除其它情況的篡改,比如添加了別的不能修改的字段可能就會(huì)產(chǎn)生問題)
VO(View Object):視圖對象,用于展示層,它的作用是把某個(gè)指定頁面(或組件)的所有數(shù)據(jù)封裝起來。通俗一點(diǎn)就是說你在后端接口處理完返回給前端的實(shí)但是VO這要前端想要的字段
PO(Persistent Object):持久化對象,它跟持久層(通常是關(guān)系型數(shù)據(jù)庫)的數(shù)據(jù)結(jié)構(gòu)形成一一對應(yīng)的映射關(guān)系,如果持久層是關(guān)系型數(shù)據(jù)庫,那么,數(shù)據(jù)表中的每個(gè)字段(或若干個(gè))就對應(yīng)PO的一個(gè)(或若干個(gè))屬性。這就是VO里說的數(shù)據(jù)庫完整的映射對象實(shí)體
這三個(gè)是常用的,可以通過代碼生成器來直接生成
轉(zhuǎn)換器:
轉(zhuǎn)換器是用來將PO,VO,DTO 進(jìn)行轉(zhuǎn)換的工具,直接上代碼:
?
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
這是MapStruct官網(wǎng)提供的一個(gè)工具很好用
若源對象屬性與目標(biāo)對象屬性名字一致,會(huì)自動(dòng)映射對應(yīng)屬性,不一樣的需要指定,也可以用 format 轉(zhuǎn)成自己想要的類型,也支持表達(dá)式的方式,可以看到像 id、name、email這些名詞一致的我并沒有指定 source-target,而birthday-birth指定了,轉(zhuǎn)換格式的 birthDateFormat 加了dateFormat 或者 birthExpressionFormat 加了 expression,如果某個(gè)屬性你不想映射,可以加個(gè) ignore=true
?
@Mapper
public interface PersonConverter {
PersonConverter INSTANCE = Mappers.getMapper(PersonConverter.class);
@Mappings({
@Mapping(source = "birthday", target = "birth"),
@Mapping(source = "birthday", target = "birthDateFormat", dateFormat = "yyyy-MM-dd HH:mm:ss"),
@Mapping(target = "birthExpressionFormat", expression = "java(org.apache.commons.lang3.time.DateFormatUtils.format(person.getBirthday(),\"yyyy-MM-dd HH:mm:ss\"))"),
@Mapping(source = "user.age", target = "age"),
@Mapping(target = "email", ignore = true)
})
PersonDTO domain2dto(Person person);
Person gerPerson(PersonDTO personDTO);
List<PersonDTO> domain2dto(List<Person> people);
}
然后就會(huì)在target里自動(dòng)生成他的實(shí)現(xiàn)類
項(xiàng)目中直接注入轉(zhuǎn)換器,使用里面自己定義的方法就可以
Person person= PersonConverter.INSTANCE.getPerson(personDTO);
MapStruct 注解的關(guān)鍵詞
@Mapper 只有在接口加上這個(gè)注解, MapStruct 才會(huì)去實(shí)現(xiàn)該接口
@Mapper 里有個(gè) componentModel 屬性,主要是指定實(shí)現(xiàn)類的類型,一般用到兩個(gè)
default:默認(rèn),可以通過 Mappers.getMapper(Class) 方式獲取實(shí)例對象
spring:在接口的實(shí)現(xiàn)類上自動(dòng)添加注解 @Component,可通過 @Autowired 方式注入
@Mapping:屬性映射,若源對象屬性與目標(biāo)對象名字一致,會(huì)自動(dòng)映射對應(yīng)屬性
source:源屬性
target:目標(biāo)屬性
dateFormat:String 到 Date 日期之間相互轉(zhuǎn)換,通過 SimpleDateFormat,該值為 SimpleDateFormat 的日期格式
ignore: 忽略這個(gè)字段
@Mappings:配置多個(gè)@Mapping
@MappingTarget 用于更新已有對象
@InheritConfiguration 用于繼承配置文章來源:http://www.zghlxwxcb.cn/news/detail-672702.html
要查看完整功能可參考官網(wǎng):
?文章來源地址http://www.zghlxwxcb.cn/news/detail-672702.html
http://mapstruct.org/documentation/stable/reference/html/
到了這里,關(guān)于DTO,VO,PO的意義與他們之間的轉(zhuǎn)換的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!