解析Orika的MapperFacade 屬性賦值的使用問題
MapperFacade 拷貝對象、拷貝集合的使用
介紹MapperFactory、MapperFacade
????????在我們實際開發(fā)中,常常會有對象與對象之間的轉(zhuǎn)化,或者把一個對象的數(shù)據(jù)轉(zhuǎn)化到另一個數(shù)據(jù)之中,如果我們手動的一個一個的set就會比較麻煩,代碼段看起來也會比較長。而Orika的MapperFacade就是解決這個問題的,實現(xiàn)對象屬性的復(fù)制。
Orika的MapperFacade的官網(wǎng):http://orika-mapper.github.io/orika-docs/intro.html
????????這里有兩個核心的類,MapperFactory 、MapperFacade。
????????MapperFactory:相當(dāng)于一個通道,無它不行,可以用來注冊字段的映射、轉(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屬性復(fù)制的時候,如果兩個對象的屬性不一樣的話,需要手動的去設(shè)置,比較麻煩。
MapperFacade的效率相對來說高一些:因為Orika的設(shè)計思路是預(yù)先通過javaassist把JavaBean之間的映射關(guān)系一次性生成目標(biāo)拷貝方法代碼。 這樣就可以避免在Bean 映射環(huán)節(jié)一次次的讀取映射規(guī)則。 從而實現(xiàn)效率上的提高。
demo測試
????????下面就寫一個demo測試一下。
第一步:maven工程的話,先導(dǎo)入依賴。不是maven的話,可以去官網(wǎng)下載相關(guān)文件。
<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(); } }
? ? ? ? 第三步:寫兩個實體類,屬性設(shè)置的有不一樣的。
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 + '}'; } }
拷貝對象
????????上面是一些前期準(zhǔn)備,在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)存在的類的屬性映射到另外一個類上(可以不存在),直接返回該類,注意 * 必須要有默認(rèn)的構(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注冊映射關(guān)系 //如果所有的字段都一樣,就不用寫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注冊映射關(guān)系 //轉(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對象即可。
到此這篇關(guān)于Orika的MapperFacade 屬性賦值的使用的文章就介紹到這了,更多相關(guān)MapperFacade 使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java equals和=,==的區(qū)別詳細(xì)介紹
這篇文章主要介紹了java equals和=,==的區(qū)別,學(xué)習(xí)Java的朋友對equals 和== 這個概念開始使用的時候會有疑問,很難辨別如何正確使用,這里幫大家詳細(xì)講解該知識點,希望大家能掌握,有需要的小伙伴可以參考下2016-10-10Springboot+TCP監(jiān)聽服務(wù)器搭建過程圖解
這篇文章主要介紹了Springboot+TCP監(jiān)聽服務(wù)器搭建過程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10這一次搞懂Spring代理創(chuàng)建及AOP鏈?zhǔn)秸{(diào)用過程操作
這篇文章主要介紹了這一次搞懂Spring代理創(chuàng)建及AOP鏈?zhǔn)秸{(diào)用過程操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08jstl標(biāo)簽基礎(chǔ)開發(fā)步驟(詳解)
下面小編就為大家?guī)硪黄猨stl標(biāo)簽基礎(chǔ)開發(fā)步驟(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05springboot 高版本后繼續(xù)使用log4j的完美解決方法
這篇文章主要介紹了 springboot 高版本后繼續(xù)使用log4j的解決方法,需要的朋友可以參考下2017-12-12淺談Mybatis Plus的BaseMapper的方法是如何注入的
我們在用的時候經(jīng)常就是生產(chǎn)自定義的Mapper繼承自BaseMapper,那么BaseMapper怎么被注入到mybatis里的,本文就詳細(xì)的介紹一下,感興趣的可以了解一下2021-09-09Java 中文字符按Unicode排序的實現(xiàn)方法
這篇文章主要介紹了Java 中文字符按Unicode排序的實現(xiàn)方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-10-10