MapStruct實(shí)體轉(zhuǎn)換及List轉(zhuǎn)換的方法講解
開發(fā)中,我們經(jīng)常需要將PO轉(zhuǎn)DTO、DTO轉(zhuǎn)PO等一些實(shí)體間的轉(zhuǎn)換。比較出名的有BeanUtil 和ModelMapper等,它們使用簡(jiǎn)單,但是在稍顯復(fù)雜的業(yè)務(wù)場(chǎng)景下力不從心。MapStruct這個(gè)插件可以用來處理domin實(shí)體類與model類的屬性映射,可配置性強(qiáng)。只需要定義一個(gè) Mapper 接口,MapStruct 就會(huì)自動(dòng)實(shí)現(xiàn)這個(gè)映射接口,避免了復(fù)雜繁瑣的映射實(shí)現(xiàn)。MapStruct官網(wǎng)地址: http://mapstruct.org/
引入依賴
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.1.0.Final</version>
</dependency>
需求
我們假設(shè)有學(xué)生student 類 需要轉(zhuǎn)換成 用戶 user 類,將學(xué)生信息存入用戶信息庫
此時(shí)Student 類內(nèi)容如下:
public class Student {
private Integer id;
private String name;
private Integer age;
private String sex;
//setters, getters, toString() 方法此處省略不寫,但是實(shí)際開發(fā)需要寫的哦
}
此時(shí)User 類內(nèi)容如下:
public class User {
private Integer id;
private String name;
private Integer age;
private String sex;
//setters, getters, toString() 方法此處省略不寫,但是實(shí)際開發(fā)需要寫的哦
}
轉(zhuǎn)換model
此時(shí) Student 和 User 的屬性名字都相同那么轉(zhuǎn)換接口就是
import org.mapstruct.Mapper;
@Mapper(componentModel = "spring")
public interface UserMapping {
/**
* Student 轉(zhuǎn)化為 User
* @param Student
* @return
*/
User studentToUser(Student student);
}
程序運(yùn)行前要先編譯 mvn clean compile , 從而mapstruct框架生成UserMappingImpl 實(shí)現(xiàn)類。
轉(zhuǎn)換model 屬性不匹配
如果 User 和 Student 的屬性名不對(duì)應(yīng)例如:
此時(shí)Student 類內(nèi)容如下:
public class Student {
private Integer id;
private String sname;
private Integer age;
private String sex;
//setters, getters, toString() 方法此處省略不寫,但是實(shí)際開發(fā)需要寫的哦
}
此時(shí)User 類內(nèi)容如下:
public class User {
private Integer id;
private String uname;
private Integer age;
private String sex;
//setters, getters, toString() 方法此處省略不寫,但是實(shí)際開發(fā)需要寫的哦
}
那么轉(zhuǎn)換接口為
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
@Mapper(componentModel = "spring")
public interface UserMapping {
/**
* Student 轉(zhuǎn)化為 User
* @param Student
* @return
*/
@Mappings({
@Mapping(target = "uname", source = "sname")
// 多個(gè)屬性不對(duì)應(yīng)可以用 "," 隔開編寫多個(gè)@Mapping
// ,@Mapping(target = "uname", source = "sname")
})
User studentToUser(Student student);
}
轉(zhuǎn)換model 屬性類型不匹配
比如說user 類的sex字段類型改為boolean
此時(shí)User 類內(nèi)容如下:
public class User {
private Integer id;
private String uname;
private Integer age;
private boolean sex;
//setters, getters, toString() 方法此處省略不寫,但是實(shí)際開發(fā)需要寫的哦
}
這個(gè)轉(zhuǎn)換需求有點(diǎn)變態(tài),所以 需要我門自己寫個(gè)轉(zhuǎn)換類
public class UserTransform {
public String booleanToString(boolean value){
if(value){
return "男";
}
return "女";
}
public boolean strToBoolean(String str){
if ("男".equals(str)) {
return true;
}
return false;
}
}
那么轉(zhuǎn)換接口為(使用 UserTransform.class 類)
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
@Mapper(componentModel = "spring",uses = UserTransform.class)
public interface UserMapping {
/**
* Student 轉(zhuǎn)化為 User
* @param Student
* @return
*/
@Mappings({
@Mapping(target = "uname", source = "sname")
// 多個(gè)屬性不對(duì)應(yīng)可以用 "," 隔開編寫多個(gè)@Mapping
// ,@Mapping(target = "uname", source = "sname")
})
User studentToUser(Student student);
}
轉(zhuǎn)換list
當(dāng)user 和 student 都是集合形式list 時(shí)應(yīng)當(dāng)如下轉(zhuǎn)換
轉(zhuǎn)化 List<> 集合時(shí)必須有 實(shí)體轉(zhuǎn)化,因?yàn)樵趯?shí)現(xiàn)中,List 轉(zhuǎn)換是 for循環(huán)調(diào)用 實(shí)體轉(zhuǎn)化的。所以當(dāng)屬性名不對(duì)應(yīng)時(shí),應(yīng)該在 實(shí)體轉(zhuǎn)化進(jìn)行 @Mappings 的屬性名映射配置,然后list的轉(zhuǎn)換也會(huì)繼承這和屬性的映射。
例如 屬性名相同
import org.mapstruct.Mapper;
@Mapper(componentModel = "spring")
public interface UserMapping {
/**
* Student 轉(zhuǎn)化為 User
* @param Student
* @return
*/
User studentToUser(Student student);
/**
* Students 轉(zhuǎn)化為 Users
* @param Students
* @return
*/
List<User> studentsToUsers(List<Student> students);
屬性名不同:
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
@Mapper(componentModel = "spring")
public interface UserMapping {
/**
* Student 轉(zhuǎn)化為 User
* @param Student
* @return
*/
@Mappings({
@Mapping(target = "uname", source = "sname")
// 多個(gè)屬性不對(duì)應(yīng)可以用 "," 隔開編寫多個(gè)@Mapping
// ,@Mapping(target = "uname", source = "sname")
})
User studentToUser(Student student);
/**
* 此時(shí) studentsToUsers 的實(shí)現(xiàn)為循環(huán)調(diào)用 studentToUser 并繼承了 studentToUser 的屬性映射
* Students 轉(zhuǎn)化為 Users
* @param Students
* @return
*/
List<User> studentsToUsers(List<Student> students);
}
展示自動(dòng)生成的 UserMappingImpl 實(shí)現(xiàn)(此類為 執(zhí)行 mvn clean compile 后自動(dòng)生成)
@Component
public class UserMappingImpl implements UserMapping {
@Override
public User studentToUser(student student) {
if ( student == null ) {
return null;
}
User user = new User();
User.setId(student.getId() );
User.setName(student.getName() );
// 如果配置了屬性映射則為
//User.setUname(student.getSname() );
User.setSex(student.getSex() );
User.setAge(student.getAge() );
return user;
}
@Override
public List<User> studentsToUsers(List<student> students) {
if ( students == null ) {
return null;
}
List<User> list = new ArrayList<User>();
for ( student student : students ) {
list.add( studentToUser( student ) );
}
return list;
}
}
參考資料 :http://www.dhdzp.com/article/157763.htm
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
idea2019導(dǎo)入maven項(xiàng)目中的某些問題及解決方法
這篇文章主要介紹了idea2019導(dǎo)入maven項(xiàng)目中的某些問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
SpringBoot多數(shù)據(jù)源配置的全過程記錄
在用SpringBoot開發(fā)項(xiàng)目時(shí),隨著業(yè)務(wù)量的擴(kuò)大,我們通常會(huì)進(jìn)行數(shù)據(jù)庫拆分或是引入其他數(shù)據(jù)庫,從而我們需要配置多個(gè)數(shù)據(jù)源,下面這篇文章主要給大家介紹了關(guān)于SpringBoot多數(shù)據(jù)源配置的相關(guān)資料,需要的朋友可以參考下2021-11-11
SpringBoot整合JWT框架,解決Token跨域驗(yàn)證問題
Json web token (JWT), 是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標(biāo)準(zhǔn)((RFC 7519).定義了一種簡(jiǎn)潔的,自包含的方法用于通信雙方之間以JSON對(duì)象的形式安全的傳遞信息。2021-06-06
java中循環(huán)遍歷刪除List和Set集合中元素的方法(推薦)
下面小編就為大家?guī)硪黄猨ava中循環(huán)遍歷刪除List和Set集合中元素的方法(推薦)。小編覺得挺不錯(cuò)的,在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12
java根據(jù)不同的參數(shù)調(diào)用不同的實(shí)現(xiàn)類操作
這篇文章主要介紹了java根據(jù)不同的參數(shù)調(diào)用不同的實(shí)現(xiàn)類操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Java使用泛型Class實(shí)現(xiàn)消除模板代碼
Class作為實(shí)現(xiàn)反射功能的類,在開發(fā)中經(jīng)常會(huì)用到,然而,當(dāng)Class遇上泛型后,事情就變得不是那么簡(jiǎn)單了,所以本文就來講講Java如何使用泛型Class實(shí)現(xiàn)消除模板代碼,需要的可以參考一下2023-06-06
mybatis批量添加,批量更新之前如何判斷是否已經(jīng)存在
這篇文章主要介紹了mybatis批量添加,批量更新之前如何判斷是否已經(jīng)存在,具有很好的參考價(jià)值,希望對(duì)的有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
Java?Servlet實(shí)現(xiàn)表白墻的代碼實(shí)例
最近用Servlet做了個(gè)小項(xiàng)目,分享給大家,下面這篇文章主要給大家介紹了關(guān)于Java?Servlet實(shí)現(xiàn)表白墻的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02

