天天看點

Orika JavaBean映射工具探秘

Orika是一個簡單、快速的JavaBean拷貝架構,Orika使用位元組代碼生成來建立具有最小開銷的快速映射器。

關于:

作為開發人員,我們必須為業務問題提供解決方案,我們希望利用我們的時間來做真正重要的事情。在我們的時代,企業應用程式變得越來越複雜,有大量的體系結構和設計限制。

設計的限制會産生大量的機械工作。許多開源項目都在我們的手中,有一些很好的工具來面對這樣的複雜性,比如,Guice,Hibernate,Wicket。我們有很多可用的選項來解決整個問題的每個部分。然而,所有這些不同的工具/架構/庫,是很常見的,它通常需要我們把對象轉換格式化,以适應不同的api,甚至我們可能是因為自己的設計原因需要在不同的業務層之間轉換格式;為了完成這一任務,我們需要編寫映射代碼來将值從一種類型複制到另一種類型。

在一個中型到大型的項目中,這樣的映射代碼可以達到相當大的工作量(枯燥的)工作,而這些工作很難維護、測試和調試。

Orika試圖為你做這一乏味的工作,在性能上幾乎沒有什麼可衡量的平衡

它将自動收集類的中繼資料來生成映射對象,這些映射對象可以一起使用,以遞歸地将資料從一個對象圖複制到另一個對象圖。Orika試圖提供許多友善的功能,同時保持相對簡單和開放的狀态——讓你有可能擴充和調整它,以滿足你的需要。

準備:

  • 在maven中添加依賴
<dependency>
   <groupId>ma.glasnost.orika</groupId>
   <artifactId>orika-core</artifactId>
   <version>1.4.2</version><!-- or latest version -->
</dependency>
           

  

使用:

  • 建立2個用于測試的Java Bean
1 public class Person {
 2     private Integer id;
 3     private String name;
 4     private Integer sex;
 5 
 6     private String ext1;
 7 
 8     public String getExt1() {
 9         return ext1;
10     }
11 
12     public void setExt1(String ext1) {
13         this.ext1 = ext1;
14     }
15 
16     public Integer getId() {
17         return id;
18     }
19 
20     public void setId(Integer id) {
21         this.id = id;
22     }
23 
24     public String getName() {
25         return name;
26     }
27 
28     public void setName(String name) {
29         this.name = name;
30     }
31 
32     public Integer getSex() {
33         return sex;
34     }
35 
36     public void setSex(Integer sex) {
37         this.sex = sex;
38     }
39 
40 }      
1 public class PersonDTO {
 2     private Integer id;
 3     private String name;
 4     private Integer sex;
 5 
 6     private String ext2;
 7 
 8     public String getExt2() {
 9         return ext2;
10     }
11 
12     public void setExt2(String ext2) {
13         this.ext2 = ext2;
14     }
15 
16     public Integer getId() {
17         return id;
18     }
19 
20     public void setId(Integer id) {
21         this.id = id;
22     }
23 
24     public String getName() {
25         return name;
26     }
27 
28     public void setName(String name) {
29         this.name = name;
30     }
31 
32     public Integer getSex() {
33         return sex;
34     }
35 
36     public void setSex(Integer sex) {
37         this.sex = sex;
38     }
39 
40     
41 }      
  • 普通映射
1 public class OrikaTest {
 2     public static void main(String[] args) {
 3         MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
 4         MapperFacade mapper = mapperFactory.getMapperFacade();
 5 
 6         Person person = new Person();
 7         person.setId(1);
 8         person.setName("小王");
 9         person.setSex(1);
10         person.setExt1("ext1");
11 
12         PersonDTO personDTO = mapper.map(person, PersonDTO.class);
13         System.out.println(JSON.toJSONString(personDTO));
14     }
15 
16 }

輸出結果:{"id":1,"name":"小王","sex":1}      
  • 假設你映射的對象的一些字段的名稱并不比對,你可以通過ClassMapBuider API來為這些不同的fields注冊映射關系:
1 public class OrikaTest {
 2     public static void main(String[] args) {
 3         MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
 4         mapperFactory.classMap(Person.class, PersonDTO.class).field("ext1", "ext2").byDefault().register();
 5         MapperFacade mapper = mapperFactory.getMapperFacade();
 6 
 7         Person person = new Person();
 8         person.setId(1);
 9         person.setName("小王");
10         person.setSex(1);
11         person.setExt1("ext...");
12 
13         PersonDTO personDTO = mapper.map(person, PersonDTO.class);
14         System.out.println(JSON.toJSONString(personDTO));
15     }
16 
17 }

      

輸出結果:{"ext2":"ext...","id":1,"name":"小王","sex":1}

  • 假設你映射的對象中有的字段你不想copy,你可以通過exclude進行過濾
1 public class OrikaTest {
 2     public static void main(String[] args) {
 3         MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
 4         mapperFactory.classMap(PersonDTO.class, Person.class).exclude("sex").byDefault().register();
 5         MapperFacade mapper = mapperFactory.getMapperFacade();
 6 
 7         Person person = new Person();
 8         person.setId(1);
 9         person.setName("小王");
10         person.setSex(1);
11         
12         PersonDTO personDTO = mapper.map(person, PersonDTO.class);
13         System.out.println(JSON.toJSONString(personDTO));
14     }
15 
16 }

輸出結果:{"id":1,"name":"小王"}      

Orika官網:http://orika-mapper.github.io/orika-docs/index.html

轉載于:https://www.cnblogs.com/albert1024/p/8434741.html