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
