MapStruct實(shí)體轉(zhuǎn)換及List轉(zhuǎn)換的方法講解
開(kāi)發(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è)插件可以用來(lái)處理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é)生信息存入用戶信息庫(kù)
此時(shí)Student 類內(nèi)容如下:
public class Student {
private Integer id;
private String name;
private Integer age;
private String sex;
//setters, getters, toString() 方法此處省略不寫,但是實(shí)際開(kāi)發(fā)需要寫的哦
}
此時(shí)User 類內(nèi)容如下:
public class User {
private Integer id;
private String name;
private Integer age;
private String sex;
//setters, getters, toString() 方法此處省略不寫,但是實(shí)際開(kāi)發(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í)際開(kāi)發(fā)需要寫的哦
}
此時(shí)User 類內(nèi)容如下:
public class User {
private Integer id;
private String uname;
private Integer age;
private String sex;
//setters, getters, toString() 方法此處省略不寫,但是實(shí)際開(kāi)發(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)可以用 "," 隔開(kāi)編寫多個(gè)@Mapping
// ,@Mapping(target = "uname", source = "sname")
})
User studentToUser(Student student);
}
轉(zhuǎn)換model 屬性類型不匹配
比如說(shuō)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í)際開(kāi)發(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)可以用 "," 隔開(kāi)編寫多個(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)可以用 "," 隔開(kāi)編寫多個(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.dbjr.com.cn/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)文章
maven在settings.xml和pom.xml中指定jdk版本編譯的方法
在開(kāi)發(fā)Java應(yīng)用時(shí),通常需要指定要使用的Java版本,下面這篇文章主要給大家介紹了關(guān)于maven在settings.xm和pom.xml中指定jdk版本編譯的方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05
使用Eclipse開(kāi)發(fā)工具如何解決Java Compiler中Annotation Processin不出現(xiàn)的問(wèn)題
這篇文章主要介紹了使用Eclipse開(kāi)發(fā)工具如何解決Java Compiler中Annotation Processin不出現(xiàn)的相關(guān)資料,需要的朋友可以參考下2015-11-11
springboot2.5.6集成RabbitMq實(shí)現(xiàn)Topic主題模式(推薦)
這篇文章主要介紹了springboot2.5.6集成RabbitMq實(shí)現(xiàn)Topic主題模式(推薦),pom.xml引入依賴和常量類創(chuàng)建,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-11-11
Java封裝數(shù)組實(shí)現(xiàn)包含、搜索和刪除元素操作詳解
這篇文章主要介紹了Java封裝數(shù)組實(shí)現(xiàn)包含、搜索和刪除元素操作,結(jié)合實(shí)例形式分析了java針對(duì)數(shù)組元素的查找、刪除、判斷等相關(guān)操作封裝與使用技巧,需要的朋友可以參考下2020-03-03
Java連接MySQL數(shù)據(jù)庫(kù)命令行程序過(guò)程
SQL編程包括兩種形式,一種是過(guò)程化編程,主要通過(guò)數(shù)據(jù)庫(kù)交互式工具,通過(guò)存儲(chǔ)過(guò)程、觸發(fā)器、函數(shù)等形式的編程;另一種是嵌入式SQL編程,將SQL語(yǔ)句嵌入到高級(jí)開(kāi)發(fā)語(yǔ)言,完成數(shù)據(jù)的各種操作2021-10-10
Session過(guò)期后實(shí)現(xiàn)自動(dòng)跳轉(zhuǎn)登錄頁(yè)面
這篇文章主要介紹了Session過(guò)期后實(shí)現(xiàn)自動(dòng)跳轉(zhuǎn)登錄頁(yè)面,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12

