java - Mybatis關(guān)聯(lián)查詢
問題描述
實(shí)際開發(fā)中,Mybatis一對(duì)多、多對(duì)多關(guān)聯(lián)查詢是用reultMap引用,javaType引用還是select引用,性能哪個(gè)比較好?用select懶加載,會(huì)提高查詢速度和性能?
問題解答
回答1:mybatis對(duì)于處理一對(duì)多的情況有三種解決方案:
查詢的時(shí)候join子表,然后交由mybatis拼裝
查詢的時(shí)候不join子表,另外發(fā)起select去抓取子表數(shù)據(jù)
和第二種類似,只不過利用fetchType=lazy來(lái)延緩抓取的時(shí)機(jī)
這三種方案各有問題:
第一種方案有兩個(gè)缺陷:1) 做分頁(yè)查詢的時(shí)候不準(zhǔn),2) 如果關(guān)聯(lián)子表多,笛卡爾積會(huì)非常大
第二種方案會(huì)出現(xiàn)1+N次查詢,發(fā)起的sql數(shù)量會(huì)非常恐怖
第三種方案看似提升了第一次查詢的效率,但是如果在循環(huán)里get lazy property,那么和第二種方案沒有什么區(qū)別
因此如果對(duì)性能上有要求, 需要由我們自己去拼裝一對(duì)多的集合,處理的辦法是:把主表的ID都收集起來(lái), 發(fā)起一次性查詢把所有子表的數(shù)據(jù)抓取出來(lái),然后人工拼裝。這樣發(fā)起的查詢數(shù)量就是1+1。
相關(guān)文章:
1. PHPExcel表格導(dǎo)入數(shù)據(jù)庫(kù)怎么導(dǎo)入2. 預(yù)訂金和尾款分別支付3. thinkphp6使用驗(yàn)證器 信息如何輸出到前端頁(yè)面4. javascript - h5微信中怎么禁止橫屏5. macos - 無(wú)法source activate python276. python - 調(diào)用api輸出頁(yè)面,會(huì)有標(biāo)簽出現(xiàn),請(qǐng)問如何清掉?7. 運(yùn)行python程序時(shí)出現(xiàn)“應(yīng)用程序發(fā)生異?!钡膬?nèi)存錯(cuò)誤?8. 我在導(dǎo)入模板資源時(shí)遇到無(wú)法顯示的問題,請(qǐng)老師解答下9. empty比isset更嚴(yán)格一點(diǎn)10. javascript - 微信網(wǎng)頁(yè)開發(fā)從菜單進(jìn)入頁(yè)面后,按返回鍵沒有關(guān)閉瀏覽器而是刷新當(dāng)前頁(yè)面,求解決?

網(wǎng)公網(wǎng)安備