您好,登錄后才能下訂單哦!
摘要: 前面介紹了MapStrut簡(jiǎn)單用法,MapStrut的最重要的特點(diǎn)就是處理Java中實(shí)體與模型間不匹配屬性的轉(zhuǎn)換。
實(shí)體模型
有一個(gè)User對(duì)象:
public class User { private Integer id; private String name; private double account; private boolean married; // setters, getters, toString() }
有一個(gè)Employee 對(duì)象:
public class Employee { private int id; private String ename; private String position; private String married; // setters, getters, toString() }
業(yè)務(wù)場(chǎng)景
分析與實(shí)現(xiàn)
最愚蠢的方式是自己寫一堆的setter方法與getter方法,大量get/set代碼堆積,增加了代碼長(zhǎng)度和閱讀代碼的難度。利用工具BeanUtils是可以處理第一個(gè)需求的,但第三種需求就無能為力了。這時(shí)MapStrut就派上用場(chǎng)了,最簡(jiǎn)單的配置可以像下面這樣:
@Mapper public interface UserMapper { UserMapper INSTANCE = Mappers.getMapper(UserMapper.class); Employee userToEmployee(User user); User employeeToUser(Employee employee); }
對(duì)于第二個(gè)需求,可以通過下面方式實(shí)現(xiàn),注解@Mapping
可以指定需要把哪個(gè)字段source
轉(zhuǎn)換為哪個(gè)字段target
。
@Mapper public interface UserMapper { UserMapper INSTANCE = Mappers.getMapper(UserMapper.class); @Mappings({ @Mapping(source="name", target="ename") }) Employee userToEmployee(User user); @Mappings({ @Mapping(source="ename", target="name") }) User employeeToUser(Employee employee); }
第三個(gè)需求有點(diǎn)變態(tài),但是真實(shí)發(fā)生在我們的項(xiàng)目中,實(shí)現(xiàn)起來確實(shí)繁瑣一些:
首先,自定義轉(zhuǎn)化邏輯,布爾值到字符串,布爾的true對(duì)應(yīng)字符串的Y,布爾的false對(duì)應(yīng)字符串的N:
public class UserTransform { public String booleanToString(boolean value){ if(value){ return "Y"; } return "N"; } public boolean strToBoolean(String str){ if ("Y".equals(str)) { return true; } return false; } }
使用很簡(jiǎn)單,在接口的注解Mapper添加uses
參數(shù),值就是需要?jiǎng)偛诺霓D(zhuǎn)換邏輯類。
@Mapper(uses = UserTransform.class) public interface UserMapper {...}
結(jié)果與分析
用Junit Test寫兩個(gè)測(cè)試方法,分別測(cè)試User 對(duì)象轉(zhuǎn)換Employee ,Employee 對(duì)象轉(zhuǎn)換User。
public class MidTest { @Test public void midTest(){ User user = new User(); user.setId(125); user.setName("Lee"); user.setMarried(true); Employee e = UserMapper.INSTANCE.userToEmployee(user); System.out.println(e); } @Test public void midTest2(){ Employee e = new Employee(); e.setId(222); e.setEname("Chao"); e.setMarried("N"); User u = UserMapper.INSTANCE.employeeToUser(e); System.out.println(u); } }
結(jié)果如下:
User [id=222, name=Chao, account=0.0, married=false]
Employee [id=125, ename=Lee, position=null, married=Y]
轉(zhuǎn)換結(jié)果符合預(yù)期,轉(zhuǎn)化期間不存在的屬性,有了默認(rèn)值(account和position),包裝類也能識(shí)別(int和Integer),從自動(dòng)生成的
UserMapperImpl.java
中,可以看到,
employee.setMarried( userTransform.booleanToString( user.isMarried() ) );
,用到了剛才自定義的轉(zhuǎn)換邏輯。第三種需求是很少的,但是遇到了也是很難解決的,MapStruct的自定義函數(shù)確實(shí)方便不少,不過與其他的轉(zhuǎn)換工具相比,上手難度確實(shí)大,配置也稍顯繁瑣。
項(xiàng)目代碼托管在碼云。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)億速云的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。