Orika JavaBean映射工具探秘

摘要:
Orika是一个简单、快速的JavaBean拷贝框架,Orika使用字节代码生成来创建具有最小开销的快速映射器。Orika试图为你做这一乏味的工作,在性能上几乎没有什么可衡量的平衡它将自动收集类的元数据来生成映射对象,这些映射对象可以一起使用,以递归地将数据从一个对象图复制到另一个对象图。Orika试图提供许多方便的功能,同时保持相对简单和开放的状态——让你有可能扩展和调整它,以满足你的需要。准备:在maven中添加依赖ma.glasnost.orikaorika-core1.4.2˂!

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 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}
  • 假设你映射的对象的一些字段的名称并不匹配,你可以通过ClassMapBuiderAPI来为这些不同的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

免责声明:文章转载自《Orika JavaBean映射工具探秘》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇js img转换base64百度地图滚轮缩放时产生位置偏移 问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

IDEA springboot+maven+mybatis pojo代码自动生成

首先创建GeneratorMapper.xml文件,让着src目录下, <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0...

MyBatis基础总结

1.1什么是MyBatis MyBatis(前身是iBatis)是一个支持普通SQL查询、存储过程以及高级映射的持久层框架, 它消除了几乎所有的JDBC代码和参数的手动设置以及对结果集的检索,并使用简单的XML或注解进行配置和原始映射, 用以将接口和Java的POJO(Plain Old Java Object,普通Java对象)映射成数据库中的记录,使得...

10、JPA_映射双向多对多的关联关系

双向多对多的关联关系 双向多对多的关联关系(抽象成A-B)具体体现:A中有B的集合的引用,同时B中也有对A的集合的引用。A、B两个实体对应的数据表靠一张中间表来建立连接关系。 同时我们还知道,双向多对多的关联关系可以拆分成三张表,两个双向多对一关联关系。拆分以后还是有一张中间表,其好处就是可以在中间表中添加某些属性用作其它。这个后面会讲解。而单纯的双向多对...

SpringBoot分层概览

从下到上依次为:数据库、Model层、Mapper层(DAO层)、Service层、Controller层、View层、用户 下边对分层进行大致的解释: 数据库 Model层:存放了页面需要传递数据对应字段的实体类,它和数据库中对应表字段的属性值保持一致。也就是说成员变量+getter/setter方法把数据库对应表中的字段映射为对象的属性。 Mapper...

Hibernate和MyBatis的对比

第一方面:开发速度的对比 就开发速度而言,Hibernate的真正掌握要比Mybatis来得难些。Mybatis框架相对简单很容易上手,但也相对简陋些。个人觉得要用好Mybatis还是首先要先理解好Hibernate。 比起两者的开发速度,不仅仅要考虑到两者的特性及性能,更要根据项目需求去考虑究竟哪一个更适合项目开发,比如:一个项目中用到的复杂查询基本没有,...

Linux系统扩容根目录磁盘空间的操作方法

一、使用背景 Linux根目录磁盘空间不够用了,当修改了虚拟机模版增加磁盘大小或者插入了一块新硬盘,但是发现系统里的大小还是没改变。 产生的原因是没有给磁盘格式化,没有增加分区。 二、操作方法 1. 查看磁盘空间大小,使用df -h 命令,发现挂载根目录节点的/dev/mapper/ubuntu14--vg-root 只有28G容量。 1 2 3 4...