简介

Orika是一个JavaBean映射框架,它递归地将数据从一个对象复制到另一个对象。它在开发多层应用程序时非常有用。

Orika使用字节代码生成来创建开销最小的快速映射程序。

 <dependency><groupId>ma.glasnost.orika</groupId><artifactId>orika-core</artifactId><version>1.5.2</version></dependency>

使用

相同字段bean映射


MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
//MapperFacade
@Test
public void givenSrcAndDest_whenMaps_thenCorrect() {mapperFactory.classMap(Source.class, Dest.class);MapperFacade mapper = mapperFactory.getMapperFacade();Source src = new Source("Baeldung", 10);Dest dest = mapper.map(src, Dest.class);assertEquals(dest.getAge(), src.getAge());assertEquals(dest.getName(), src.getName());
}//BoundMapperFacade(较快)
@Test
public void givenSrcAndDest_whenMapsUsingBoundMapperInReverse_thenCorrect() {BoundMapperFacade<Source, Dest> boundMapper = mapperFactory.getMapperFacade(Source.class, Dest.class);Dest src = new Dest("baeldung", 10);Source dest = boundMapper.mapReverse(src);assertEquals(dest.getAge(), src.getAge());assertEquals(dest.getName(), src.getName());
}

不同字段bean映射

//指定不同字段
@Test
public void givenSrcAndDestWithDifferentFieldNames_whenMaps_thenCorrect() {mapperFactory.classMap(Personne.class, Person.class).field("nom", "name").field("surnom", "nickname").byDefault().register();//注册不同的字段名MapperFacade mapper = mapperFactory.getMapperFacade();Personne frenchPerson = new Personne("Claire", "cla", 25);Person englishPerson = mapper.map(frenchPerson, Person.class);assertEquals(englishPerson.getName(), frenchPerson.getNom());assertEquals(englishPerson.getNickname(), frenchPerson.getSurnom());assertEquals(englishPerson.getAge(), frenchPerson.getAge());
}//排查字段字段
//因为我们在配置排除了nom字段映射,所以单元测试中第一个行name值断言为null。
@Test
public void givenSrcAndDest_whenCanExcludeField_thenCorrect() {mapperFactory.classMap(Personne.class, Person.class).exclude("nom").field("surnom", "nickname").field("age", "age").register();MapperFacade mapper = mapperFactory.getMapperFacade();Personne frenchPerson = new Personne("Claire", "cla", 25);Person englishPerson = mapper.map(frenchPerson, Person.class);assertEquals(null, englishPerson.getName());assertEquals(englishPerson.getNickname(), frenchPerson.getSurnom());assertEquals(englishPerson.getAge(), frenchPerson.getAge());
}

List属性映射

@Test
public void givenSrcWithListAndDestWithPrimitiveAttributes_whenMaps_thenCorrect() {mapperFactory.classMap(PersonNameList.class, PersonNameParts.class).field("nameList[0]", "firstName").field("nameList[1]", "lastName").register();MapperFacade mapper = mapperFactory.getMapperFacade();List<String> nameList = Arrays.asList(new String[] { "Sylvester", "Stallone" });PersonNameList src = new PersonNameList(nameList);PersonNameParts dest = mapper.map(src, PersonNameParts.class);assertEquals(dest.getFirstName(), "Sylvester");assertEquals(dest.getLastName(), "Stallone");
}

Map属性映射

@Test
public void givenSrcWithMapAndDestWithPrimitiveAttributes_whenMaps_thenCorrect() {mapperFactory.classMap(PersonNameMap.class, PersonNameParts.class).field("nameMap['first']", "firstName").field("nameMap[\"last\"]", "lastName").register();MapperFacade mapper = mapperFactory.getMapperFacade();Map<String, String> nameMap = new HashMap<>();nameMap.put("first", "Leornado");nameMap.put("last", "DiCaprio");PersonNameMap src = new PersonNameMap(nameMap);PersonNameParts dest = mapper.map(src, PersonNameParts.class);assertEquals(dest.getFirstName(), "Leornado");assertEquals(dest.getLastName(), "DiCaprio");
}

对象属性映射

@Test
public void givenSrcWithNestedFields_whenMaps_thenCorrect() {mapperFactory.classMap(PersonContainer.class, PersonNameParts.class).field("name.firstName", "firstName").field("name.lastName", "lastName").register();MapperFacade mapper = mapperFactory.getMapperFacade();PersonContainer src = new PersonContainer(new Name("Nick", "Canon"));PersonNameParts dest = mapper.map(src, PersonNameParts.class);assertEquals(dest.getFirstName(), "Nick");assertEquals(dest.getLastName(), "Canon");
}

Null控制

全局

MapperFactory mapperFactory = new DefaultMapperFactory.Builder().mapNulls(false).build();

局部

//映射null值可以通过ClassMapBuilder类mapNulls(true|false)方法进行控制,或 mapNullsInReverse(true|false)方法进行反向映射控制
@Test
public void givenSrcWithNullAndLocalConfigForNoNull_whenFailsToMap_ThenCorrect() {mapperFactory.classMap(Source.class, Dest.class).field("age", "age").mapNulls(false).field("name", "name").byDefault().register();MapperFacade mapper = mapperFactory.getMapperFacade();Source src = new Source(null, 10);Dest dest = new Dest("Clinton", 55);mapper.map(src, dest);assertEquals(dest.getAge(), src.getAge());assertEquals(dest.getName(), "Clinton");
}

字段

//配置仅影响name字段
@Test
public void givenSrcWithNullAndFieldLevelConfigForNoNull_whenFailsToMap_ThenCorrect() {mapperFactory.classMap(Source.class, Dest.class).field("age", "age").fieldMap("name", "name").mapNulls(false).add().byDefault().register();MapperFacade mapper = mapperFactory.getMapperFacade();Source src = new Source(null, 10);Dest dest = new Dest("Clinton", 55);mapper.map(src, dest);assertEquals(dest.getAge(), src.getAge());assertEquals(dest.getName(), "Clinton");
}

Java_JavaBean映射框架Orika相关推荐

  1. 对象映射框架MapStruct与orika的简单使用

    对象映射框架MapStruct与orika 1.介绍 1.1 MapStruct MapStruct 是一个 Java注释处理器,用于生成类型安全的 bean 映射类. 您所要做的就是定义一个映射器接 ...

  2. 开源实体映射框架EmitMapper介绍

    综述 EmitMapper是一个开源实体映射框架,地址:http://emitmapper.codeplex.com/. EmitMapper映射效率比较高,接近硬编码.EmitMapper采用emi ...

  3. MyBatis简介——半自动的持久化层框架(SQL映射框架)|| 支持定制化sql

    MyBatis简介 1.MyBatis:和数据库进行交互:持久化层框架(SQL映射框架): 1).从原始的JDBC-----dbutils(QueryRunner)-------JdbcTemplat ...

  4. MyBatis是持久化层框架(SQL映射框架)-操作数据库

    MyBatis是持久化层框架(SQL映射框架)-操作数据库 1.环境搭建 1).创建一个java工程: 2).创建测试库,测试表,以及封装数据的javaBean,和操作数据库的dao接口 创建表:自己 ...

  5. 可能是.NET领域性能最好的对象映射框架——Mapster

    我之前文章提到过 MediatR 的作者 Jimmy Bogard,他也是大名鼎鼎的对象映射框架 AutoMapper 的作者.AutoMapper 的功能强大,在 .NET 领域的开发者中有非常高的 ...

  6. 使用iBatis数据映射框架吧

    如果您厌烦了编写 JDBC,可以考虑使用另一个功能丰富的数据映射框架 iBatis,它能够实现大多数同样的好处,并且只需要编写非常少的代码. 引言 对象关系映射程序(Object Relational ...

  7. android对象关系映射框架ormlite之一对多(OneToMany)

    前两天,用ormlite对单张表进行了基本的操作,但是,我们知道通常情况对于单张表格进行操作在实际情况中很前两天不现实,那么ormlite能否像Hibenate那样实现多张表之间的一对多,多对多(即O ...

  8. SpringBoot 整合 Dozer 映射框架

    SpringBoot 整合 Dozer 映射框架 1. Dozer 介绍 2. 为什么要使用映射框架 Dozer 3. Dozer 映射框架的使用 1. Dozer 介绍 Dozer 是一个 Java ...

  9. ORM映射框架总结--数据库操作库(精修版)

    1.       ORM数据库操作原理 前面已经介绍过了个人ORM映射框架中的三个核心库: 实体-数据库 映射特性关系: http://www.cnblogs.com/qingyuan/archive ...

最新文章

  1. HDU1201 18岁生日【日期计算】
  2. 冒泡排序_python实现冒泡排序
  3. MySQL 导致 CPU 消耗过大,如何优化
  4. 中国计算机学会CCF推荐国际学术会议和期刊目录-人工智能
  5. python中的Lock与RLock
  6. 国内人工玻璃体和日本人工玻璃体的区别
  7. 6s android,Android死忠粉自述为何必买iPhone 6S
  8. qq浏览器主页_讨论|360、金山毒霸、浏览器主页劫持
  9. mysqldump方式导出mysql
  10. 人工智能与机器学习大牛们的blog
  11. python编程读取文件内容_python编程从入门到实践:读取整个文件和创建包含文件各行的内容...
  12. 十个最好的免费杀毒软件
  13. 微信PC版应用双开,一台计算机两个微信号
  14. 海外邮件收发阻碍多?网易企业邮箱为您保驾护航【网易企业邮箱怎么申请】
  15. 叶笑嘴角露出来一个不知是什么意味的笑容
  16. RSF 分布式服务框架设计
  17. win7计算机睡眠快捷键,Win7系统在桌面创建睡眠模式快捷键的方法
  18. 深入理解Android相机体系结构之九
  19. uarl 1019 涂色
  20. Nginx sendfile作用

热门文章

  1. 理解 Git 分支管理最佳实践
  2. 他,生物系毕业,刚入职连 Java 都没听过,却在马云的要求下,三周写出淘宝网雏形......
  3. Android EditText属性总结
  4. JAVA 数组的输出的三种方式
  5. Chrome浏览器接口调试插件
  6. spring boot快速入门
  7. Java上传文件到数据库
  8. 用python函数画德国国旗代码_用Python的turtle模块画国旗
  9. 设计模式--工厂模式(六)
  10. 向量空间、列空间和零空间