Mybatis中一對多(collection)和一對一(association)的組合查詢使用
Collection
collection: 一個復(fù)雜的類型關(guān)聯(lián),許多結(jié)果將映射為這種類型property: 這是關(guān)聯(lián)的 JavaBean 中的屬性名, 在 RoleModel 中對應(yīng) private List<MenuModel> menus;javaType: property 屬性對應(yīng)的集合類型ofType: property 集合中的泛型,即定義時泛型所表示的具體類型column: RoleModel 的 id ,作為參數(shù)傳入被調(diào)用的 Select 語句
用法,嵌套在其他的查詢說sql中,寫法 主要以下3種:
第一種:select 語句在其他dao.java對應(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語句在同一個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>
第三種,如果再一個查詢中可以直接查詢到所需要的數(shù)據(jù)
但是需要映射到該對象的屬性上,則可以使用該方式(建議使用上兩種,看起來更清晰):
<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ù)庫列的字段或?qū)傩浴?/li>column:數(shù)據(jù)庫的列名或者列標簽別名。與傳遞給resultSet.getString(columnName)的參數(shù)名稱相同。javaType:完整java類名或別名(參考上面的內(nèi)置別名列表)。如果映射到一個JavaBean,那MyBatis 通常會自行檢測到。然而,如果映射到一個HashMap,那您應(yīng)該明確指定javaType 來確保所需行為。resultMap:一個可以映射聯(lián)合嵌套結(jié)果集到一個適合的對象視圖上的ResultMap。這是一個替代的方式去調(diào)用另一個select語句。
association查詢與主查詢一般寫在一個文件中,如下:
第一種:不另外寫查詢語句
(1)把返回的屬性提取出來
<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>
第二種:另外寫查詢語句
<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,只傳一個參數(shù)時名稱可以不一樣)
</select>
第三種:與collection一樣
提到外面其他的dao接口中,此處省略…
補充:
association的使用要特別注意下,數(shù)據(jù)映射時會出現(xiàn)異常,再一次的項目中就出現(xiàn)過實際有5條數(shù)據(jù),但返回到service層時只有1條數(shù)據(jù),這一條數(shù)據(jù)各個部分的信息還不對應(yīng),通過打印mysql執(zhí)行語句和逐條排查,發(fā)現(xiàn)是association標簽的問題;
切記,association使用時<resultMap id="testMap" type="xxx" >中一定要有 <id>標簽,否則會出現(xiàn)返回的數(shù)據(jù)與實際查詢結(jié)果不一致的問題
多參數(shù)傳遞
當需要傳遞多個值時,寫法如下:
column= “{prop1=col1,prop2=col2}接收的類型為 parameterType=“java.util.Map”,這里的參數(shù)使用時名稱要保持一致;
例:
<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é)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- Mybatis中collection和association的使用區(qū)別詳解
- mybatis利用association或collection傳遞多參數(shù)子查詢
- Mybatis之a(chǎn)ssociation和collection用法
- 在Mybatis中association標簽多層嵌套的問題
- mybatis中一對一關(guān)系association標簽的使用
- MyBatis中association的基本使用方法
- mybatis的association傳遞參數(shù)問題示例
- MyBatis的collection和association的使用解讀
- mybatis中association標簽的使用解讀
- MyBatis使用嵌套查詢collection和association的實現(xiàn)
- Mybatis的association使用子查詢結(jié)果錯誤的問題解決
相關(guān)文章
Java常用正則表達式驗證工具類RegexUtils.java
相信大家對正則表達式一定都有所了解和研究,這篇文章主要為大家分享了Java 表單注冊常用正則表達式驗證工具類,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11
一文探究ArrayBlockQueue函數(shù)及應(yīng)用場景
這篇文章主要為大家介紹了一文探究ArrayBlockQueue函數(shù)及應(yīng)用場景,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03
JAVA使用POI獲取Excel的列數(shù)與行數(shù)
Apache POI 是用Java編寫的免費開源的跨平臺的 Java API,Apache POI提供API給Java程式對Microsoft Office格式檔案讀和寫的功能。 下面這篇文章給大家介紹了JAVA使用POI獲取Excel列數(shù)和行數(shù)的方法,有需要的朋友們可以參考借鑒,下面來一起看看吧。2016-12-12
java Comparator.comparing排序使用示例
本文主要介紹了java Comparator.comparing排序使用示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10
Java Socket編程簡介_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了Java Socket編程簡介的相關(guān)知識,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-05-05
SpringBoot整合Echarts實現(xiàn)用戶人數(shù)和性別展示功能(詳細步驟)
這篇文章主要介紹了SpringBoot整合Echarts實現(xiàn)用戶人數(shù)和性別展示,通過數(shù)據(jù)庫設(shè)計、實現(xiàn)數(shù)據(jù)訪問層、業(yè)務(wù)邏輯層和控制層的代碼編寫,以及前端頁面的開發(fā),本文詳細地介紹了SpringBoot整合Echarts的實現(xiàn)步驟和代碼,需要的朋友可以參考下2023-05-05
使用Nacos實現(xiàn)動態(tài)路由的步驟和代碼示例
這篇文章主要介紹了使用 Nacos 實現(xiàn) Spring Cloud Gateway 的動態(tài)路由,本文給大家介紹了具體的實現(xiàn)步驟和代碼案例,感興趣的小伙伴跟著小編一起來看看吧2024-09-09
SpringBoot使用@EnableAutoConfiguration實現(xiàn)自動配置詳解
你有想過SpringBoot為什么能夠自動的幫我們創(chuàng)建一個Bean對象么?或許在我們使用的時候只需要在自己自定義的配置文件中加入@Bean對象就可以,但SpringBoot是如何來創(chuàng)建的呢2022-08-08

