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