一、需求
項目里要讓用戶能夠設置所選擇教材的章課節,以針對章課節提供相應的題目供用戶做題。
設計:用戶設置了教材后,首次登錄,進行章節設置時。默認為用戶選擇第一章、第一課、第一節。
思路:用戶訪問頁面,章一欄顯示所有章,課一欄顯示第一章下所有課程,節一欄顯示第一章、第一課下的所有節。然后獲取用戶當前選擇的章課節信息。如果當前用戶沒有設置過該教材的章課節,就為其設置默認的第一章、第一課、第一節。
數據庫設計:此處將章課節所有信息存放到一張表中,可遞歸查詢。最上一級章的parentid是教材的id。故給一個教材id便可以查找到其下所有的章課節信息。
二、解決
已設置的我們這里不討論,只需要到庫中查詢對應的章課節即可。
那么對於默認第一章第一課第一節,我們這里使用一個遞歸函數將查詢的結果存放到一個list中
/** * 根據給定的id,查詢其下的第一課、第一節(不只適用於章課節三級,如果下面還有級別的目錄,也可查 * * 詢出) * * @param l 是教材id * @param list * @return */ public void getSubChapter(long l, List<BookChapter> list) { BookChapter c = null; String sql = "SELECT D.chapter_id chapter_id, D .chapter_name chapter_name, D . LEVELS LEVELS FROM " + "( SELECT * FROM mic_study_book_chapter c WHERE c.parent_chapter_id =? ORDER BY c.code ) D WHERE ROWNUM = 1 "; Object[] params = { l }; try { logger.info(sql.toString().replaceAll("\\?", "{}"), params); List<BookChapter> li = this.getJdbcTemplate().query(sql, params,new BookChapterRowMapper()); if(li.size() != 0){ c = li.get(0); if (c != null) { list.add(c); getSubChapter(c.getId(), list);//遞歸查詢 } } } catch (Exception e) { logger.error(e.getMessage(),e); } }
遞歸查詢的特點:函數方法自己掉用自己,通過某個條件判斷跳出最后一個被調用的遞歸方法。