Orika 对象复制 克隆

引入依赖

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

构造一个MapperFactory

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

注册字段映射

mapperFactory.classMap(SourceClass.class, TargetClass.class)  
   .field("firstName", "givenName")
   .field("lastName", "sirName")
   .byDefault()
   .register();

当字段名在两个实体不一致时可以通过 .field()方法进行映射,如果字段名都一样则可省略,byDefault()方法用于注册名称相同的属性,如果不希望某个字段参与映射,可以使用 exclude方法。

进行映射

MapperFacade mapper = mapperFactory.getMapperFacade();

SourceClass source = new SourceClass();  
// set some field values
...
// map the fields of 'source' onto a new instance of PersonDest
TargetClass target = mapper.map(source, TargetClass.class);  

 

示例:

实体映射

复制代码
// 实体转换
Student student = new Student("1", "name1", "email1");

// 构造一个MapperFactory
MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
// 注册字段映射
// 当字段名在两个实体不一致时可以通过 .field()方法进行映射,如果字段名都一样则可省略,byDefault()方法用于注册名称相同的属性,如果不希望某个字段参与映射,可以使用 exclude方法。
mapperFactory.classMap(Student.class, Teacher.class)
        .field("email", "emailAddress")
        .byDefault()
        .register();
// 进行映射
MapperFacade mapper = mapperFactory.getMapperFacade();
Teacher teacher = mapper.map(student, Teacher.class);
log.info("teacher:" + teacher);//teacher:Teacher(id=1, name=name1, emailAddress=email1)
复制代码

 

集合转换

复制代码
// 集合转换
Student student1 = new Student("1", "name1", "email1");
Student student2 = new Student("2", "name2", "email2");
List<Student> studentList = Lists.newArrayList(student1, student2);

// 构造一个MapperFactory
MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
// 注册字段映射
// 当字段名在两个实体不一致时可以通过 .field()方法进行映射,如果字段名都一样则可省略,byDefault()方法用于注册名称相同的属性,如果不希望某个字段参与映射,可以使用 exclude方法。
mapperFactory.classMap(Student.class, Teacher.class)
        .field("email", "emailAddress")
        .byDefault()
        .register();
// 进行映射
MapperFacade mapper = mapperFactory.getMapperFacade();
List<Teacher> teacherList = mapper.mapAsList(studentList, Teacher.class);
log.info("teacherList:" + teacherList);// teacherList:[Teacher(id=1, name=name1, emailAddress=email1), Teacher(id=2, name=name2, emailAddress=email2)]
复制代码

 

集合映射实体

复制代码
// 集合映射实体
Person person = new Person();
person.setNameParts(Lists.newArrayList("1", "name1", "email1"));

// 构造一个MapperFactory
MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
// 注册字段映射
// 当字段名在两个实体不一致时可以通过 .field()方法进行映射,如果字段名都一样则可省略,byDefault()方法用于注册名称相同的属性,如果不希望某个字段参与映射,可以使用 exclude方法。
mapperFactory.classMap(Person.class, Student.class)
        .field("nameParts[0]", "id")
        .field("nameParts[1]", "name")
        .field("nameParts[2]", "email")
        .byDefault()
        .register();
// 进行映射
MapperFacade mapper = mapperFactory.getMapperFacade();
Student student = mapper.map(person, Student.class);
log.info("student:" + student);// student:Student(id=1, name=name1, email=email1)
复制代码

 

类类型映射

复制代码
// 类类型映射
BasicPerson basicPerson = new BasicPerson();
Student student = new Student("1", "name1", "email1");
basicPerson.setStudent(student);

// 构造一个MapperFactory
MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
// 注册字段映射
// 当字段名在两个实体不一致时可以通过 .field()方法进行映射,如果字段名都一样则可省略,byDefault()方法用于注册名称相同的属性,如果不希望某个字段参与映射,可以使用 exclude方法。
mapperFactory.classMap(BasicPerson.class, Teacher.class)
        .field("student.id", "id")
        .field("student.name", "name")
        .field("student.email", "emailAddress")
        .byDefault()
        .register();
// 进行映射
MapperFacade mapper = mapperFactory.getMapperFacade();
Teacher teacher = mapper.map(basicPerson, Teacher.class);
log.info("teacher:" + teacher);// teacher:Teacher(id=1, name=name1, emailAddress=email1)
复制代码

 

多重映射

复制代码
// 多重映射
Student student1 = new Student("1", "name1", "email1");
Student student2 = new Student("2", "name2", "email2");
List<Student> studentList = Lists.newArrayList(student1, student2);

StudentGrade studentGrade = new StudentGrade();
studentGrade.setStudentGradeName("gradename1");
studentGrade.setStudentList(studentList);

// 构造一个MapperFactory
MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
// 注册字段映射
// 当字段名在两个实体不一致时可以通过 .field()方法进行映射,如果字段名都一样则可省略,byDefault()方法用于注册名称相同的属性,如果不希望某个字段参与映射,可以使用 exclude方法。
mapperFactory.classMap(StudentGrade.class, TeacherGrade.class)
        .field("studentGradeName", "teacherGradeName")
        .field("studentList", "teacherList")
        .byDefault()
        .register();
mapperFactory.classMap(Student.class, Teacher.class)
        .field("email", "emailAddress")
        .byDefault()
        .register();
// 进行映射
MapperFacade mapper = mapperFactory.getMapperFacade();
TeacherGrade teacherGrade = mapper.map(studentGrade, TeacherGrade.class);
log.info("teacherGrade:" + teacherGrade);// teacherGrade:TeacherGrade(teacherGradeName=gradename1, teacherList=[Teacher(id=1, name=name1, emailAddress=email1), Teacher(id=2, name=name2, emailAddress=email2)])
复制代码

 

附:

复制代码
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
    private String id;
    private String name;
    private String email;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Teacher {
    private String id;
    private String name;
    private String emailAddress;
}

@Data
public class Person {
    private List<String> nameParts;
}

@Data
public class BasicPerson {
    private Student student;
}

@Data
public class StudentGrade {
    private String studentGradeName;
    private List<Student> studentList;
}

@Data
public class TeacherGrade {
    private String teacherGradeName;
    private List<Teacher> teacherList;
}
复制代码

 

参考文章:http://javadaily.cn/articles/2021/09/15/1631687008282.html

posted @   草木物语  阅读(169)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示