Orika是一个简单、快速的JavaBean拷贝框架,Orika使用字节代码生成来创建具有最小开销的快速映射器。
关于:
作为开发人员,我们必须为业务问题提供解决方案,我们希望利用我们的时间来做真正重要的事情。在我们的时代,企业应用程序变得越来越复杂,有大量的体系结构和设计约束。
设计的约束会产生大量的机械工作。许多开源项目都在我们的手中,有一些很好的工具来面对这样的复杂性,比如,Guice,Hibernate,Wicket。我们有很多可用的选项来解决整个问题的每个部分。然而,所有这些不同的工具/框架/库,是很常见的,它通常需要我们把对象转换格式化,以适应不同的api,甚至我们可能是因为自己的设计原因需要在不同的业务层之间转换格式;为了完成这一任务,我们需要编写映射代码来将值从一种类型复制到另一种类型。
在一个中型到大型的项目中,这样的映射代码可以达到相当大的工作量(枯燥的)工作,而这些工作很难维护、测试和调试。
Orika试图为你做这一乏味的工作,在性能上几乎没有什么可衡量的平衡
它将自动收集类的元数据来生成映射对象,这些映射对象可以一起使用,以递归地将数据从一个对象图复制到另一个对象图。Orika试图提供许多方便的功能,同时保持相对简单和开放的状态——让你有可能扩展和调整它,以满足你的需要。
准备:
在maven中添加依赖
ma.glasnost.orika
orika-core
1.4.2
使用:
创建2个用于测试的Java Bean
1 public classPerson {2 privateInteger id;3 privateString name;4 privateInteger sex;5
6 privateString ext1;7
8 publicString getExt1() {9 returnext1;10 }11
12 public voidsetExt1(String ext1) {13 this.ext1 =ext1;14 }15
16 publicInteger getId() {17 returnid;18 }19
20 public voidsetId(Integer id) {21 this.id =id;22 }23
24 publicString getName() {25 returnname;26 }27
28 public voidsetName(String name) {29 this.name =name;30 }31
32 publicInteger getSex() {33 returnsex;34 }35
36 public voidsetSex(Integer sex) {37 this.sex =sex;38 }39
40 }
1 public classPersonDTO {2 privateInteger id;3 privateString name;4 privateInteger sex;5
6 privateString ext2;7
8 publicString getExt2() {9 returnext2;10 }11
12 public voidsetExt2(String ext2) {13 this.ext2 =ext2;14 }15
16 publicInteger getId() {17 returnid;18 }19
20 public voidsetId(Integer id) {21 this.id =id;22 }23
24 publicString getName() {25 returnname;26 }27
28 public voidsetName(String name) {29 this.name =name;30 }31
32 publicInteger getSex() {33 returnsex;34 }35
36 public voidsetSex(Integer sex) {37 this.sex =sex;38 }39
40
41 }
普通映射
1 public classOrikaTest {2 public static voidmain(String[] args) {3 MapperFactory mapperFactory = newDefaultMapperFactory.Builder().build();4 MapperFacade mapper =mapperFactory.getMapperFacade();5
6 Person person = newPerson();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 classOrikaTest {2 public static voidmain(String[] args) {3 MapperFactory mapperFactory = newDefaultMapperFactory.Builder().build();4 mapperFactory.classMap(Person.class, PersonDTO.class).field("ext1", "ext2").byDefault().register();5 MapperFacade mapper =mapperFactory.getMapperFacade();6
7 Person person = newPerson();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 classOrikaTest {2 public static voidmain(String[] args) {3 MapperFactory mapperFactory = newDefaultMapperFactory.Builder().build();4 mapperFactory.classMap(PersonDTO.class, Person.class).exclude("sex").byDefault().register();5 MapperFacade mapper =mapperFactory.getMapperFacade();6
7 Person person = newPerson();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