前不久的項目時間緊張,為了盡快完成原型開發(fā),寫了一段效率相當?shù)偷拇a。
最近幾天閑下來,主動把之前的代碼優(yōu)化了一下:)
標簽:Java、Mybatis、MySQL
概況:本地系統(tǒng)從另外一個系統(tǒng)得到實體類集合List<UserEvent>,但是實體中只有eventId信息,其他屬性值均為空。
需要從數(shù)據(jù)庫中查詢數(shù)據(jù),完善List<UserEvent>的信息并返回。
相關(guān)業(yè)務(wù)表以及對應(yīng)的實體類,如下圖。(為了回避項目信息,相關(guān)業(yè)務(wù)內(nèi)容均省略,以下表名、實體名、代碼變量名等均用字母ABC代替。)
原處理
1.先來看代碼,乍一看邏輯清晰,符合正常思維習慣。
但是仔細查看發(fā)現(xiàn),for循環(huán)中的每步處理都和數(shù)據(jù)查詢有關(guān)。假設(shè)有10次循環(huán),每次循環(huán)中有4次數(shù)據(jù)庫連接查詢,一共需要連接數(shù)據(jù)庫40次。
每次數(shù)據(jù)庫連接都需要一定的開銷,隨著循環(huán)量不斷增加,處理時間將成倍增長,造成資源浪費。
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&