1. 程式人生 > >resultMap與resultType、parameterMap與 parameterType的區別

resultMap與resultType、parameterMap與 parameterType的區別

       Map:對映;Type:Java型別

       resultMap 與 resultType、parameterMap 與  parameterType的區別在面試的時候被問到的機率非常高,出現的次數到了令人髮指的地步生氣,筆者認為有必要單獨列一章鄭重宣告,共勉

resultMap & resultType

      兩者都是表示查詢結果集java物件之間的一種關係,處理查詢結果集,對映到java物件。

      resultMap表示將查詢結果集中的列一一對映到bean物件的各個屬性。對映的查詢結果集中的列標籤可以根據需要靈活變化,並且,在對映關係中,還可以通過typeHandler設定實現查詢結果值的型別轉換,比如布林型與0/1的型別轉換。

例如:

<resultMaptype="hdu.terence.bean.Message"id="MessageResult"> 

    <!--存放Dao--><!--type是和資料庫對應的bean類名Message-->

    <idcolumn="id"jdbcType="INTEGER"property="id"/><!--主鍵標籤-->

    <resultcolumn="COMMAND"jdbcType="VARCHAR"property="command"/>

    <resultcolumn

="DESCRIPTION"jdbcType="VARCHAR"property="description"/>

    <resultcolumn="CONTENT"jdbcType="VARCHAR"property="content"/>

  </resultMap>

  <selectid="queryMessageList"parameterType="hdu.terence.bean.Message"resultMap="MessageResult">

    SELECTID,COMMAND,DESCRIPTION,CONTENT FROM message WHERE 1=1      

    <iftest="command!=null and!&quot;&quot;.equals(command.trim())">

    andCOMMAND=#{command}

    </if>

    <iftest="description!=null and!&quot;&quot;.equals(description.trim())">

    andDESCRIPTION like '%' #{description} '%'

    </if> 

  </select>

      resultType 表示的是bean中的物件類,此時可以省略掉resultMap標籤的對映,但是必須保證查詢結果集中的屬性 和 bean物件類中的屬性是一一對應的,此時大小寫不敏感,但是有限制。

以下是resultType的寫法,將其值設定成對應的java類上即可。不需要上述resultMap的對映關係。

  <selectid="queryMessageList"parameterType="hdu.terence.bean.Message"resultType=" hdu.terence.bean.Message ">

    SELECTID,COMMAND,DESCRIPTION,CONTENT FROM message WHERE 1=1      

    <iftest="command!=null and!&quot;&quot;.equals(command.trim())">

    andCOMMAND=#{command}

    </if>

    <iftest="description!=null and!&quot;&quot;.equals(description.trim())">

    andDESCRIPTION like '%' #{description} '%'

    </if> 

  </select>

ParameterMap(不推薦) & parameterType

       ParameterMap和resultMap類似,表示將查詢結果集中列值的型別一一對映到java物件屬性的型別上,在開發過程中不推薦這種方式。

       一般使用parameterType直接將查詢結果列值型別自動對應到java物件屬性型別上,不再配置對映關係一一對應,例如上述程式碼中下劃線部分表示將查詢結果型別自動對應到hdu.terence.bean.Message的Bean物件屬性型別。

Mybatis家族歷史

    Mybatis出生於GoogleCode,使用的這兩個名字叫做resultType和parameterType。

     以前的版本叫做iBatis,出生於Apache,以前這兩個配置叫做resultClass和parrameterClass,根據這種命名也應該知道這種對映都和java類有關。

#{}和${}的使用

resultMap和ParameterMap書寫拼寫要使用#{},resultType 和parameterType型別使用${},使用例子如下:

Select ID,COMMAND from Message where COMMAND=#{command}

Select ID,COMMAND from Message where COMMAND=‘${command}’

前者解析為:

            Select ID,COMMAND from Message where COMMAND=?具有預編譯效果

後者解析為:

            Select ID,COMMAND from Message where COMMAND=段子   不具有預編譯效果

但是,例如當頁面向後臺傳遞一個列名(屬性名)的時候,是不希望被預編譯出一個?的,此時要用到$格式;

如:加上 order by${param} ,此時param是一個列名。

#{}和 ognl表示式

     

     一般引數的拼寫還是保證統一風格為好,便於人讀。