MyBatis resultMap元素

resultMap 是 MyBatis 中最復(fù)雜的元素,主要用于解決實體類屬性名與數(shù)據(jù)庫表中字段名不一致的情況,可以將查詢結(jié)果映射成實體對象。下面我們先從最簡單的功能開始介紹。

現(xiàn)有的 MyBatis 版本只支持 resultMap 查詢,不支持更新或者保存,更不必說級聯(lián)的更新、刪除和修改。

resultMap元素的構(gòu)成

resultMap 元素還可以包含以下子元素,代碼如下。

<resultMap id="" type="">
    <constructor><!-- 類再實例化時用來注入結(jié)果到構(gòu)造方法 -->
        <idArg/><!-- ID參數(shù),結(jié)果為ID -->
        <arg/><!-- 注入到構(gòu)造方法的一個普通結(jié)果 -->
    </constructor>
    <id/><!-- 用于表示哪個列是主鍵 -->
    <result/><!-- 注入到字段或JavaBean屬性的普通結(jié)果 -->
    <association property=""/><!-- 用于一對一關(guān)聯(lián) -->
    <collection property=""/><!-- 用于一對多、多對多關(guān)聯(lián) -->
    <discriminator javaType=""><!-- 使用結(jié)果值來決定使用哪個結(jié)果映射 -->
        <case value=""/><!-- 基于某些值的結(jié)果映射 -->
    </discriminator>
</resultMap>
                

其中:

  • <resultMap> 元素的 type 屬性表示需要的 POJO,id 屬性是 resultMap 的唯一標(biāo)識。

  • 子元素 <constructor> 用于配置構(gòu)造方法。當(dāng)一個 POJO 沒有無參數(shù)構(gòu)造方法時使用。

  • 子元素 <id> 用于表示哪個列是主鍵。允許多個主鍵,多個主鍵稱為聯(lián)合主鍵。

  • 子元素 <result> 用于表示 POJO 和 SQL 列名的映射關(guān)系。

  • 子元素 <association>、<collection> 和 <discriminator> 用在級聯(lián)的情況下。關(guān)于級聯(lián)的問題比較復(fù)雜,在《MyBatis一對一關(guān)聯(lián)查詢》和《MyBatis一對多關(guān)聯(lián)查詢》一節(jié)詳細(xì)講解。

1

id 和 result 元素都有以下屬性。

元素 說明
property 映射到列結(jié)果的字段或?qū)傩?。如?POJO 的屬性和 SQL 列名(column元素)是相同的,那么 MyBatis 就會映射到 POJO 上
column 對應(yīng) SQL 列
javaType 配置 Java 類型??梢允翘囟ǖ念愅耆薅?MyBatis 上下文的別名
jdbcType 配置數(shù)據(jù)庫類型。這是 JDBC 類型,MyBatis 已經(jīng)為我們做了限定,基本支持所有常用數(shù)據(jù)庫類型
typeHandler 類型處理器。允許你用特定的處理器來覆蓋 MyBatis 默認(rèn)的處理器。需要指定 jdbcType 和 javaType 相互轉(zhuǎn)化的規(guī)則

一條 SQL 查詢語句執(zhí)行后會返回結(jié)果集,結(jié)果集有兩種存儲方式,即使用 Map 存儲和使用 POJO 存儲。

使用Map存儲結(jié)果集

任何 select 語句都可以使用 Map 存儲,代碼如下。

<!-- 查詢所有網(wǎng)站信息存到Map中 -->
<select id="selectAllWebsite" resultType="map">
    select * from website
</select>
                

在 WebsiteMapper 接口中添加以下方法。

public List<Map<String,Object>> selectAllWebsite();
                

Map 的 key 是 select 語句查詢的字段名(必須完全一樣),而 Map 的 value 是查詢返回結(jié)果中字段對應(yīng)的值,一條記錄映射到一個 Map 對象中。

使用 Map 存儲結(jié)果集很方便,但可讀性稍差,所以一般推薦使用 POJO 的方式。

使用POJO存儲結(jié)果集

因為 MyBatis 提供了自動映射,所以使用 POJO 存儲結(jié)果集是最常用的方式。但有時候需要更加復(fù)雜的映射或級聯(lián),這時就需要使用 select 元素的 resultMap 屬性配置映射集合。

修改 Website 類,代碼如下。

package net.biancheng.po;
import java.util.Date;
public class Website {
    private int id;
    private String uname;
    private String url;
    private int age;
    private String country;
    private Date createtime;
    /* setter和getter方法*/
    @Override
    public String toString() {
        return "Website[id=" + id + ",uname=" + uname + ",url=" + url + ",age=" + age + ",country=" + country
                + ",createtime=" + createtime + "]";
    }
}
                

WebsiteMapper.xml 代碼如下。

<!--使用自定義結(jié)果集類型 -->
<resultMap type="net.biancheng.po.Website" id="myResult">
    <!-- property 是 net.biancheng.po.Website 類中的屬性 -->
    <!-- column是查詢結(jié)果的列名,可以來自不同的表 -->
    <id property="id" column="id" />
    <result property="uname" column="name" />
</resultMap>
                

resultMap 元素的屬性 id 代表這個 resultMap 的標(biāo)識,type 標(biāo)識需要映射的 POJO。我們可以使用 MyBatis 定義好的類的別名或自定義類的全限定名。

這里使用 property 元素指定 Website 的屬性名稱 uname,column 表示數(shù)據(jù)庫中 website 表的 SQL 列名 name,將 POJO 和 SQL 的查詢結(jié)果一 一對應(yīng)。

WebsiteMapper.xml 中 select 元素配置代碼如下。

<select id="selectAllWebsite" resultMap="myResult">
    select id,name,url from website
</select>
                

可以發(fā)現(xiàn) SQL 語句的列名和 myResult 中的 column 一一對應(yīng)。

resultType和resultMap的區(qū)別

MyBatis 的每一個查詢映射的返回類型都是 resultMap,只是當(dāng)我們提供的返回類型是 resultType 時,MyBatis 會自動把對應(yīng)的值賦給 resultType 所指定對象的屬性,而當(dāng)我們提供的返回類型是 resultMap 時,MyBatis 會將數(shù)據(jù)庫中的列數(shù)據(jù)復(fù)制到對象的相應(yīng)屬性上,可用于復(fù)制查詢。

需要注意的是,resultMap 和 resultType 不能同時使用。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清