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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律