Mybatis中一對(duì)多(collection)和一對(duì)一(association)的組合查詢(xún)使用
Collection
collection
: 一個(gè)復(fù)雜的類(lèi)型關(guān)聯(lián),許多結(jié)果將映射為這種類(lèi)型property
: 這是關(guān)聯(lián)的 JavaBean 中的屬性名, 在 RoleModel 中對(duì)應(yīng) private List<MenuModel> menus;javaType
: property 屬性對(duì)應(yīng)的集合類(lèi)型ofType
: property 集合中的泛型,即定義時(shí)泛型所表示的具體類(lèi)型column
: RoleModel 的 id ,作為參數(shù)傳入被調(diào)用的 Select 語(yǔ)句
用法,嵌套在其他的查詢(xún)說(shuō)sql中,寫(xiě)法 主要以下3種:
第一種:select 語(yǔ)句在其他dao.java對(duì)應(yīng)的 mapper.xml中
<collection property="tProductVideos" ofType="com.pasture.mpi.provider.biz.model.auto.TProductVideo" column="product_id" select="com.mpi.biz.dao.cust.ProductDao.getProductList"> </collection>
第二種:select語(yǔ)句在同一個(gè)mapper.xml中
(與第一種的區(qū)別在于select屬性的值不一樣)
..... <collection property="tProductVideos" ofType="com.pasture.mpi.provider.biz.model.auto.TProductVideo" column="product_id" select="getProductList"> </collection> ...... <resultMap id="BaseProduct" type="com.mpi.biz.model.auto.TProduct"> <id column="id" property="id" jdbcType="INTEGER" /> <result column="product_id" property="productId" jdbcType="INTEGER" /> <result column="image_url" property="imageUrl" jdbcType="VARCHAR" /> <result column="type" property="type" jdbcType="CHAR" /> </resultMap> <select id="getProductImageList" resultMap="BaseProduct" parameterType="java.lang.Integer"> SELECT i.id, i.product_id, i.image_url,i.type FROM t_product_image i WHERE i.product_id = #{productId} </select>
第三種,如果再一個(gè)查詢(xún)中可以直接查詢(xún)到所需要的數(shù)據(jù)
但是需要映射到該對(duì)象的屬性上,則可以使用該方式(建議使用上兩種,看起來(lái)更清晰):
<resultMap id="BaseRoleResultMap" type="cn.com.hellowood.springsecurity.model.RoleModel"> <id column="id" property="id" jdbcType="INTEGER"/> <result column="name" property="name" jdbcType="VARCHAR"/> <result column="is_active" property="isActive" jdbcType="BOOLEAN"/> <result column="description" property="description" jdbcType="VARCHAR"/> <result column="last_update_time" property="lastUpdateTime" jdbcType="TIMESTAMP"/> <collection property="menus" ofType="com.pasture.mpi.provider.biz.model.auto.TProductVideo" javaType="java.util.ArrayList"> <id column="id" property="id" jdbcType="INTEGER" /> <result column="product_id" property="productId" jdbcType="INTEGER" /> <result column="image_url" property="imageUrl" jdbcType="VARCHAR" /> <result column="type" property="type" jdbcType="CHAR" /> </collection> </resultMap> <select id="getRoles" parameterType="java.lang.Integer" resultMap="BaseRoleResultMap"> SELECT r.id, r.name, r.description, r.is_active, r.last_update_time, m.id, m.value, m.display_value, m.url, m.category, m.description, m.is_active, m.last_update_time FROM table1 r LEFT JOIN t_product p ON r.id = p.r_id WHERE r.id = #{roleId,jdbcType=INTEGER} </select>
association總結(jié)
主要用到的屬性:
property
:映射數(shù)據(jù)庫(kù)列的字段或?qū)傩浴?/li>column
:數(shù)據(jù)庫(kù)的列名或者列標(biāo)簽別名。與傳遞給resultSet.getString(columnName)的參數(shù)名稱(chēng)相同。javaType
:完整java類(lèi)名或別名(參考上面的內(nèi)置別名列表)。如果映射到一個(gè)JavaBean,那MyBatis 通常會(huì)自行檢測(cè)到。然而,如果映射到一個(gè)HashMap,那您應(yīng)該明確指定javaType 來(lái)確保所需行為。resultMap
:一個(gè)可以映射聯(lián)合嵌套結(jié)果集到一個(gè)適合的對(duì)象視圖上的ResultMap。這是一個(gè)替代的方式去調(diào)用另一個(gè)select語(yǔ)句。
association查詢(xún)與主查詢(xún)一般寫(xiě)在一個(gè)文件中,如下:
第一種:不另外寫(xiě)查詢(xún)語(yǔ)句
(1)把返回的屬性提取出來(lái)
<association property="product" resultMap="ResultMapWithBLOBs"/>
(2)糅合在一起
<association property="category" javaType="com.provider.biz.model.auto.TCategory"> <id column="category_id" property="categoryId" jdbcType="INTEGER"/> <result column="c_name" property="name" jdbcType="VARCHAR"/> <result column="image_url" property="imageUrl" jdbcType="VARCHAR"/> <result column="c_status" property="status" jdbcType="CHAR"/> </association>
第二種:另外寫(xiě)查詢(xún)語(yǔ)句
<resultMap id="testMap" type="xxx" > <id property="id" column="id" jdbcType="DECIMAL" /> <result property="startDateStr" column="startDateStr" jdbcType="VARCHAR" /> <result property="endDateStr" column="endDateStr" jdbcType="VARCHAR" /> <association property="tableEntity" column="table_a_id" select="selectById"></association> </resultMap> <select id="selectById" parameterType="java.lang.Integer" resultMap="BaseResultMap"> select * from Table_XXX where a_id=#{aId} (注:這里的aId即為上述傳的參數(shù)值table_a_id,只傳一個(gè)參數(shù)時(shí)名稱(chēng)可以不一樣) </select>
第三種:與collection一樣
提到外面其他的dao接口中,此處省略…
補(bǔ)充:
association的使用要特別注意下,數(shù)據(jù)映射時(shí)會(huì)出現(xiàn)異常,再一次的項(xiàng)目中就出現(xiàn)過(guò)實(shí)際有5條數(shù)據(jù),但返回到service層時(shí)只有1條數(shù)據(jù),這一條數(shù)據(jù)各個(gè)部分的信息還不對(duì)應(yīng),通過(guò)打印mysql執(zhí)行語(yǔ)句和逐條排查,發(fā)現(xiàn)是association標(biāo)簽的問(wèn)題;
切記,association使用時(shí)<resultMap id="testMap" type="xxx" >中一定要有 <id>標(biāo)簽,否則會(huì)出現(xiàn)返回的數(shù)據(jù)與實(shí)際查詢(xún)結(jié)果不一致的問(wèn)題
多參數(shù)傳遞
當(dāng)需要傳遞多個(gè)值時(shí),寫(xiě)法如下:
column= “{prop1=col1,prop2=col2}
接收的類(lèi)型為 parameterType=“java.util.Map”,這里的參數(shù)使用時(shí)名稱(chēng)要保持一致;
例:
<resultMap id="testMap" type="xxx" > <id property="id" column="id" jdbcType="DECIMAL" /> <result property="startDateStr" column="startDateStr" jdbcType="VARCHAR" /> <result property="endDateStr" column="endDateStr" jdbcType="VARCHAR" /> <association property="tableEntity" column="{reqId=id,endDate=endDateStr,startDate=startDateStr}" select="selectById"> </association> </resultMap> <select id="selectById" parameterType="java.util.Map" resultMap="BaseResultMap">
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Mybatis實(shí)現(xiàn)一對(duì)一、一對(duì)多關(guān)聯(lián)查詢(xún)的方法(示例詳解)
- 關(guān)于mybatis一對(duì)一查詢(xún)一對(duì)多查詢(xún)遇到的問(wèn)題
- Mybatis使用@one和@Many實(shí)現(xiàn)一對(duì)一及一對(duì)多關(guān)聯(lián)查詢(xún)
- springboot整合mybatis-plus基于注解實(shí)現(xiàn)一對(duì)一(一對(duì)多)查詢(xún)功能
- mybatis 一對(duì)一、一對(duì)多和多對(duì)多查詢(xún)實(shí)例代碼
- Mybatis 中的一對(duì)一,一對(duì)多,多對(duì)多的配置原則示例代碼
- Mybatis中的高級(jí)映射一對(duì)一、一對(duì)多、多對(duì)多
- mybatis中一對(duì)一、一對(duì)多的<association> 配置使用
相關(guān)文章
Spring + mybatis + mysql使用事物的幾種方法總結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于Spring + mybatis + mysql使用事物的幾種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05Springboot 整合shiro實(shí)現(xiàn)權(quán)限控制的方法
這篇文章主要介紹了Springboot 整合shiro實(shí)現(xiàn)權(quán)限控制的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Java處理時(shí)間格式CST和GMT轉(zhuǎn)換方法示例
這篇文章主要給大家介紹了關(guān)于Java處理時(shí)間格式CST和GMT轉(zhuǎn)換方法的相關(guān)資料,相信很多小伙伴在時(shí)間格式轉(zhuǎn)換的時(shí)候非常頭疼,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09java中如何判斷JSONObject是否存在某個(gè)Key
這篇文章主要介紹了java中如何判斷JSONObject是否存在某個(gè)Key,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07eclipse里沒(méi)有“Dynamic Web Project“這個(gè)選項(xiàng)的問(wèn)題解決
本文主要介紹了eclipse里沒(méi)有“Dynamic Web Project“這個(gè)選項(xiàng)的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08jvm垃圾回收GC調(diào)優(yōu)基礎(chǔ)原理分析
談到調(diào)優(yōu),這一定是針對(duì)特定場(chǎng)景、特定目的的事情, 對(duì)于 GC 調(diào)優(yōu)來(lái)說(shuō),首先就需要清楚調(diào)優(yōu)的目標(biāo)是什么?從性能的角度看,通常關(guān)注三個(gè)方面,內(nèi)存占用(footprint)、延時(shí)(latency)和吞吐量(throughput)2022-01-01java注解處理器學(xué)習(xí)在編譯期修改語(yǔ)法樹(shù)教程
這篇文章主要為大家介紹了java注解處理器學(xué)習(xí)在編譯期修改語(yǔ)法樹(shù)教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09對(duì)SpringBoot項(xiàng)目Jar包進(jìn)行加密防止反編譯
最近項(xiàng)目要求部署到其他公司的服務(wù)器上,但是又不想將源碼泄露出去,要求對(duì)正式環(huán)境的啟動(dòng)包進(jìn)行安全性處理,防止客戶(hù)直接通過(guò)反編譯工具將代碼反編譯出來(lái),本文介紹了如何對(duì)SpringBoot項(xiàng)目Jar包進(jìn)行加密防止反編譯,需要的朋友可以參考下2023-10-10