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

posted @ 2018-02-09 11:22  Albert1024  阅读(4024)  评论(0编辑  收藏  举报