mybatis中的resultMap與resultType、parameterMap與 parameterType的區別

1、resultMap和resultType

MyBatis的返回參數類型分兩種html

對應的分類爲:
1.1. resultMap :java

1.2. resultType :spring

resultType和resultMap功能相似  ,都是返回對象信息  ,可是resultMap要更強大一些 ,可自定義。由於resultMap要配置一下,表和類的一一對應關係,因此說就算你的字段名和你的實體類的屬性名不同也不要緊,都會給你映射出來,可是,resultType就比較雞肋了,必須字段名同樣,好比說 cId和c_id 這種的都不能映射,注意:二者不能同時存在。 sql

2 . 對應返回值類型:數據庫

2.1. resultMap : 結果集[對象等]安全

2.2. resultType : Integer,String ,Long ,classmybatis

3 . 注意點:
      在MyBatis進行查詢映射時,其實查詢出來的每個屬性都是放在一個對應的Map裏面的,其中鍵是屬性名,值則是其對應的值。
     3.1 當提供的返回類型屬性是resultType時,MyBatis會將Map裏面的鍵值對取出賦給resultType所指定的對象對應的屬性。因此其實MyBatis的每個查詢映射的返回類型都是ResultMap,只是當提供的返回類型屬性是resultType的時
候,MyBatis對自動的給把對應的值賦給resultType所指定對象的屬性。app

    3.2 當提供的返回類型是resultMap時,由於Map不能很好表示領域模型,就須要本身再進一步的把它轉化爲對應的對象,這經常在複雜查詢中頗有做用。spa

4.使用resultType 後面只能跟一個對象的屬性code

<select id="countTheNumberOfPatentsInEachArea" resultType="java.lang.String">
    select  area ,count(*) AS 'count' from t_patent group by area
</select>

上面的sql語句在數據庫中查詢是徹底沒有問題的 可是 用到mybatis裏面就會包錯,錯誤以下:

Invalid value for getInt() - '麗水市'; nested exception is java.sql.SQLException: Invalid value for getInt()

意思就是數據庫中count(*)查詢出來的是int類型,可是咱們返回的倒是String類型,因此就出現了錯誤

因此咱們能夠經過resultMap 來解決:

<resultMap id="CountResultMap" type="com.boku.www.utils.Count" >
    <result column="area" property="area" jdbcType="VARCHAR" />
    <result column="count" property="count" jdbcType="INTEGER" />
</resultMap>
<select id="countTheNumberOfPatentsInEachArea" resultMap="CountResultMap">
      select  area ,count(*) AS 'count' from t_patent group by area
</select>

這樣把area 和count查詢出來放在一個對象Count裏面,就可以裝不一樣的數據類型了。

(1)resultMap

resultMap表示將查詢結果集中的列一一映射到bean對象的各個屬性。映射的查詢結果集中的列標籤能夠根據須要靈活變化,而且,在映射關係中,還能夠經過typeHandler設置實現查詢結果值的類型轉換,好比布爾型與0/1的類型轉換。

建立以下: 

<resultMap type="user" id="UserResult">
	<id column="ID" jdbcType="INTEGER" property="id" />
	<result column="NAME" jdbcType="VARCHAR" property="name" />
	<result column="PWD" jdbcType="VARCHAR" property="pwd" />
	<result column="AGE" jdbcType="INTEGER" property="age" />
	<result column="PHONE" jdbcType="VARCHAR" property="phone" />
	<result column="EMAIL" jdbcType="VARCHAR" property="email" />
</resultMap>

 使用場景:

<select id="checkLogin" parameterType="user"
	resultMap="UserResult">
	SELECT NAME FROM USER WHERE NAME=#{name} AND PWD=#{pwd}
</select>

(2)resultType

resultType 表示的是bean中的對象類,此時能夠省略掉resultMap標籤的映射,可是必須保證查詢結果集中的屬性 和 bean對象類中的屬性是一一對應的,此時大小寫不敏感,可是必須保證結果集中的屬性 和 bean對象類中的屬性是相對應的。

<select id="checkLogin" parameterType="user" resultType="user">
	SELECT NAME FROM USER WHERE NAME=#{name} AND PWD=#{pwd}
</select>

下面介紹幾個經常使用的映射關係:

 單表查詢: resultMap:當使用resultMap作SQL語句返回結果類型處理時,一般須要在mapper.xml中定義resultMap進行pojo和相應表字段的對應。

<!-- 訂單查詢關聯用戶的resultMap
    將整個查詢的結果映射到cn.itcast.mybatis.po.Orders中
     -->
    <resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersUserResultMap">
        <!-- 配置映射的訂單信息 -->
        <!-- id:指定查詢列中的惟 一標識,訂單信息的中的惟 一標識,若是有多個列組成惟一標識,配置多個id
            column:訂單信息的惟 一標識 列
            property:訂單信息的惟 一標識 列所映射到Orders中哪一個屬性
          -->
        <id column="id" property="id"/>
        <result column="user_id" property="userId"/>
        <result column="number" property="number"/>
        <result column="createtime" property="createtime"/>
        <result column="note" property="note"/>        
    </resultMap>

關聯查詢(一對一):resultMap對於一對一表鏈接的處理方式一般爲在主表的pojo中添加嵌套另外一個表的pojo,而後在mapper.xml中採用association節點元素進行對另外一個表的鏈接處理。例如

<!-- 訂單查詢關聯用戶的resultMap
    將整個查詢的結果映射到cn.itcast.mybatis.po.Orders中
     -->
    <resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersUserResultMap">
        <!-- 配置映射的訂單信息 -->
        <!-- id:指定查詢列中的惟 一標識,訂單信息的中的惟 一標識,若是有多個列組成惟一標識,配置多個id
            column:訂單信息的惟 一標識 列
            property:訂單信息的惟 一標識 列所映射到Orders中哪一個屬性
          -->
        <id column="id" property="id"/>
        <result column="user_id" property="userId"/>
        <result column="number" property="number"/>
        <result column="createtime" property="createtime"/>
        <result column="note" property=note/>
        
        <!-- 配置映射的關聯的用戶信息 -->
        <!-- association:用於映射關聯查詢單個對象的信息
        property:要將關聯查詢的用戶信息映射到Orders中哪一個屬性
         -->
        <association property="user"  javaType="cn.itcast.mybatis.po.User">
            <!-- id:關聯查詢用戶的惟 一標識
            column:指定惟 一標識用戶信息的列
            javaType:映射到user的哪一個屬性
             -->
            <id column="user_id" property="id"/>
            <result column="username" property="username"/>
            <result column="sex" property="sex"/>
            <result column="address" property="address"/>
        
        </association>
    </resultMap>

關聯查詢(一對多):resultMap的處理方式爲在訂單表數據的pojo中添加一個list,list中爲訂單明細表的屬性,在mapper.xml中採用以下的處理方式:

-- 訂單及訂單明細的resultMap
    使用extends繼承,不用在中配置訂單信息和用戶信息的映射
     -->
    <resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersAndOrderDetailResultMap" extends="OrdersUserResultMap">
        <!-- 訂單信息 -->
        <!-- 用戶信息 -->
        <!-- 使用extends繼承,不用在中配置訂單信息和用戶信息的映射 -->
        
        
        <!-- 訂單明細信息
        一個訂單關聯查詢出了多條明細,要使用collection進行映射
        collection:對關聯查詢到多條記錄映射到集合對象中
        property:將關聯查詢到多條記錄映射到cn.itcast.mybatis.po.Orders哪一個屬性
        ofType:指定映射到list集合屬性中pojo的類型
         -->
         <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail">
             <!-- id:訂單明細惟 一標識
             property:要將訂單明細的惟 一標識 映射到cn.itcast.mybatis.po.Orderdetail的哪一個屬性
               -->
             <id column="orderdetail_id" property="id"/>
             <result column="items_id" property="itemsId"/>
             <result column="items_num" property="itemsNum"/>
             <result column="orders_id" property="ordersId"/>
         </collection>
        
    
    </resultMap>

 

2、parameterMap和parameterType

(1)parameterMap

一般用於mapper中有多個參數傳過來時。不推薦使用,容易出錯。

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

(2)parameterType

通常使用parameterType直接將查詢結果列值類型自動對應到java對象屬性類型上,再也不配置映射關係一一對應,java對象的屬性應和數據庫表裏的各字段保持一致,這樣在查出結果後mybatis會將Map裏面的鍵值對取出賦給resultType所指定的對象對應的屬性。

<select id="checkLogin" parameterType="user" resultType="user">
	SELECT NAME FROM USER WHERE NAME=#{name} AND PWD=#{pwd}
</select>

 

若是是單純的String的話,parameterType='string'便可,看源碼能夠知道,取值不區分大小寫,最終都會被轉化爲小寫;在SQL語句中,直接使用#{_parameter}便可。

須要map則直接能夠parameterType="map" resultType="user",sql語句能夠直接經過{xx} 鍵值對,進行比對,只有單條件,直接能夠用parameterType="spring" resultType="user",sql語句能夠直接{0}佔位符進行比對。

 

mybatis中的#和$的區別

1. #將傳入的數據都當成一個字符串,會對自動傳入的數據加一個雙引號。如:order by #user_id#,若是傳入的值是111,那麼解析成sql時的值爲order by "111", 若是傳入的值是id,則解析成的sql爲order by "id".

2. $將傳入的數據直接顯示生成在sql中。如:order by $user_id$,若是傳入的值是111,那麼解析成sql時的值爲order by user_id, 若是傳入的值是id,則解析成的sql爲order by id.

3. #方式可以很大程度防止sql注入。 

4.$方式沒法防止Sql注入。

5.$方式通常用於傳入數據庫對象,例如傳入表名. 

6.通常能用#的就別用$.

MyBatis排序時使用order by 動態參數時須要注意,用$而不是#

字符串替換

默認狀況下,使用#{}格式的語法會致使MyBatis建立預處理語句屬性並以它爲背景設置安全的值(好比?)。這樣作很安全,很迅速也是首選作法,有時你只是想直接在SQL語句中插入一個不改變的字符串。好比,像ORDER BY,你能夠這樣來使用:

ORDER BY ${columnName}

這裏MyBatis不會修改或轉義字符串。

相關文章
相關標籤/搜索