開發(fā)中,我們經(jīng)常需要將PO轉DTO、DTO轉PO等一些實體間的轉換。比較出名的有BeanUtil 和ModelMapper等,它們使用簡單,但是在稍顯復雜的業(yè)務場景下力不從心。MapStruct這個插件可以用來處理domin實體類與model類的屬性映射,可配置性強。只需要定義一個 Mapper 接口,MapStruct 就會自動實現(xiàn)這個映射接口,避免了復雜繁瑣的映射實現(xiàn)。MapStruct官網(wǎng)地址: http://mapstruct.org/
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:國際域名空間、虛擬空間、營銷軟件、網(wǎng)站建設、德令哈網(wǎng)站維護、網(wǎng)站推廣。
引入依賴
org.mapstruct mapstruct-jdk8 1.1.0.Final
需求
我們假設有學生student 類 需要轉換成 用戶 user 類,將學生信息存入用戶信息庫
此時Student 類內(nèi)容如下:
public class Student { private Integer id; private String name; private Integer age; private String sex; //setters, getters, toString() 方法此處省略不寫,但是實際開發(fā)需要寫的哦 }
此時User 類內(nèi)容如下:
public class User { private Integer id; private String name; private Integer age; private String sex; //setters, getters, toString() 方法此處省略不寫,但是實際開發(fā)需要寫的哦 }
轉換model
此時 Student 和 User 的屬性名字都相同那么轉換接口就是
import org.mapstruct.Mapper; @Mapper(componentModel = "spring") public interface UserMapping { /** * Student 轉化為 User * @param Student * @return */ User studentToUser(Student student); }
程序運行前要先編譯 mvn clean compile , 從而mapstruct框架生成UserMappingImpl 實現(xiàn)類。
轉換model 屬性不匹配
如果 User 和 Student 的屬性名不對應例如:
此時Student 類內(nèi)容如下:
public class Student { private Integer id; private String sname; private Integer age; private String sex; //setters, getters, toString() 方法此處省略不寫,但是實際開發(fā)需要寫的哦 }
此時User 類內(nèi)容如下:
public class User { private Integer id; private String uname; private Integer age; private String sex; //setters, getters, toString() 方法此處省略不寫,但是實際開發(fā)需要寫的哦 }
那么轉換接口為
import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Mappings; @Mapper(componentModel = "spring") public interface UserMapping { /** * Student 轉化為 User * @param Student * @return */ @Mappings({ @Mapping(target = "uname", source = "sname") // 多個屬性不對應可以用 "," 隔開編寫多個@Mapping // ,@Mapping(target = "uname", source = "sname") }) User studentToUser(Student student); }
轉換model 屬性類型不匹配
比如說user 類的sex字段類型改為boolean
此時User 類內(nèi)容如下:
public class User { private Integer id; private String uname; private Integer age; private boolean sex; //setters, getters, toString() 方法此處省略不寫,但是實際開發(fā)需要寫的哦 }
這個轉換需求有點變態(tài),所以 需要我門自己寫個轉換類
public class UserTransform { public String booleanToString(boolean value){ if(value){ return "男"; } return "女"; } public boolean strToBoolean(String str){ if ("男".equals(str)) { return true; } return false; } }
那么轉換接口為(使用 UserTransform.class 類)
import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Mappings; @Mapper(componentModel = "spring",uses = UserTransform.class) public interface UserMapping { /** * Student 轉化為 User * @param Student * @return */ @Mappings({ @Mapping(target = "uname", source = "sname") // 多個屬性不對應可以用 "," 隔開編寫多個@Mapping // ,@Mapping(target = "uname", source = "sname") }) User studentToUser(Student student); }
轉換list
當user 和 student 都是集合形式list 時應當如下轉換
轉化 List<> 集合時必須有 實體轉化,因為在實現(xiàn)中,List 轉換是 for循環(huán)調(diào)用 實體轉化的。所以當屬性名不對應時,應該在 實體轉化進行 @Mappings 的屬性名映射配置,然后list的轉換也會繼承這和屬性的映射。
例如 屬性名相同
import org.mapstruct.Mapper; @Mapper(componentModel = "spring") public interface UserMapping { /** * Student 轉化為 User * @param Student * @return */ User studentToUser(Student student); /** * Students 轉化為 Users * @param Students * @return */ ListstudentsToUsers(List students);
屬性名不同:
import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Mappings; @Mapper(componentModel = "spring") public interface UserMapping { /** * Student 轉化為 User * @param Student * @return */ @Mappings({ @Mapping(target = "uname", source = "sname") // 多個屬性不對應可以用 "," 隔開編寫多個@Mapping // ,@Mapping(target = "uname", source = "sname") }) User studentToUser(Student student); /** * 此時 studentsToUsers 的實現(xiàn)為循環(huán)調(diào)用 studentToUser 并繼承了 studentToUser 的屬性映射 * Students 轉化為 Users * @param Students * @return */ ListstudentsToUsers(List students); }
展示自動生成的 UserMappingImpl 實現(xiàn)(此類為 執(zhí)行 mvn clean compile 后自動生成)
@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 ListstudentsToUsers(List students) { if ( students == null ) { return null; } List list = new ArrayList (); for ( student student : students ) { list.add( studentToUser( student ) ); } return list; } }
參考資料 :https://www.jb51.net/article/157763.htm
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對創(chuàng)新互聯(lián)的支持。如果你想了解更多相關內(nèi)容請查看下面相關鏈接