欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot中VO/DTO/PO的具體使用

 更新時(shí)間:2024年03月17日 09:22:03   作者:tang_seven  
VO/DTO/PO等實(shí)體類中字段常常會(huì)存在多數(shù)相同,根據(jù)業(yè)務(wù)需求少數(shù)不同,本文主要介紹了SpringBoot中VO/DTO/PO的具體使用,感興趣的可以了解一下

1.概念敘述

  • VO:View Object,主要用于展示層。它的作用是把某個(gè)指定前端頁面的所有數(shù)據(jù)封裝起來。他的作用主要是減少傳輸數(shù)據(jù)量大小和保護(hù)數(shù)據(jù)庫隱私數(shù)據(jù)(如用戶密碼、用戶郵箱等相關(guān)信息)不外泄,同時(shí)保護(hù)數(shù)據(jù)庫的結(jié)構(gòu)不外泄。
  • DTO:Data Transfer Object,數(shù)據(jù)傳輸對(duì)象,用于展示層與服務(wù)層之間的數(shù)據(jù)傳輸對(duì)象。(注:實(shí)際開發(fā)中還存在BO,其作用和DTO類似,當(dāng)業(yè)務(wù)邏輯不復(fù)雜時(shí)一般會(huì)被合并。)
  • PO:Persistant Object,持久化對(duì)象,和數(shù)據(jù)庫形成映射關(guān)系。簡單說PO就是每一個(gè)數(shù)據(jù)庫中的數(shù)據(jù)表,一個(gè)字段對(duì)應(yīng)PO中的一個(gè)變量。(也就是我們常用的Entities)

幾者之間的關(guān)系如下圖:

從前端頁面中收到JSON格式數(shù)據(jù),后端接口中將其封裝為一個(gè)VO對(duì)象;接口接收到VO對(duì)象后將其轉(zhuǎn)換為DTO對(duì)象,并調(diào)用業(yè)務(wù)類方法對(duì)其進(jìn)行處理;然后處理為PO對(duì)象,調(diào)用Dao接口連接數(shù)據(jù)庫進(jìn)行數(shù)據(jù)訪問(查詢、插入、更新等)。

后端從數(shù)據(jù)庫得到結(jié)果后,根據(jù)Dao接口將結(jié)果映射為PO對(duì)象,然后調(diào)用業(yè)務(wù)類方法將其轉(zhuǎn)換為需要的DTO對(duì)象,再根據(jù)前端頁面實(shí)際需求,轉(zhuǎn)換為VO對(duì)象進(jìn)行返回。

2.類型轉(zhuǎn)換

上述過程中,VO/DTO/PO等實(shí)體類中字段常常會(huì)存在多數(shù)相同,根據(jù)業(yè)務(wù)需求少數(shù)不同。為避免頻繁的set和get操作對(duì)其進(jìn)行轉(zhuǎn)換,spring為我們提供了多種方法。

(1)使用BeanUtils:(springframework包下)

UserDto user = new UserDto ();
BeanUtils.copyProperties(userInfo ,user ,new String[]{"birthday"});

上述代碼中,意思是將左邊UserInfo實(shí)體類(可以視為一個(gè)VO對(duì)象)和UserDto實(shí)體類類(可以視為一個(gè)DTO對(duì)象)中一樣的值進(jìn)行賦值user對(duì)象中,new String[]{""}中是跳過賦值的字段,該屬性可以為空。

(2)使用BeanUtils:(Apache包下)

UserDto user = new UserDto ();
BeanUtils.copyProperties(user,userInfo);

上述代碼中,意思是將右邊UserInfo實(shí)體類(可以視為一個(gè)VO對(duì)象)和UserDto實(shí)體類類(可以視為一個(gè)DTO對(duì)象)中一樣的值進(jìn)行賦值user對(duì)象中。(和spring包下方法相反)

(3)使用modelMapper:

導(dǎo)入依賴:

        <dependency>
            <groupId>org.modelmapper</groupId>
            <artifactId>modelmapper</artifactId>
            <version>2.3.9</version>
        </dependency>

配置文件:

@Configuration
public class ModelMapperConfig {

    private Converter<Date, String> dateToStringConverter = new AbstractConverter<Date, String>() {
        @Override
        protected String convert(Date date) {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

            return date == null ? null : simpleDateFormat.format(date);
        }
    };

    @Bean
    public ModelMapper modelMapper() {
        ModelMapper modelMapper = new ModelMapper();

        // 官方配置說明: http://modelmapper.org/user-manual/configuration/
        // 完全匹配
        modelMapper.getConfiguration().setFullTypeMatchingRequired(true);

        // 匹配策略使用嚴(yán)格模式
        modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);

        modelMapper.addConverter(dateToStringConverter);

        configureUser(modelMapper);

        return modelMapper;
    }

    private void configureUser(ModelMapper modelMapper) {
        //將dto轉(zhuǎn)為UserAccount實(shí)體類
        modelMapper.typeMap(UserInfor.class, UserAccount.class)
                .addMappings(mapper -> mapper.map(UserInfor::getUsername, UserAccount::setUsername))
                .addMappings(mapper -> mapper.map(UserInfor::getPassword, UserAccount::setPassword));

}

使用:

UserAccount account= modelMapper.map(userInfo,UserAccount.class);

上述代碼,根據(jù)配置文件中configureUser方法中配置的字段,將兩個(gè)實(shí)體類中的字段進(jìn)行復(fù)制賦值。

3.使用實(shí)例

下面我們模擬一個(gè)業(yè)務(wù):后端接口從前端中接收到用戶注冊(cè)數(shù)據(jù),進(jìn)行注冊(cè);前端調(diào)用查詢接口,獲取用戶的數(shù)據(jù)。

首先,我們定義VO、DTO、PO對(duì)象:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserInfo implements Serializable {
    //該實(shí)體類為封裝好的前端傳輸頁面VO對(duì)象
    @NotBlank(message = "用戶名不能為空")
    private String Username;
    @NotBlank(message = "密碼不能為空")
    private String Password;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserDTO implements Serializable {
    //該實(shí)體類為業(yè)務(wù)處理DTO對(duì)象
    private int Account;
    private String Username;
    private String Password;
    private String Roles;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("user_account")
public class UserAccount implements Serializable {
    //該實(shí)體類為用戶賬號(hào)表對(duì)應(yīng)PO對(duì)象
    @TableId
    private int SerialNum;
    private int Account;
    private String Username;
    private String Password;
    private String Roles;
    private String status;
    private String registerDate;
}

然后,我們編寫用戶注冊(cè)相關(guān)代碼(基于springboot+mybatis plus),由于使用mybatis plus,此處省略mapper層代碼,僅展示serviceImpl和controller中代碼。

控制層:

    //用戶注冊(cè)
    @PostMapping("/register")
    public CommonResult<Object> userRegister(@RequestBody @Valid UserInfo user){
        int result = userService.userRegister(user);
        if(result!=0){
            return CommonResult.success(result);
        }else {
            return CommonResult.fail(result);
        }
    }

業(yè)務(wù)處理:

    @Override
    public int userRegister(UserInfo user) {
        if(accountMapper.selectCount(new QueryWrapper<UserAccount>().eq("username",user.getUsername()))!=0){
            log.info("用戶名已存在");
            return 0;
        }
        UserDTO userDTO = new UserDTO();
        BeanUtils.copyProperties(userDTO,user);
        //加密密碼
        Md5Hash md5Hash = new Md5Hash(userDTO.getPassword(), userDTO.getUsername(),2);
        userDTO.setPassword(md5Hash.toString());
        //模擬生成賬號(hào)
        userDTO.setAccount(12345678);
        //賦予權(quán)限
        userDTO.setRoles("user");
        return accountMapper.insert(userDTO);
    }

最終,我們可以往數(shù)據(jù)庫中傳入一條用戶剛注冊(cè)的賬號(hào)數(shù)據(jù),status和RegisterDate等屬性取數(shù)據(jù)庫設(shè)置好的默認(rèn)值。

然后,我們?cè)俣x一個(gè)VO用于展示用戶的信息:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserVo implements Serializable {
    //該VO用于展示用戶信息,去除了用戶密碼等敏感信息
    private int serialNum;
    private int account;
    private String username;
}

進(jìn)行用戶信息的查詢,獲取所有的用戶賬號(hào):

業(yè)務(wù)層:

    public List<UserAccount> getAllUser() {
        return accountMapper.selectList(null);
    }

控制層:

    @GetMapping("/get/all")
    public CommonResult<Object> getAllAccount() throws InvocationTargetException, IllegalAccessException {
        //查詢所有數(shù)據(jù)
        List<UserAccount> userAccountList = userService.getAllUser();
        List<AdminInfo> resultList = new ArrayList<>();
        //封裝為VO進(jìn)行展示
        for(UserAccount u:userAccountList){
            UserVo userVo = new UserVo();
            BeanUtils.copyProperties(userVo,u);
            resultList.add(userVo);
        }
        //根據(jù)序列號(hào)進(jìn)行排序,后注冊(cè)的放在最前面
        resultList.sort(new Comparator<UserVo>() {
            @Override
            public int compare(UserVo o1, UserVo o2) {
                return o2.getSerialNum() - o1.getSerialNum();
            }
        });
        return new CommonResult<>(200,"賬號(hào)列表如下:",resultList,resultList.size());
    }

然后我們就可查詢得到所有的去除了敏感信息可用于展示的用戶賬號(hào)信息。

注:此處由于業(yè)務(wù)簡單,沒有將PO對(duì)象轉(zhuǎn)換為DTO再轉(zhuǎn)換為VO。

到此這篇關(guān)于SpringBoot中VO/DTO/PO的具體使用的文章就介紹到這了,更多相關(guān)SpringBoot VO/DTO/PO內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Scala生成隨機(jī)數(shù)的方法示例

    使用Scala生成隨機(jī)數(shù)的方法示例

    這篇文章主要介紹了使用Scala生成隨機(jī)數(shù)的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • SpringBoot配置HTTPS及開發(fā)調(diào)試的操作方法

    SpringBoot配置HTTPS及開發(fā)調(diào)試的操作方法

    在實(shí)際開發(fā)過程中,如果后端需要啟用https訪問,通常項(xiàng)目啟動(dòng)后配置nginx代理再配置https,前端調(diào)用時(shí)高版本的chrome還會(huì)因?yàn)樽C書未信任導(dǎo)致調(diào)用失敗,通過摸索整理一套開發(fā)調(diào)試下的https方案,下面給大家分享SpringBoot配置HTTPS及開發(fā)調(diào)試,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • Springboot2.6.x高版本與Swagger2版本沖突問題解決方法

    Springboot2.6.x高版本與Swagger2版本沖突問題解決方法

    Spring Boot 2.6.x版本引入依賴?springfox-boot-starter?(Swagger?3.0) 后,啟動(dòng)容器會(huì)報(bào)錯(cuò),本文就介紹一下Springboot2.6.x高版本與Swagger2版本沖突問題解決方法,感興趣的可以了解一下
    2022-04-04
  • eclipse maven maven-archetype-webapp 創(chuàng)建失敗問題解決

    eclipse maven maven-archetype-webapp 創(chuàng)建失敗問題解決

    這篇文章主要介紹了eclipse maven maven-archetype-webapp 創(chuàng)建失敗問題解決的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • 解決Maven不能下載Aspose的問題

    解決Maven不能下載Aspose的問題

    這篇文章主要介紹了解決Maven不能下載Aspose的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java將Word文檔轉(zhuǎn)換為PDF文件的幾種常用方法總結(jié)

    Java將Word文檔轉(zhuǎn)換為PDF文件的幾種常用方法總結(jié)

    這篇文章主要介紹了Java將Word文檔轉(zhuǎn)換為PDF文件的四種常用方法,分別使用ApachePOI+iText、Aspose.Words?for?Java、Docx4j和JODConverter,這些庫各有優(yōu)點(diǎn),但在使用時(shí)需要注意庫與Java環(huán)境的兼容性、安裝所需依賴、轉(zhuǎn)換速度和資源消耗,需要的朋友可以參考下
    2024-10-10
  • 淺談Java線程Thread.join方法解析

    淺談Java線程Thread.join方法解析

    本篇文章主要介紹了淺談Java線程Thread.join方法解析,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • Java使用itext生成pdf標(biāo)簽的操作方法

    Java使用itext生成pdf標(biāo)簽的操作方法

    iText是著名的開放源碼的站點(diǎn)sourceforge一個(gè)項(xiàng)目,是用于生成PDF文檔的一個(gè)java類庫,通過iText不僅可以生成PDF或rtf的文檔,而且可以將XML、Html文件轉(zhuǎn)化為PDF文件,本文給大家介紹了Java使用itext生成pdf標(biāo)簽的操作方法,需要的朋友可以參考下
    2024-12-12
  • Seata?AT模式啟動(dòng)過程圖文示例詳解

    Seata?AT模式啟動(dòng)過程圖文示例詳解

    這篇文章主要為大家介紹了Seata?AT模式啟動(dòng)過程圖文示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 一文帶你徹底明白什么是Java注解

    一文帶你徹底明白什么是Java注解

    Java注解可以說是我們編碼過程中最常用的,本文將給大家介紹Java注解的概念、作用以及如何使用注解來提升代碼的可讀性和靈活性,需要的可以參考一下
    2023-05-05

最新評(píng)論