前不久的項(xiàng)目時(shí)間緊張,為了盡快完成原型開(kāi)發(fā),寫(xiě)了一段效率相當(dāng)?shù)偷拇a。
最近幾天閑下來(lái),主動(dòng)把之前的代碼優(yōu)化了一下:)
標(biāo)簽:Java、Mybatis、MySQL
概況:本地系統(tǒng)從另外一個(gè)系統(tǒng)得到實(shí)體類集合List<UserEvent>,但是實(shí)體中只有eventId信息,其他屬性值均為空。
需要從數(shù)據(jù)庫(kù)中查詢數(shù)據(jù),完善List<UserEvent>的信息并返回。
相關(guān)業(yè)務(wù)表以及對(duì)應(yīng)的實(shí)體類,如下圖。(為了回避項(xiàng)目信息,相關(guān)業(yè)務(wù)內(nèi)容均省略,以下表名、實(shí)體名、代碼變量名等均用字母ABC代替。)
原處理
1.先來(lái)看代碼,乍一看邏輯清晰,符合正常思維習(xí)慣。
但是仔細(xì)查看發(fā)現(xiàn),for循環(huán)中的每步處理都和數(shù)據(jù)查詢有關(guān)。假設(shè)有10次循環(huán),每次循環(huán)中有4次數(shù)據(jù)庫(kù)連接查詢,一共需要連接數(shù)據(jù)庫(kù)40次。
每次數(shù)據(jù)庫(kù)連接都需要一定的開(kāi)銷,隨著循環(huán)量不斷增加,處理時(shí)間將成倍增長(zhǎng),造成資源浪費(fèi)。
1 String eventId = ""; 2 String aTime = ""; 3 for (UserEvent event : userEventList) { 4 eventId = event.getEventId(); 5 6 // 獲取業(yè)務(wù)B信息 7 List<EntityB> listB = mapperB.selectBInfoByEventId(eventId); 8 event.setListB(listB); 9 10 // 獲取業(yè)務(wù)C信息11 List<EntityC> listC = mapperC.selectCInfoByEventId(eventId);12 event.setListC(listC);13 14 // 查看是否有業(yè)務(wù)B處理15 EntityB entityB = mapperB.selectBInfoByPrimary(phone, eventId);16 event.setIsActionB(null == entityB ? "false" : "true");17 18 // 獲取業(yè)務(wù)A和用戶信息19 User userInfo = mapperA.selectEventUserInfoByEventId(eventId);20&