mybatis 一对一 一对多 级联查询
大家好,我是烤鴨:
? ? 今天分享一下關于mybatis的級聯查詢。
? ? 環境:
? ? ? ? mybatis? ?3.2.8
? ? ? ? spring? ? ? 4.1.9
?
1.? ?業務場景
? ? 在一個人申請某些賬號或者權限的時候,比如微信的認證流程。
? ?會讓你一步一步按要求輸入,比如第一步:點擊微信認證,第二步:認證聯系人信息填寫;最后一步:填寫公眾號名稱、功能介紹、選擇運營地區就。
? ?當你在填寫完第二步退出之后,再重新登錄會發現第一步的信息已經記錄了。
? ?這里至少要設計四張表,流程表和每一步的表,都是主鍵一一關聯,這是一對一。
? ?又或者如其他平臺的企業版的認證,可以添加下級的機構,這就是一對多了。
2.? ? mybatis 構建
? ? ?get,set方法是必須要的,我這里沒粘貼出來。
pojo:
public class ApplyCompanyBackResp{private static final long serialVersionUID = 1L;private ApplyCompanyBusinessA businessA1;private ApplyCompanyBusinessAl businessAl;private ApplyCompanyBusinessCt businessC1;private ApplyCompanyBusinessCr businessC2;private ApplyCompanyBusinessJ businessAliantJ1;private ApplyCompanyBusinessM businessM1;private ApplyCompanyBusinessMo businessAliantM2;private List<ApplyCompanyBusinessJ1Store> businessJ1StoreList;}mapper:
<!--根據當前頁面獲取該企業開通的權限--><select id="applyCompanyAuthorityBusiness" parameterType="com.xxx.xxxx.xxx.xxx.xxx.entity.ApplyCompanyAuthority"resultMap="applyCompanyResp">SELECTacbc.`status` AS 'c1Status','c1' AS 'c1Remarks',acbcc.`status` AS 'c2Status','c2' AS 'c2Remarks',acba.`status` AS 'a1Status','a1' AS 'a1Remarks',acbac.`status` AS 'a2Status','a2' AS 'a2Remarks',acbj.status AS 'J1Status','j1' AS 'j1Remarks',acbmr.`status` AS 'm1Status','m1' AS 'm1Remarks',acbmr2.status AS 'm2Status','m2' AS 'm2Remarks',acbjs.jx_name AS 'j1Name',acbjs.status AS 'j1StoreStatus'FROM apply_company_process acpLEFT JOIN apply_company_business_c1 acbc ON acbc.apply_id = acp.apply_idLEFT JOIN apply_company_business_c2 acbcc ON acbcc.apply_id = acp.apply_idLEFT JOIN apply_company_business_a1 acba ON acba.apply_id = acp.apply_idLEFT JOIN apply_company_business_a2 acbac ON acbac.apply_id = acp.apply_idLEFT JOIN apply_company_business_j1 acbj ON acbj.apply_id = acp.apply_idLEFT JOIN apply_company_business_m1 acbmr ON acbmr.apply_id = acp.apply_idLEFT JOIN apply_company_business_m2 acbmr2 ON acbmr2.apply_id = acp.apply_idLEFT JOIN apply_company_business_j1_store acbjs ON acbjs.apply_id = acbj.apply_id<where>1 = 1 AND 'needOptimization' = 'needOptimization' AND acp.apply_id = #{applyId}</where></select><resultMap type="com.xxx.xxxx.xxx.xxx.xxx.entity.ApplyCompanyBackResp" id="applyCompanyResp"><!-- 配置xx相關的映射信息 --><association property="businessA1" column="apply_id" javaType="com.xxx.xxxx.xxx.xxx.xxx.entity.ApplyCompanyBusinessA1"><id property="applyId" column="applyId" /><result property="remarks" column="a1Remarks"/><result property="status" column="a1Status"/></association><!-- 配置xx的映射信息 --><association property="businessA2" column="apply_id" javaType="com.xxx.xxxx.xxx.xxx.xxx.entity.ApplyCompanyBusinessA2"><id property="applyId" column="applyId" /><result property="remarks" column="a2Remarks"/><result property="status" column="a2Status"/></association><!-- 配置xx相關的映射信息 --><association property="businessC1" column="apply_id" javaType="com.xxx.xxxx.xxx.xxx.xxx.entity.ApplyCompanyBusinessC1"><id property="applyId" column="applyId" /><result property="remarks" column="c1Remarks"/><result property="status" column="c1Status"/></association><!-- 配置xx相關的映射信息 --><association property="businessC2" column="apply_id" javaType="com.xxx.xxxx.xxx.xxx.xxx.entity.ApplyCompanyBusinessC2"><id property="applyId" column="applyId" /><result property="remarks" column="c2Remarks"/><result property="status" column="c2Status"/></association><!-- 配置xx相關的映射信息 --><association property="businessAliantJ1" column="apply_id" javaType="com.xxx.xxxx.xxx.xxx.xxx.entity.ApplyCompanyBusinessJ1"><id property="applyId" column="applyId" /><result property="remarks" column="j1Remarks"/><result property="status" column="j1Status"/></association><!-- 配置xx相關的映射信息 --><association property="businessM1" column="businessMobileRecycling.aliStatus" javaType="com.xxx.xxxx.xxx.xxx.xxx.entity.ApplyCompanyBusinessM1"><id property="applyId" column="applyId" /><result property="remarks" column="m1Remarks"/><result property="status" column="m1Status"/></association><!-- 配置xx相關的映射信息 --><association property="businessAliantM2" column="apply_id" javaType="com.xxx.xxxx.xxx.xxx.xxx.entity.ApplyCompanyBusinessM2"><id property="applyId" column="applyId" /><result property="remarks" column="m2Remarks"/><result property="status" column="m2Status"/></association><!-- 配置xx相關的信息 --><!--collection用于指定集合類型的映射.property指定對應的集合名稱.ofType指定集合中存放的數據的類型 --><collection property="businessJ1StoreList" ofType="com.xxx.xxxx.xxx.xxx.xxx.entity.ApplyCompanyBusinessJ1Store"><!-- id和result指定了需要配置的列和屬性名和映射 --><result property="applyId" column="applyId" /><result property="jxName" column="j1Name"/><result property="status" column="j1StoreStatus"/></collection></resultMap>從sql我們可以看出來,有一張process主表,其他的表都是以applyId作為主鍵關聯。其中store表是一對多的關系,其他都是一對一。如果我們想把這個企業的所有權限信息展示,就需要關聯這些所有的表。
需求是查詢這些權限的狀態,所以不需要太多其他的字段。
association? 一對一。
property :
association? 中的 property 對應的是 resultMap實體中的屬性名稱,在上面就是這個ApplyCompanyBackResp。
ApplyCompanyBackResp 這個pojo中的屬性名稱,比如 businessA1 對應的 property 就是?businessA1。
column:
column 是一定要寫的 ,對應的是數據庫的關聯字段名稱,比如上邊的是apply_id 。
javaType:
返回的實體類型。
id:
數據庫表主鍵,我這邊是主鍵關聯,所以id就是apply_id。property 是 實體屬性 ,column是 查詢的結果字段(別名)。比如上邊的各種status,是起的別名,這里要和下邊的 column 對應上。
針對于我這邊不需要查詢主鍵,可以不查。
result:
和id是一樣的, 是非主鍵的字段映射。property 是 實體屬性 ,column是 查詢的結果字段(別名)。
?
collection 一對多:
property :
association? 中的 property 對應的是 resultMap實體中的屬性名稱,在上面就是這個ApplyCompanyBackResp。
ApplyCompanyBackResp 這個pojo中的屬性名稱,比如 businessJ1StoreList對應的 property 就是?businessJ1StoreList。
ofType:
返回的實體類型。
id:
數據庫表主鍵,我這邊是主鍵關聯,所以id就是apply_id。property 是 實體屬性 ,column是 查詢的結果字段(別名)。比如上邊的各種status,是起的別名,這里要和下邊的 column 對應上。
針對于我這邊不需要查詢主鍵,可以不查。
result:
和id是一樣的, 是非主鍵的字段映射。property 是 實體屬性 ,column是 查詢的結果字段(別名)。
?
3.? ? 總結
? ? mybatis的級聯查詢,如果是一對一,一定在 association標簽內加 column屬性。這樣查詢出來的才能封裝到?結果對象 中。
? ? 如果是一對多,mysql查詢出來的數據結果就會是多條。比如上面的情況,查詢出來的結果如果是2條,這兩條數據collection前面的結果是一樣的,只是針對于collection中的屬性名稱的 結果 不一樣。類似下圖,應該j1Name,j1StoreStatus 這列是從別的表查詢出來的,其他列數據是相同的。
? ? 如果你想清晰一點你的話,也可以在?association 或者 collection 寫?select標簽,值是 select 語句。類似下圖
? ??
?
總結
以上是生活随笔為你收集整理的mybatis 一对一 一对多 级联查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cad快看_浩辰CAD看图王教你免费打开
- 下一篇: CocoaPods安装和使用及问题:Se