解析Orika的MapperFacade 属性赋值的使⽤问题
⽬录
MapperFacade 拷贝对象、拷贝集合的使⽤
demo测试
拷贝对象
拷贝集合
MapperFacade 拷贝对象、拷贝集合的使⽤
介绍MapperFactory、MapperFacade
这⾥有两个核⼼的类,MapperFactory 、MapperFacade。
MapperFactory:相当于⼀个通道,⽆它不⾏,可以⽤来注册字段的映射、转换器、⾃定义映射器、具体类型等等。
上⾯的图⽚是从官⽹上截下来的,⼤致就是说,创建⼀个MapperFactory实例,它的作⽤可以⽤来注册字段的映射、转换器、⾃定义映射器、具体类型等等。MapperFactory的classMap⽅法是⽤来映射名称不同的属性,⽐如现在person类有dateTime属性,⽽student类没有dateTime属性,但是有birth属性,这两个属性虽然名字不同,但是表⽰的意思是⼀样的,表⽰出⽣年⽉,此时就需要使⽤classMap来匹配不同属性的映射。
⽽field()、byDefault()、register()的作⽤分别如下:
MapperFacade:它是实现映射过程的真正部分。有两种映射模式:
模式⼀:map(objectA, B.class)⽅法:将会⽣成⼀个新的实例B,然后把实例A中的属性赋值给实例B。所以⽅法是有返回值的,返回的是已经赋值完成的实例B。
模式⼆:map(objectA, objectB)⽅法:A、B都是实例,不是null,然后把实例A的属性赋值到实例B中。所以是没有返回值的。
另外:MapperFacade的作⽤和Spring中的BeanUtils是⼀样的,都是属性赋值的,只不过BeanUtils属性复制的时候,如果两个对象的属性不⼀样的话,需要⼿动的去设置,⽐较⿇烦。
MapperFacade的效率相对来说⾼⼀些:因为Orika的设计思路是预先通过javaassist把JavaBean之间的映射关系⼀次性⽣成⽬标拷贝⽅法代码。这样就可以避免在Bean 映射环节⼀次次的读取映射规则。从⽽实现效率上的提⾼。
demo测试
下⾯就写⼀个demo测试⼀下。
第⼀步:maven⼯程的话,先导⼊依赖。不是maven的话,可以去官⽹下载相关⽂件。
<dependency>
<groupId>ika</groupId>
<artifactId>orika-core</artifactId>
<version>1.4.2</version><!-- or latest version -->
</dependency>
第⼆步:写⼀个配置类,⽣成MapperFactory实例。如果不写配置的话,就直接在代码中⽣成即可。package fig;
import ika.MapperFactory;
import ika.impl.DefaultMapperFactory;
import t.annotation.Bean;
import t.annotation.Configuration;
/**
* @author lmh
* @Description:
* @date 2021/12/21 14:01
*/
@Configuration
public class MapperFactoryAutowire {
@Bean
public MapperFactory getMapperFactory(){
return new DefaultMapperFactory.Builder().build();
}
}
第三步:写两个实体类,属性设置的有不⼀样的。
package com.lmh.po;
import java.util.Date;
/**
* @author lmh
* @Description:
* @date 2021/12/21 14:07
*/
public class Person {
public Person() {
}
public Person(String name, Integer age, Date dateTime) {
this.name = name;
this.age = age;
this.dateTime = dateTime;
}
private String name;
private Integer age;
private Date dateTime;
public String getName() {
return name;
}
public Person tName(String name) {
this.name = name;
return this;
}
public Integer getAge() {
return age;
}
public Person tAge(Integer age) {
this.age = age;
return this;
}
public Date getDateTime() {
return dateTime;
}
public Person tDateTime(Date dateTime) {
this.dateTime = dateTime;
return this;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", dateTime=" + dateTime +
'}';
}
}
package com.lmh.po;
import java.util.Date;
/**
* @author lmh
* @Description:
* @date 2021/12/21 14:08
*/
public class Student {
private String name;
private String grade;
private Integer age;
private Date birth;
public Date getBirth() {
return birth;
}
public Student tBirth(Date birth) {
this.birth = birth;
return this;
}
public String getName() {
return name;
}
public Student tName(String name) {
this.name = name;
return this;
}
public String getGrade() {
return grade;
}
public Student tGrade(String grade) {
return this;
}
public Integer getAge() {
return age;
}
public Student tAge(Integer age) {
this.age = age;
return this;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", grade='" + grade + '\'' +
", age=" + age +
", birth=" + birth +
'}';
}
}
拷贝对象
上⾯是⼀些前期准备,在controller中写⼀个测试⽅法测试对对象属性拷贝。
/**
* @author lmh
* @Description:
* @date 2021/12/21 14:12
*/
@RestController
public class BeanCopyController {
@Autowired
public MapperFactory mapperFactory;
/**
* @Decription 测试MapperFactory是否⽣成
* @Param null
* @Return void
* @Author lmh
* @Date 2021/12/21 14:14
*/
@RequestMapping("/createMapperFactory")
public String createMapperFactoryTest(){
System.out.println("注⼊的mapperFactory是:"+mapperFactory);
return "注⼊的mapperFactory是:"+mapperFactory;
}
/**
* @Decription 将⼀个已经存在的类的属性映射到另外⼀个类上(可以不存在),直接返回该类,注意 * 必须要有默认的构造⽅法,不然会报错
* @Param null
* @Return com.lmh.po.Student
* @Author lmh
* @Date 2021/12/21 14:27
*/
@RequestMapping("/beanCopyToBean")
public Student beanCopyToBean(){
Student student = null;
try {
Person person = new Person("lmh",21,new SimpleDateFormat("yyyy-MM-dd").par("2000-04-29"));
//MapperFactory 映射两个对象之间的属性、注册转换器、⾃定义映射器等等
mapperFactory.classMap(Person.class,Student.class)
.field("dateTime","birth") //不同属性名的映射
.byDefault() //剩余字段(相同属性名)的映射
.register(); //向MapperFactory注册映射关系
//如果所有的字段都⼀样,就不⽤写mapperFactory.classMap()⽅法;
student = MapperFacade().map(person, Student.class);
System.out.println("属性赋值之后student的属性:"+student);
} catch (ParException e) {
e.printStackTrace();
}
return student;
}
测试结果:
拷贝集合
代码如下:
/
**
* @Decription 将⼀个list映射到另⼀个list中
* @Param null
* @Return java.util.List<com.lmh.po.Student>
* @Author lmh
* @Date 2021/12/21 15:13
*/
@RequestMapping("/beanCopyToList")
public List<Student> beanCopyToList(){
List<Person> personList = PersonList();
//⼿动配置不⼀样属性转换
mapperFactory.classMap(Person.class,Student.class)
.field("dateTime","birth") //不⼀样字段的映射
.byDefault() //剩余字段的映射
.register(); //想MapperFacade注册映射关系
//转换list
List<Student> studentList = MapperFacade().mapAsList(personList, Student.class);
studentList.forEach(student -> {
System.out.println(student);
});
return studentList;
}
/**
* @Decription ⽣成personList
* @Param null
* @Return java.util.List<com.lmh.po.Person>
* @Author lmh
* @Date 2021/12/21 15:20
*/
public List<Person> getPersonList(){
List<Person> list = new ArrayList<>(5);
Person person1 = new Person("lmh1", 20, new Date());
Person person2 = new Person("lmh2", 22, new Date());
Person person3 = new Person("lmh3", 30, new Date());
Person person4 = new Person("lmh4", 14, new Date());
Person person5 = new Person("lmh5", 15, new Date());
list.add(person1);
list.add(person2);
list.add(person3);
list.add(person4);
list.add(person5);
return list;
}
测试结果:
注意:如果两个类属性都⼀样,进⾏属性赋值的时候,就不需要进⾏字段映射了,直接通过mapperFactory获取mapperFacade对象即可。
到此这篇关于Orika的MapperFacade 属性赋值的使⽤的⽂章就介绍到这了,更多相关MapperFacade 使⽤内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!