生活随笔
收集整理的這篇文章主要介紹了
MyBatis的resultType和resultMap的区别
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在使用mybatis進(jìn)行數(shù)據(jù)庫連接操作時(shí)對于SQL語句返回結(jié)果的處理通常有兩種方式,一種就是resultType另一種就是resultMap,下面說下我對這兩者的認(rèn)識(shí)和理解
resultType:當(dāng)使用resultType做SQL語句返回結(jié)果類型處理時(shí),對于SQL語句查詢出的字段在相應(yīng)的pojo中必須有和它相同的字段對應(yīng),而resultType中的內(nèi)容就是pojo在本項(xiàng)目中的位置。
因此對于單表查詢的話用resultType是最合適的。但是,如果在寫pojo時(shí),不想用數(shù)據(jù)庫表中定義的字段名稱,也是可以使用resultMap進(jìn)行處理對應(yīng)的。多表連接查詢時(shí),若是一對一的連接查詢,那么需要新建一個(gè)pojo,pojo中包括兩個(gè)表中需要查詢出的所有的字段,這個(gè)地方的處理方式通常為創(chuàng)建一個(gè)繼承一個(gè)表字段的pojo,再在里面添加另外一個(gè)表內(nèi)需要查詢出的字段即可。若是一對多查詢時(shí),若是使用內(nèi)連接查詢,則很可能出現(xiàn)查詢出的字段有重復(fù)。使用雙重for循環(huán)嵌套處理即可。
resultMap:當(dāng)使用resultMap做SQL語句返回結(jié)果類型處理時(shí),通常需要在mapper.xml中定義resultMap進(jìn)行pojo和相應(yīng)表字段的對應(yīng)。
[java]?view plaincopy
<!--?訂單查詢關(guān)聯(lián)用戶的resultMap?? ????將整個(gè)查詢的結(jié)果映射到cn.itcast.mybatis.po.Orders中?? ?????-->?? ????<resultMap?type="cn.itcast.mybatis.po.Orders"?id="OrdersUserResultMap">?? ????????<!--?配置映射的訂單信息?-->?? ????????<!--?id:指定查詢列中的唯?一標(biāo)識(shí),訂單信息的中的唯?一標(biāo)識(shí),如果有多個(gè)列組成唯一標(biāo)識(shí),配置多個(gè)id?? ????????????column:訂單信息的唯?一標(biāo)識(shí)?列?? ????????????property:訂單信息的唯?一標(biāo)識(shí)?列所映射到Orders中哪個(gè)屬性?? ??????????-->?? ????????<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中添加嵌套另一個(gè)表的pojo,然后在mapper.xml中采用association節(jié)點(diǎn)元素進(jìn)行對另一個(gè)表的連接處理。例如:
[html]?view plaincopy
<!--?訂單查詢關(guān)聯(lián)用戶的resultMap?? ????將整個(gè)查詢的結(jié)果映射到cn.itcast.mybatis.po.Orders中?? ?????-->?? ????<resultMap?type="cn.itcast.mybatis.po.Orders"?id="OrdersUserResultMap">?? ?????????? ????????<!--?id:指定查詢列中的唯?一標(biāo)識(shí),訂單信息的中的唯?一標(biāo)識(shí),如果有多個(gè)列組成唯一標(biāo)識(shí),配置多個(gè)id?? ????????????column:訂單信息的唯?一標(biāo)識(shí)?列?? ????????????property:訂單信息的唯?一標(biāo)識(shí)?列所映射到Orders中哪個(gè)屬性?? ??????????-->?? ????????<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:用于映射關(guān)聯(lián)查詢單個(gè)對象的信息?? ????????property:要將關(guān)聯(lián)查詢的用戶信息映射到Orders中哪個(gè)屬性?? ?????????-->?? ????????<association?property="user"??javaType="cn.itcast.mybatis.po.User">?? ????????????<!--?id:關(guān)聯(lián)查詢用戶的唯?一標(biāo)識(shí)?? ????????????column:指定唯?一標(biāo)識(shí)用戶信息的列?? ????????????javaType:映射到user的哪個(gè)屬性?? ?????????????-->?? ????????????<id?column="user_id"?property="id"/>?? ????????????<result?column="username"?property="username"/>?? ????????????<result?column="sex"?property="sex"/>?? ????????????<result?column="address"?property="address"/>?? ?????????? ????????</association>?? ????</resultMap>?? 若是一對多的表連接方式,比如訂單表和訂單明細(xì)表即為一對多連接,若是不對sql語句進(jìn)行處理,由于一個(gè)訂單對應(yīng)多條訂單明細(xì),因此查詢出的結(jié)果對于訂單表數(shù)據(jù)來說將會(huì)出現(xiàn)重復(fù),例如:
resultMap的處理方式為在訂單表數(shù)據(jù)的pojo中添加一個(gè)list,list中為訂單明細(xì)表的屬性,在mapper.xml中采用如下的處理方式:
[html]?view plaincopy
!--?訂單及訂單明細(xì)的resultMap?? ????使用extends繼承,不用在中配置訂單信息和用戶信息的映射?? ?????-->?? ????<resultMap?type="cn.itcast.mybatis.po.Orders"?id="OrdersAndOrderDetailResultMap"?extends="OrdersUserResultMap">?? ?????????? ?????????? ?????????? ?????????? ?????????? ????????<!--?訂單明細(xì)信息?? ????????一個(gè)訂單關(guān)聯(lián)查詢出了多條明細(xì),要使用collection進(jìn)行映射?? ????????collection:對關(guān)聯(lián)查詢到多條記錄映射到集合對象中?? ????????property:將關(guān)聯(lián)查詢到多條記錄映射到cn.itcast.mybatis.po.Orders哪個(gè)屬性?? ????????ofType:指定映射到list集合屬性中pojo的類型?? ?????????-->?? ?????????<collection?property="orderdetails"?ofType="cn.itcast.mybatis.po.Orderdetail">?? ????????????<!--?id:訂單明細(xì)唯?一標(biāo)識(shí)?? ????????????property:要將訂單明細(xì)的唯?一標(biāo)識(shí)?映射到cn.itcast.mybatis.po.Orderdetail的哪個(gè)屬性?? ??????????????-->?? ????????????<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>?? 在查詢時(shí),雖然一條訂單信息對應(yīng)多條訂單明細(xì),由于將多條信息明細(xì)存儲(chǔ)到了list中,因此查詢后將不再出現(xiàn)重復(fù)數(shù)據(jù),達(dá)到了去重的效果
總結(jié)
以上是生活随笔為你收集整理的MyBatis的resultType和resultMap的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。