Map:映射;Type:Java類型java
resultMap 與 resultType、parameterMap 與 parameterType的區別在面試的時候被問到的概率很是高,出現的次數到了使人髮指的地步,筆者認爲有必要單獨列一章鄭重聲明,共勉面試
resultMap & resultType
二者都是表示查詢結果集與java對象之間的一種關係,處理查詢結果集,映射到java對象。數據庫
resultMap表示將查詢結果集中的列一一映射到bean對象的各個屬性。映射的查詢結果集中的列標籤能夠根據須要靈活變化,而且,在映射關係中,還能夠經過typeHandler設置實現查詢結果值的類型轉換,好比布爾型與0/1的類型轉換。spa
例如:對象
<resultMaptype="hdu.terence.bean.Message"id="MessageResult"> ip
<!--存放Dao值--><!--type是和數據庫對應的bean類名Message-->開發
<idcolumn="id"jdbcType="INTEGER"property="id"/><!--主鍵標籤-->io
<resultcolumn="COMMAND"jdbcType="VARCHAR"property="command"/>編譯
<resultcolumn="DESCRIPTION"jdbcType="VARCHAR"property="description"/>class
<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!"".equals(command.trim())">
andCOMMAND=#{command}
</if>
<iftest="description!=null and!"".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!"".equals(command.trim())">
andCOMMAND=#{command}
</if>
<iftest="description!=null and!"".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表達式
通常參數的拼寫仍是保證統一風格爲好,便於人讀。