解析Orika的MapperFacade 屬性賦值的使用問題
MapperFacade 拷貝對象、拷貝集合的使用
介紹MapperFactory、MapperFacade
????????在我們實際開發(fā)中,常常會有對象與對象之間的轉(zhuǎn)化,或者把一個對象的數(shù)據(jù)轉(zhuǎn)化到另一個數(shù)據(jù)之中,如果我們手動的一個一個的set就會比較麻煩,代碼段看起來也會比較長。而Orika的MapperFacade就是解決這個問題的,實現(xiàn)對象屬性的復制。
Orika的MapperFacade的官網(wǎng):http://orika-mapper.github.io/orika-docs/intro.html
????????這里有兩個核心的類,MapperFactory 、MapperFacade。
????????MapperFactory:相當于一個通道,無它不行,可以用來注冊字段的映射、轉(zhuǎn)換器、自定義映射器、具體類型等等。

????????上面的圖片是從官網(wǎng)上截下來的,大致就是說,創(chuàng)建一個MapperFactory實例,它的作用可以用來注冊字段的映射、轉(zhuǎn)換器、自定義映射器、具體類型等等。MapperFactory的classMap方法是用來映射名稱不同的屬性,比如現(xiàn)在person類有dateTime屬性,而student類沒有dateTime屬性,但是有birth屬性,這兩個屬性雖然名字不同,但是表示的意思是一樣的,表示出生年月,此時就需要使用classMap來匹配不同屬性的映射。
而field()、byDefault()、register()的作用分別如下:

MapperFacade:它是實現(xiàn)映射過程的真正部分。有兩種映射模式:
????????模式一:map(objectA, B.class)方法:將會生成一個新的實例B,然后把實例A中的屬性賦值給實例B。所以方法是有返回值的,返回的是已經(jīng)賦值完成的實例B。
????????模式二:map(objectA, objectB)方法:A、B都是實例,不是null,然后把實例A的屬性賦值到實例B中。所以是沒有返回值的。
????????另外:MapperFacade的作用和Spring中的BeanUtils是一樣的,都是屬性賦值的,只不過BeanUtils屬性復制的時候,如果兩個對象的屬性不一樣的話,需要手動的去設置,比較麻煩。
MapperFacade的效率相對來說高一些:因為Orika的設計思路是預先通過javaassist把JavaBean之間的映射關系一次性生成目標拷貝方法代碼。 這樣就可以避免在Bean 映射環(huán)節(jié)一次次的讀取映射規(guī)則。 從而實現(xiàn)效率上的提高。
demo測試
????????下面就寫一個demo測試一下。
第一步:maven工程的話,先導入依賴。不是maven的話,可以去官網(wǎng)下載相關文件。
<dependency>
<groupId>ma.glasnost.orika</groupId>
<artifactId>orika-core</artifactId>
<version>1.4.2</version><!-- or latest version -->
</dependency>
? ? ? ? 第二步:寫一個配置類,生成MapperFactory實例。如果不寫配置的話,就直接在代碼中生成即可。
package com.lmh.config;
import ma.glasnost.orika.MapperFactory;
import ma.glasnost.orika.impl.DefaultMapperFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.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 setName(String name) {
this.name = name;
return this;
}
public Integer getAge() {
return age;
}
public Person setAge(Integer age) {
this.age = age;
return this;
}
public Date getDateTime() {
return dateTime;
}
public Person setDateTime(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 setBirth(Date birth) {
this.birth = birth;
return this;
}
public String getName() {
return name;
}
public Student setName(String name) {
this.name = name;
return this;
}
public String getGrade() {
return grade;
}
public Student setGrade(String grade) {
this.grade = grade;
return this;
}
public Integer getAge() {
return age;
}
public Student setAge(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 將一個已經(jīng)存在的類的屬性映射到另外一個類上(可以不存在),直接返回該類,注意
* 必須要有默認的構(gòu)造方法,不然會報錯
* @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").parse("2000-04-29"));
//MapperFactory 映射兩個對象之間的屬性、注冊轉(zhuǎn)換器、自定義映射器等等
mapperFactory.classMap(Person.class,Student.class)
.field("dateTime","birth") //不同屬性名的映射
.byDefault() //剩余字段(相同屬性名)的映射
.register(); //向MapperFactory注冊映射關系
//如果所有的字段都一樣,就不用寫mapperFactory.classMap()方法;
student = mapperFactory.getMapperFacade().map(person, Student.class);
System.out.println("屬性賦值之后student的屬性:"+student);
} catch (ParseException e) {
e.printStackTrace();
}
return student;
}
? ? ? ? 測試結(jié)果:

拷貝集合
????????代碼如下:
/**
* @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 = this.getPersonList();
//手動配置不一樣屬性轉(zhuǎn)換
mapperFactory.classMap(Person.class,Student.class)
.field("dateTime","birth") //不一樣字段的映射
.byDefault() //剩余字段的映射
.register(); //想MapperFacade注冊映射關系
//轉(zhuǎn)換list
List<Student> studentList = mapperFactory.getMapperFacade().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;
}
? ? ? ? 測試結(jié)果:

????????注意:如果兩個類屬性都一樣,進行屬性賦值的時候,就不需要進行字段映射了,直接通過mapperFactory獲取mapperFacade對象即可。
到此這篇關于Orika的MapperFacade 屬性賦值的使用的文章就介紹到這了,更多相關MapperFacade 使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
spring boot actuator監(jiān)控超詳細教程
Spring Boot Actuator就是一款可以幫助你監(jiān)控系統(tǒng)數(shù)據(jù)的框架,其可以監(jiān)控很多很多的系統(tǒng)數(shù)據(jù),接下來通過本文給大家介紹spring boot actuator監(jiān)控超詳細教程,感興趣的朋友一起看看吧2021-10-10
JSON反序列化Long變Integer或Double的問題及解決
這篇文章主要介紹了JSON反序列化Long變Integer或Double的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
使用Thrift實現(xiàn)跨語言RPC的調(diào)用
Thrift最大的優(yōu)勢就是可以實現(xiàn)跨語言RPC調(diào)用,尤其在一些大廠,微服務各模塊之間使用不同的語言是很常見的,本文就將使用java作為服務端,用python作為客戶端,實現(xiàn)不同語言之間的RPC調(diào)用,需要的可以參考下2023-10-10

