Maison  >  Article  >  Java  >  Comment réaliser la conversion entre VO et DTO en Java

Comment réaliser la conversion entre VO et DTO en Java

PHPz
PHPzavant
2023-05-05 17:37:072646parcourir

    1. Contexte

    1. Les classes d'entités dans le modèle de domaine sont divisées en quatre types : VO, DTO, DO. , PO

    2. Explication détaillée

    1.VO (View Object), objet de visualisation, utilisé dans la couche de présentation, sa fonction est de mettre une page (ou un composant) spécifié ) encapsule toutes les données.

    2.DTO (Data Transfer Object), ce concept vient du modèle de conception J2EE. L'objectif initial est de fournir des entités de données à granularité grossière pour les applications distribuées EJB afin de réduire le nombre d'appels de type. , améliorant ainsi les performances des appels distribués et réduisant la charge du réseau, mais ici, je fais généralement référence aux objets de transfert de données entre la couche de présentation et la couche de service.

    3.DO (Domain Object), objet de domaine, est une entité commerciale tangible ou immatérielle abstraite du monde réel.

    4.PO (PersistentObject), objet de persistance, qui forme une relation de mappage un-à-un avec la structure de données de la couche de persistance (généralement une base de données relationnelle). base de données, alors, chaque champ (ou plusieurs) de la table de données correspond à un (ou plusieurs) attributs de PO.

    5. Exemple :

    Le backend renvoie un objet front-end, vous pouvez ***VO.java

    objet d'entité de table dao généré par mybatis, vous pouvez ****PO.java

    Généralement, PO convertit DO puis convertit DTO pour fournir des services pour les appels externes

    Note

    #🎜🎜 #PO est généralement généré automatiquement et les champs de table sont mappés un par un

    DO a généralement les mêmes champs que DO, mais de nombreux champs de type sont des énumérations, et dans certains projets, DO est une classe se terminant par Model# 🎜🎜##🎜 🎜#DTO est comme l'interface de service Web (qui fournit des services externes). Les objets de résultat renvoyés sont tous des DTO. La définition des attributs à l'intérieur est assez particulière. Elle est facile à comprendre, sûre et facile à développer. Que la relation entre DTO et DTO soit inclusive ou parallèle, elle doit être prise en compte lors de la conception. Définissez-la clairement, sinon ce sera un piège plus tard

    VO est relativement simple, il suffit de définir ce qui est nécessaire pour le front. -end display

    3. Conversion entre objets entité

    Un projet standard

    Le code regorge de classes pojo telles que VO, From, DTO , DO, etc. Ces classes ont des fonctions différentes mais les valeurs d'attribut dans les classes sont souvent exactement les mêmes. Lorsqu'il y a plusieurs attributs, c'est en effet très fatigant et prend beaucoup de temps. En fait, le puissant Spring nous a déjà préparé des outils bien pensés, qui peuvent résoudre même 30 lignes de code en une seule ligne

    4. Exemples de code spécifiques de la première méthode#🎜 🎜#

    . 1. Importer les dépendances

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>5.1.6.RELEASE</version>
    </dependency>

    2. A DTO (les objets de définition d'interface utilisent généralement DTO)

    public class TestDemoDTO{
        private String name;
        private Map<String,String> citys;
        private Date gmtStart;
        private Boolean flag;
        private Integer age;
        private List<String> types;
     
        public String getName() {
            return name;
        }
     
        public void setName(String name) {
            this.name = name;
        }
     
        public Map<String, String> getCitys() {
            return citys;
        }
     
        public void setCitys(Map<String, String> citys) {
            this.citys = citys;
        }
     
        public Date getGmtStart() {
            return gmtStart;
        }
     
        public void setGmtStart(Date gmtStart) {
            this.gmtStart = gmtStart;
        }
     
        public Boolean getFlag() {
            return flag;
        }
     
        public void setFlag(Boolean flag) {
            this.flag = flag;
        }
     
        public Integer getAge() {
            return age;
        }
     
        public void setAge(Integer age) {
            this.age = age;
        }
     
        public List<String> getTypes() {
            return types;
        }
     
        public void setTypes(List<String> types) {
            this.types = types;
        }
     
        @Override
        public String toString() {
            return "TestDemoDTO{" +
                    "name=&#39;" + name + &#39;\&#39;&#39; +
                    ", citys=" + citys +
                    ", gmtStart=" + gmtStart +
                    ", flag=" + flag +
                    ", age=" + age +
                    ", types=" + types +
                    &#39;}&#39;;
        }
    }

    3 A From (définition des paramètres d'entrée front-end From )#🎜🎜. #

    public class TestDemoFrom {
        private String name;
        private Map<String,String> citys;
        private Date gmtStart;
        private Boolean flag;
        private Integer age;
        private List<String> types;
     
        public String getName() {
            return name;
        }
     
        public void setName(String name) {
            this.name = name;
        }
     
        public Map<String, String> getCitys() {
            return citys;
        }
     
        public void setCitys(Map<String, String> citys) {
            this.citys = citys;
        }
     
        public Date getGmtStart() {
            return gmtStart;
        }
     
        public void setGmtStart(Date gmtStart) {
            this.gmtStart = gmtStart;
        }
     
        public Boolean getFlag() {
            return flag;
        }
     
        public void setFlag(Boolean flag) {
            this.flag = flag;
        }
     
        public Integer getAge() {
            return age;
        }
     
        public void setAge(Integer age) {
            this.age = age;
        }
     
        public List<String> getTypes() {
            return types;
        }
     
        public void setTypes(List<String> types) {
            this.types = types;
        }
     
        @Override
        public String toString() {
            return "TestDemoFrom{" +
                    "name=&#39;" + name + &#39;\&#39;&#39; +
                    ", citys=" + citys +
                    ", gmtStart=" + gmtStart +
                    ", flag=" + flag +
                    ", age=" + age +
                    ", types=" + types +
                    &#39;}&#39;;
        }
    }

    4.Classe de test

    public class TestDemo {
        public static void main(String[] args) {
            TestDemoFrom testDemoFrom = new TestDemoFrom();
            HashMap<String, String> map = Maps.newHashMap();
            map.put("001","北京");
            map.put("002","上海");
            map.put("003","广州");
            testDemoFrom.setCitys(map);
            testDemoFrom.setFlag(true);
            testDemoFrom.setGmtStart(new Date());
            testDemoFrom.setName("诺言");
            testDemoFrom.setAge(18);
            testDemoFrom.setTypes(Lists.newArrayList("我爱","宝贝"));
            System.out.printf(testDemoFrom.toString()+"\n");
            //下面就可以开始转化了,就一行代码
            TestDemoDTO testDemoDTO = new TestDemoDTO();
            BeanUtils.copyProperties(testDemoFrom,testDemoDTO);
     
            System.out.println(testDemoDTO.toString());
        }
    }

    5.Result

    TestDemoFrom{name='Promise', villes={001 =Pékin, 002 =Shanghai, 003=Guangzhou}, gmtStart=Vendredi 10 mai 22:37:53 CST 2019, flag=true, age=18, types=[J'aime, bébé]}

    TestDemoDTO{name= 'Promesse', villes={001=Pékin, 002=Shanghai, 003=Guangzhou}, gmtStart=Vendredi 10 mai 22:37:53 CST 2019, flag=true, age=18, types=[J'aime, bébé]}

    6. Remarque


    Faites attention à l'échec de l'affectation

    Si les noms d'attribut sont différents, l'affectation ne sera pas possible
    Si les types sont différents et les noms sont les mêmes, ce sera pareil La valeur ne sera pas attribuée

    5. Exemples de code spécifiques de la deuxième méthode (en utilisant dozer)


    1. dépendances

    <dependency>
      <groupId>net.sf.dozer</groupId>
      <artifactId>dozer</artifactId>
      <version>5.4.0</version>
    </dependency>

    2. Classe de test

    public class TestDemoDozer {
        @Test
        public void test() {
            DozerBeanMapper mapper = new DozerBeanMapper();
            TestDemoFrom testDemoFrom = new TestDemoFrom();
            HashMap<String, String> map = Maps.newHashMap();
            map.put("001","北京");
            map.put("002","上海");
            map.put("003","广州");
            testDemoFrom.setCitys(map);
            testDemoFrom.setFlag(true);
            testDemoFrom.setGmtStart(new Date());
            testDemoFrom.setName("诺言");
            testDemoFrom.setAge(18);
            testDemoFrom.setTypes(Lists.newArrayList("我爱","宝贝"));
            System.out.printf(testDemoFrom.toString()+"\n");
            // 转换
            TestDemoDTO convert = mapper.map(testDemoFrom,TestDemoDTO.class);
            System.out.println(convert);
        }
        
    }

    3 Résultat

    TestDemoFrom{name='Promise', villes={001. =Pékin, 002=Shanghai, 003=Guangzhou}, gmtStart= samedi 11 mai 00:30:02 CST 2019, flag=true, age=18, types=[J'aime, bébé]}

    TestDemoDTO{name= 'Promesse', villes={001=Pékin, 002=Shanghai, 003=Guangzhou}, gmtStart=Samedi 11 mai 00:30:02 CST 2019, flag=true, age=18, types=[J'aime, bébé]}

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer