Orika是什么
Orika是一个简单、快速的JavaBean拷贝框架,它能够递归地将数据从一个JavaBean复制到另一个JavaBean,这在多层应用开发中是非常有用的。
为什么要使用Orika
Orika用于简化多层之间的对象映射,避免苦苦挣扎于手工编码和基于反射的映射。
Orika致力于提供一个全面、有效、强大的Java Bean映射解决方案。Orika关注尽可能地自动化,同时根据需要提供配置和扩展实现定制。
Orika为开发者提供了如下功能:
1.映射复杂的、深层次结构性对象。
2.通过将嵌套属性映射到顶级属性,“压平”或“展开”对象,反之亦然。
3.自动创建映射,并且在部分或所有映射上自定义。
4.创建转换器,以完全控制对象图中的任何特定对象集合的映射——按类型,甚至是通过特定的属性名。
5.处理代理或增强对象(如Hibernate或各种模拟框架)
6.用一个配置应用双向映射。
7.为一个目标抽象类或接口映射到具体的实现类。
8.映射POJO属性到Lists, Arrays, and Maps。
如何使用Orika
Orika使用字节代码生成来创建具有最小开销的快速映射器。
示例
<dependency>
<groupId>ma.glasnost.orika</groupId>
<artifactId>orika-core</artifactId>
<version1.4.5</version>
</dependency>
@Configuration
public class OrikaBeanMapperConfig {
@Bean
public OrikaBeanMapper getOrikaBeanMapper(){
OrikaBeanMapper beanMapper=new OrikaBeanMapper();
beanMapper.setBasePackage("com.*");
return beanMapper;
}
}
public class OrikaMapperUtil {
/**
*
* @param source 要复制的对象实例
* @param targetCls 要生成的对象类型
* @param sourceProperties 源对象的属性名数组
* @param targetProperies 目标对象的属性名数组
* @param <T> 泛型
* @param <E> 泛型
* @return
*/
public static <T,E> E mapObject( T source, Class<E> targetCls, String[] sourceProperties, String[] targetProperies) {
if(null == sourceProperties || null == targetProperies || sourceProperties.length != targetProperies.length)
{
throw new RuntimeException("缺失属性映射关系");
}
DefaultMapperFactory orikaFactory = new DefaultMapperFactory.Builder().build();
ClassMapBuilder<?, E> orikaClassBuilder = orikaFactory.classMap( source.getClass(), targetCls);
for(int i = 0; i < sourceProperties.length; i++)
{
orikaClassBuilder.field(sourceProperties[i], targetProperies[i]);
}
orikaClassBuilder.byDefault().register();
E targetIntance = orikaFactory.getMapperFacade().map(source, targetCls);
return targetIntance;
}
public class ShopDto {
private Integer userId;
private String shopName;
private String shopIntro;
public AppShop transFromToEntity() {
String[] sourceProperties = new String[]{"shopName", "shopIntro"};
String[] targetProperties = new String[]{"name", "intro"};
return OrikaMapperUtil.mapObject(this, AppShop.class, sourceProperties, targetProperties);
}
}
@Entity
@Table(name = "shop")
public class Shop {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
private Integer userId;
private String name;
private String intro;
}
@RestController
@RequestMapping("/Shop")
public class ShopController {
@PostMapping("/Info")
public JsonResult saveShopInfo(ShopDto dto) {
Shop shop = dto.transFromToEntity();
}