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>
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>
(1)resultMap
<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>
<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 將整個查詢的結果映射到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 使用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>
一般用於mapper中有多個參數傳過來時。不推薦使用,容易出錯。
ParameterMap和resultMap相似,表示將查詢結果集中列值的類型一一映射到java對象屬性的類型上,在開發過程當中不推薦這種方式。
通常使用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}佔位符進行比對。