當(dāng)我在學(xué)習(xí)Mybatis中贴见,會(huì)發(fā)現(xiàn)select查詢會(huì)有resultMap和resultType參數(shù)的設(shè)置『烨遥可能很多初學(xué)者搞不明白兩者的區(qū)別坝茎,和什么時(shí)候用∠痉總得來(lái)說(shuō)resultType是直接表示返回類(lèi)型的嗤放,而resultMap則是對(duì)外部ResultMap的引用。根據(jù)mybatis的官方文檔壁酬,是這么說(shuō)的:從這條語(yǔ)句中返回的期望類(lèi)型的類(lèi)的完全限定名或別名次酌。 注意如果返回的是集合,那應(yīng)該設(shè)置為集合包含的類(lèi)型舆乔,而不是集合本身和措。可以使用 resultType 或 resultMap蜕煌,但不能同時(shí)使用。下面我來(lái)舉個(gè)栗子~
resultType:
當(dāng)提供的返回類(lèi)型屬性是resultType時(shí)诬留,MyBatis會(huì)將Map里面的鍵值對(duì)取出賦給resultType所指定的對(duì)象對(duì)應(yīng)的屬性斜纪。實(shí)際上MyBatis的每一個(gè)查詢映射的返回類(lèi)型都是ResultMap,只是當(dāng)提供的返回類(lèi)型屬性是resultType的時(shí)候文兑,MyBatis對(duì)自動(dòng)的給把對(duì)應(yīng)的值賦給resultType所指定對(duì)象的屬性盒刚。
例如如下:
public class User {
private int id;
private String name;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
返回的是一個(gè)javaBean對(duì)象,這種情況下大家或許已經(jīng)發(fā)現(xiàn)問(wèn)題了绿贞,那就是javaBean的字段完全對(duì)應(yīng)數(shù)據(jù)庫(kù)的字段因块,這時(shí)候再回味官方文檔的話:返回的期望類(lèi)型的類(lèi)的完全限定名或別名。返回期望類(lèi)型的類(lèi)籍铁,因?yàn)槿藶榈脑O(shè)置了相同的完全限定名涡上,所以這時(shí)候mybatis就會(huì)自動(dòng)的給把對(duì)應(yīng)的值賦給resultType所指定對(duì)象的屬性。但是只是用于相對(duì)簡(jiǎn)單的查詢拒名,當(dāng)然如果javaBean的成員變量不對(duì)應(yīng)數(shù)據(jù)庫(kù)的字段吩愧,可以設(shè)置別名讓其對(duì)應(yīng),依然可以用resultType增显。
resultMap:同樣來(lái)自官方的話:外部 resultMap 的命名引用雁佳。結(jié)果集的映射是 MyBatis 最強(qiáng)大的特性,如果你對(duì)其理解透徹,許多復(fù)雜映射的情形都能迎刃而解糖权。實(shí)際開(kāi)發(fā)中用resultMap在復(fù)雜查詢中非常有用堵腹。例如多表查詢,或者有復(fù)雜邏輯星澳,因?yàn)檫@時(shí)候一個(gè)javaBean已經(jīng)無(wú)能為力了疚顷,所以resultMap就發(fā)揮了他的作用∧寂校看下面實(shí)例:
圖中是兩個(gè)表連表查詢荡含,這時(shí)候很難用到resultType 因?yàn)樗榈姆祷仡?lèi)型不是一個(gè)簡(jiǎn)單的javaBean了,那么圖中的blogResult的什么,請(qǐng)接下來(lái)看:
看到了他的魅力一下展示出來(lái)届垫,你想他是什么類(lèi)型就是什么類(lèi)型释液,完全是一個(gè)智能的javaBea對(duì)象,Blog和Author產(chǎn)生關(guān)聯(lián)装处,使用了外部的結(jié)果映射元素來(lái)映射關(guān)聯(lián)误债。當(dāng)在復(fù)雜查詢的時(shí)候就根據(jù)實(shí)際情況,使多表關(guān)聯(lián)妄迁,建立自己想要的返回對(duì)象寝蹈。總得來(lái)說(shuō) resultMap在實(shí)際開(kāi)發(fā)中了占了80%登淘,針對(duì)不對(duì)業(yè)務(wù)和邏輯都能靈活應(yīng)用箫老。