# orika-demo
**Repository Path**: yuyanCoder/orika-demo
## Basic Information
- **Project Name**: orika-demo
- **Description**: 使用orika可以很好的完成数据的拷贝 本项目中有测试用例可以很好的理解orika的基本使用
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 5
- **Forks**: 5
- **Created**: 2020-07-10
- **Last Updated**: 2022-09-06
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# orika用户指南
## 入门
orika是最近在GitHub上比较活跃的项目 它能解决数据之间复杂的关系映射,像我们常用的Do和DTO之间的映射,都可以很方便的使用它 它的运行效率是dozer的20倍。
###导入依赖
要在项目中使用orika,需要导入依赖,下面的demo都是在springboot环境中测试的,因此确保导入了springboot依赖和启动类。
```html
ma.glasnost.orika
orika-core
1.4.2
```
建一个orika配置类 ,获取mapperFactory工厂(核心类)
```java
@Configuration //打上注解为配置类
public class OrikaConfig{
@bean //将mapper注册到bean容器中
public MapperFactory mapperFacroty(){
return new DefaultMapperFactory.Builder().build();
}
}
```
现在我们来完成一个简单的hello world。
###相同属性之间的映射
先创建俩个类 Student,StudentDto
```java
//Student
public class Student{
private String name;
private int age;
//get和set方法 构造方法
...
}
//StudentDto
public class StudentDto{
private String name;
private int age;
//get和set方法 构造方法
...
}
```
####编写测试类(第一种方法)
导入依赖
```html
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
```
代码编写
```java
@SpringBootTest
class Orika2DemoApplicationTests {
@Autowired //从bean容器中获取mapperFactory
private MapperFactory mapperFactory;
@Test
public void test(){
// 获取mapperFacade映射对象
MapperFacade mapperFacade=mapperFactory.getMapperFacade();
//创建student 并赋值
Student student=new Student("lishi",25);
//调用map() 开始映射
StudentDto studentDto=mapperFacade.map(student,StudentDto.class);
System.out.println(studentDto);
}
}
打印结果: stuidentDto("lishi",25);
```
#### 第二种方法(提高性能)
```java
@Test
public void test2(){
//使用BoundMapperFacade映射对象
BoundMapperFacade mapperFacade = mapperFactory.getMapperFacade(Student.class, StudentDto.class);
Student student = new Student("lishi", 25);
//开始映射
StudentDto studentDto = mapperFacade.map(student);
System.out.println(studentDto);
}
```
### 不相同属性名之间的映射
改变俩个类的属性值
```java
//Student
public class Student{
private String name;
private int age;
private String addr;
//get和set方法 构造方法
...
}
//StudentDto
public class StudentDto{
private String nameDto;
private int ageDto;
private String addr;
//get和set方法 构造方法
...
}
```
####编写测试类
```java
@SpringBootTest
class Orika2DemoApplicationTests {
@Autowired
private MapperFactory mapperFactory;
@Test
public void test(){
//使用field将双方名字相对应,若有多个不同可连续使用field, 使用byDefault将其余相同名字的自动拷贝
mapperFactory.classMap(Student.class, StudentDto.class)
.field("name","nameDto")
.field("age","ageDto")
.byDefault()
.register();
//获取映射器
MapperFacade mapperFacade = mapperFactory.getMapperFacade();
Student student = new Student("lishi", 25,"beijing");
//开始映射
StudentDto studentDto = mapperFacade.map(student, StudentDto.class);
System.out.println(studentDto);
}
}
测试结果:
StudentDto(nameDto=lishi, ageDto=25, addr=beijing)
```
---
### 多个实体类之间的映射
实体类
```java
//Student
public class Student {
private String name;
private int age;
private String addr;
}
//StudentDto
public class StudentDto {
private String nameDto;
private int ageDto;
private String addr;
private String clazzName; //映射CLazz 中的ClazzName
}
//Clazz
public class Clazz {
private String num;
private String ClazzName;
}
```
#### 编写测试类
```java
@Test
public void test4(){
//使用field将双方名字相对应,若有多个不同可连续使用field, 使用byDefault将其余相同名字的自动拷贝
mapperFactory.classMap(Student.class, StudentDto.class)
.field("name","nameDto")
.field("age","ageDto")
.byDefault()
.register();
//获取映射器
MapperFacade mapperFacade = mapperFactory.getMapperFacade();
Student student = new Student("lishi", 25,"beijing");
Clazz clazz = new Clazz("0236", "android");
StudentDto studentDto = new StudentDto();
//复制student
mapperFacade.map(student, studentDto);
//复制clazz
mapperFacade.map(clazz,studentDto);
System.out.println(studentDto);
}
测试结果
StudentDto(nameDto=lishi, ageDto=25, addr=beijing, clazzName=android)
```
###list集合与list集合之间的映射
#### 相同属性
编写实体类
```java
public class Student {
private String name;
private int age;
private String addr;
}
public class StudentDto {
private String name;
private int age;
private String addr;
}
```
编写测试类
```java
/***
* List 和List之间的映射
*/
@Test
public void test2(){
//
MapperFacade mapperFacade = mapperFactory.getMapperFacade();
Student student = new Student("lishi", 25,"beijing");
Student student2 = new Student("wangwu", 25,"jiangxi");
List students = Arrays.asList(student, student2);
//
List studentDtos = mapperFacade.mapAsList(students, StudentDto.class);
System.out.println(studentDtos);
}
测试结果:
[StudentDto(name=lishi, age=25, addr=beijing), StudentDto(name=wangwu, age=25, addr=jiangxi)]
```
#### 不同属性
编写实体类
```java
//Student
public class Student {
private String name;
private int age;
private String addr;
}
//StudentDto
public class StudentDto {
private String nameDto;
private int ageDto;
private String addr;
}
```
编写测试类
```java
@Test
public void test3(){
// 使用field将双方名字相对应
mapperFactory.classMap(Student.class,StudentDto.class)
.field("name","nameDto")
.field("age","ageDto")
.byDefault()
.register();
MapperFacade mapperFacade = mapperFactory.getMapperFacade();
Student student = new Student("lishi", 25,"beijing");
Student student2 = new Student("wangwu", 25,"jiangxi");
List students = Arrays.asList(student, student2);
//
List studentDtos = mapperFacade.mapAsList(students, StudentDto.class);
System.out.println(studentDtos);
}
测试结果:
[StudentDto(name=lishi, age=25, addr=beijing), StudentDto(name=wangwu, age=25, addr=jiangxi)]
```
### 类中属性到实体的映射
编写实体类 将Student中的name数据复制到StudentDto 中
```java
public class Name{
private String name;
private int age;
}
public class Student {
private Name name;
}
public class StudentDto {
private String name;
private int age;
}
```
编写测试类
```java
@Test
public void test6(){
//可以直接通过.符号来映射名字
mapperFactory.classMap(Student.class,StudentDto.class)
.field("names.name","name")
.field("names.age","age")
.register();
MapperFacade mapperFacade = mapperFactory.getMapperFacade();
Student student = new Student();
student.setNames(new Name("lishi",25));
StudentDto map = mapperFacade.map(student, StudentDto.class);
System.out.println(map);
}
测试结果
StudentDto(name=lishi, age=25)
```