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!"".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表示式
一般引數的拼寫還是保證統一風格為好,便於人讀。