国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
DO、DTO和VO分層設(shè)計(jì)的好處
Java中 VO、 PO、DO、DTO、 BO、 QO、DAO、POJO的概念中介紹過Java中的各種模型概念。
在這里簡單再總結(jié)一下:
在日常的項(xiàng)目開發(fā)中,VO對(duì)應(yīng)于頁面上需要顯示的數(shù)據(jù)(表單),DO對(duì)應(yīng)于數(shù)據(jù)庫中存儲(chǔ)的數(shù)據(jù)(數(shù)據(jù)表),DTO對(duì)應(yīng)于除二者之外需要進(jìn)行傳遞的數(shù)據(jù)。
很多人可能對(duì)VO和DTO并不是那么熟悉,相反對(duì)DO卻比較熟悉,那是因?yàn)樵诤芏囗?xiàng)目中由于種種原因我們只使用了DO,原因可能有以下幾種:
1、項(xiàng)目太小,對(duì)于一種業(yè)務(wù)實(shí)體,封裝成一個(gè)DO就夠了。
2、并不熟悉DTO、VO,更不知道他們之間的區(qū)別。
3、了解DO\DTO\VO之間的區(qū)別,但是懶得用。
那么,這里,博主再啰嗦一下為什么要引入這么多概念,為什么我要建議大家在自己的項(xiàng)目中使用這些實(shí)體對(duì)象。
為什么不能只用一個(gè)DO
我們來看這樣一個(gè)例子。假如我們的項(xiàng)目中由User這樣一個(gè)實(shí)體。我們?cè)趧?chuàng)建User表的時(shí)候一般包含一下屬性:
針對(duì)這個(gè)實(shí)體,我們通常需要?jiǎng)?chuàng)建一個(gè)DO類,用來封裝這個(gè)User實(shí)體。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
publicclass UserDO {
privateInteger id;                 //唯一主鍵
privateDate createdTime;           //創(chuàng)建時(shí)間
privateDate updatedTime;           //最后更新時(shí)間
privateString name;                //姓名
privateInteger age;                //年齡
privateString gender;              //性別
privateString address;             //住址
privateString password;            //密碼
privateString nickName;            //昵稱
privateDate birthday;              //生日
privateString politicalStatus;     //政治面貌,1表示群眾,2表示團(tuán)員,3表示黨員,4表示其他,100表示未知
privateInteger companyId;          //公司的ID
privateInteger status;             //數(shù)據(jù)狀態(tài),1表示可用,0表示不可用
//setter and getter
}
然后,在代碼中,從DAO一直到前端展示,我們都通過這個(gè)UserDO類的對(duì)象來進(jìn)行數(shù)據(jù)傳輸。這樣做會(huì)有什么問題嘛?
不需要的字段也會(huì)傳遞到前端頁面。如password、createdTime、updatedTime和status這幾個(gè)字段我們可能在前端根本不需要展示,但是這些字段有可能也會(huì)被傳遞到前端(除非我們?cè)赟QL查詢的時(shí)候沒有查詢出對(duì)應(yīng)的字段)。這不僅使數(shù)據(jù)的傳輸量增大,還可能有安全性問題。
某些字段需要轉(zhuǎn)換,但是無法支持。對(duì)于上面例子中的政治面貌字段,我們?cè)跀?shù)據(jù)庫中存儲(chǔ)的是數(shù)字,但是在前端頁面我要展示的是中文描述。這種情況只能在前端通過if/else的方式來分情況展示。
某些字段要展示,但是并不希望出現(xiàn)在數(shù)據(jù)庫中在User表中我們只保存了這個(gè)用戶的companyId,需要同時(shí)查詢company表來查詢出該公司的更多詳細(xì)信息。對(duì)于User對(duì)象,如果我們想在前端同時(shí)展示他所屬的公司,希望通過一次查詢?nèi)疾槌鰜碓趺崔k?有幾個(gè)簡單的方案,第一個(gè)是讓UserDO中包含一個(gè)Company類的屬性,通過這個(gè)屬性來傳遞。另外一種是把我們希望傳到前端的Company的屬性也寫到UserDO中。但是,如果真的這么做了,那UserDO還能被稱作DO了嗎?
還有很多問題,這這里就不詳細(xì)介紹了。
可見,使用一個(gè)DO從頭用到尾(從數(shù)據(jù)庫到前端頁面)并不是一種好的設(shè)計(jì)。
如何正確的使用DO、DTO、VO
對(duì)于上面的例子,我們可以將他設(shè)計(jì)成以下類。由于模型并不復(fù)雜,這里只需要再引入VO就可以了。
UserDO已經(jīng)和數(shù)據(jù)庫字段一一對(duì)應(yīng)了,這里不需要修改。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
publicclass UserDO {
privateInteger id;                 //唯一主鍵
privateDate createdTime;           //創(chuàng)建時(shí)間
privateDate updatedTime;           //最后更新時(shí)間
privateString name;                //姓名
privateInteger age;                //年齡
privateString gender;              //性別
privateString address;             //住址
privateString password;            //密碼
privateString nickName;            //昵稱
privateDate birthday;              //生日
privateString education;           //學(xué)歷
privateString politicalStatus;     //政治面貌,1表示群眾,2表示團(tuán)員,3表示黨員,4表示其他,100表示未知
privateInteger companyId;          //公司的ID
privateInteger status;             //數(shù)據(jù)狀態(tài),1表示可用,0表示不可用
//setter and getter
}
引入U(xiǎn)serVO,用于封裝傳遞到前端需要展示的字段。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
publicclass UserVO {
privateInteger id;                 //唯一主鍵
privateString name;                //姓名
privateInteger age;                //年齡
privateString gender;              //性別
privateString address;             //住址
privateString nickName;            //昵稱
privateDate birthday;              //生日
privateString education;           //學(xué)歷
privateString politicalStatus;     //政治面貌,群眾、團(tuán)員、黨員等
privateCompany company;            //公司
//setter and getter
}
UserVO中只包含了展示所需要的字段,并不需要展示的字段在這里不需要包含。
在引入了這個(gè)類之后,我們就可在進(jìn)行數(shù)據(jù)庫查詢的時(shí)候使用UserDO,然后再需要傳遞到前端的時(shí)候把DO轉(zhuǎn)換成VO。
總結(jié)
看到這里,你可能已經(jīng)發(fā)現(xiàn),UserDO和UserVO中包含了大量的相同字段。難道真的有必要再單獨(dú)設(shè)計(jì)個(gè)VO嘛?我可以明確告訴你的是,當(dāng)你的系統(tǒng)越來越大,表中的字段越來越多的時(shí)候,使用DO\DTO\VO等概念進(jìn)行分層處理是絕對(duì)有好處的。至于如何進(jìn)行有效的在不同的實(shí)體類間進(jìn)行轉(zhuǎn)換是我接下來要介紹的。
優(yōu)雅的將DO轉(zhuǎn)換成VO
Dozer 是一個(gè)對(duì)象轉(zhuǎn)換工具。
Dozer可以在JavaBean到JavaBean之間進(jìn)行遞歸數(shù)據(jù)復(fù)制,并且這些JavaBean可以是不同的復(fù)雜的類型。
所有的mapping,Dozer將會(huì)很直接的將名稱相同的fields進(jìn)行復(fù)制,如果field名不同,或者有特別的對(duì)應(yīng)要求,則可以在xml中進(jìn)行定義。
前面我們介紹的DO\DTO\VO不就是JavaBean嘛。正好可以使用Dozer進(jìn)行轉(zhuǎn)換呀。
除了使用Dozer,當(dāng)然你還由其他選擇:
典型的解決方案就是手動(dòng)拷貝,弊端很明顯,代碼中充斥大量Set 和Get方法,真正的業(yè)務(wù)被埋藏值與值的拷貝之中。
另一種方案就是使用BeanUtil,但BeanUtil不夠很好的靈活性,又時(shí)候還不得不手動(dòng)拷貝。Dozer可以靈活的對(duì)對(duì)象進(jìn)行轉(zhuǎn)換,且使用簡單。
Dozer 支持的轉(zhuǎn)換類型
Primitive 基本數(shù)據(jù)類型 , 后面帶 Wrapper 是包裝類 Complex Type 是復(fù)雜類型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
·   Primitive to Primitive Wrapper
·   Primitive to Custom Wrapper
·   Primitive Wrapper to Primitive Wrapper
·   Primitive to Primitive
·   Complex Type to Complex Type
·   String to Primitive
·   String to Primitive Wrapper
·   String to Complex Type ifthe Complex Type contains a String constructor
·   String 到復(fù)雜類型 , 如果復(fù)雜類型包含一個(gè) String 類型的構(gòu)造器
·   String to Map
·   Collection to Collection
·   Collection to Array
·   Map to Complex Type
·   Map to Custom Map Type
·   Enum to Enum
·   Each of these can be mapped to one another: java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp, java.util.Calendar, java.util.GregorianCalendar
·   String to any of the supported Date/Calendar Objects.
·   Objects containing a toString() method that produces a longrepresenting time in (ms) to any supported Date/Calendar object.
在普通Java項(xiàng)目中使用Dozer
在pom.xml中增加依賴
1
2
3
4
5
<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer</artifactId>
<version>5.5.1</version>
</dependency>
使用Dozer進(jìn)行類轉(zhuǎn)換
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
publicclass Main {
publicstatic void main(String[] args) {
DozerBeanMapper mapper = newDozerBeanMapper();
UserDO userDO = newUserDO();
userDO.setName("hollis");
userDO.setAddress("hz");
userDO.setAge(25);
userDO.setCompanyId(1);
userDO.setBirthday(newDate());
userDO.setGender("male");
userDO.setEducation("1");
userDO.setNickName("hollis");
userDO.setPoliticalStatus("3");
UserVO userVO = (UserVO) mapper.map(userDO, UserVO.class);
System.out.println(userVO);
}
}
特殊的字段轉(zhuǎn)換
在使用mapper進(jìn)行轉(zhuǎn)換前,設(shè)置一個(gè)或多個(gè)mapping文件
1
2
3
List myMappingFiles = newArrayList();
myMappingFiles.add("dozer-mapping.xml");
mapper.setMappingFiles(myMappingFiles);
配置dozer-mapping.xml文件
數(shù)據(jù)類型不一致,或者名稱不相同或者有級(jí)聯(lián)關(guān)系等情況下,可以通過文件dozer-mapping.xml來進(jìn)行定制Bean的轉(zhuǎn)換
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0"encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://dozer.sourceforge.net
http://dozer.sourceforge.net/schema/beanmapping.xsd">
<mapping>
<class-a>com.hollis.lab.UserDO</class-a>
<class-b>com.hollis.lab.UserVO</class-b>
</mapping>
</mappings>
在JavaWeb項(xiàng)目中使用Dozer
在pom.xml中增加依賴
1
2
3
4
5
<dependency>
<groupId>net.sf.dozer</groupId>
<artifactId>dozer</artifactId>
<version>5.5.1</version>
</dependency>
使用Spring集成dozer
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="baseMapper"class="org.dozer.spring.DozerBeanMapperFactoryBean">
<property name="mappingFiles">
<list>
<value>classpath:mapping/dozer-mapping.xml</value>
</list>
</property>
</bean>
</beans>
使用baseMapper進(jìn)行Bean的轉(zhuǎn)換
1
2
3
4
5
6
7
8
@Autowired
privateMapper baseMapper;
privateUserVO doToVo(UserDO userDO){
if(userDO == null)returnnull;
UserVO vo = baseMapper.map(userDO, UserVO.getClass());
if(userDO.getCompanyId != null) getCompany(vo);
returnvo;
}
通過以上的代碼加配置,我們就實(shí)現(xiàn)了從DO轉(zhuǎn)換到VO的部分操作,之所以說是部分操作,是因?yàn)槲覀冊(cè)赿ozer-mapping.xml并沒有做多余的配置,只是使用dozer將DO中和VO中共有的屬性轉(zhuǎn)換了過來。對(duì)于其他的類型不同或者名稱不同等的轉(zhuǎn)換可以參考官網(wǎng)例子通過設(shè)置dozer-mapping.xml文件來實(shí)現(xiàn)。
上面還有一個(gè)getCompany()沒有實(shí)現(xiàn)。這個(gè)方法其實(shí)就是通過companyId查詢出company實(shí)體然后在賦值給UserVO中的company屬性。
在使用了dozer之后,我們可以把UserDO中的部分屬性賦值到UserVO中,其實(shí),轉(zhuǎn)化的過程是通過調(diào)用UserDO中的getter方法和UserVO中的setter方法來實(shí)現(xiàn)的。讀者可以做個(gè)實(shí)驗(yàn),對(duì)于UserVO中的部分屬性不寫Setter方法看看還能不能把屬性值轉(zhuǎn)換過來,博主已經(jīng)測(cè)試過了,是不能的。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
一款 IDEA 插件幫你優(yōu)雅轉(zhuǎn)化 DTO、VO、BO、PO、DO
Java函數(shù)優(yōu)雅之道(下)
java項(xiàng)目中VO和DTO以及Entity,各自是在什么情況下應(yīng)用的
期望薪資15k,不知vo和dto有何區(qū)別,能不能要?
Java 代碼精簡之道
Java單元測(cè)試技巧之JSON序列化
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服