現(xiàn)原理:MyBatis 手動分頁的完整思路)
jcalaBlog 分頁功能實(shí)現(xiàn)原理MyBatis 手動分頁的完整思路【免費(fèi)下載鏈接】jcalaBloga personal blog site based on springbootsrpingMVCmybatisvelocitybootstrapmysql項(xiàng)目地址: https://gitcode.com/gh_mirrors/jc/jcalaBlogjcalaBlog 是一個基于 Spring Boot Spring MVC MyBatis MySQL 構(gòu)建的個人博客項(xiàng)目它的分頁功能沒有依賴 PageHelper 等插件而是采用MyBatis 手動分頁。本文將從源碼入手逐層拆解 jcalaBlog 分頁功能實(shí)現(xiàn)原理帶你理解「頁碼 → 偏移量 → LIMIT 語句 → 頁面渲染」的完整鏈路這套思路同樣適用于任何使用 MySQL 的后端項(xiàng)目。為什么選擇 MyBatis 手動分頁很多新手一提到分頁第一反應(yīng)就是引入 PageHelper 插件。而 jcalaBlog 選擇了最樸素、也最能看清本質(zhì)的方式——MyBatis 手動分頁即在 SQL 中直接書寫LIMIT關(guān)鍵字完成數(shù)據(jù)切片。它的核心公式只有一句話起始偏移量 start (當(dāng)前頁碼 - 1) × 每頁條數(shù)手動分頁的好處非常明顯SQL 完全可控、依賴極少、原理透明非常適合個人博客這種數(shù)據(jù)量不大的場景。下面我們就沿著 Controller → Service → Mapper 的調(diào)用順序一步步看清它是怎么落地的。后臺博客列表分頁的典型示范 先看效果。jcalaBlog 后臺的「Blog List」頁面就是一個標(biāo)準(zhǔn)的分頁列表表格下方帶有頁碼控件和上/下頁箭頭這正是我們要拆解的目標(biāo)可以看到分頁并不神秘前端只負(fù)責(zé)展示「第幾頁」后端負(fù)責(zé)算出「該取哪些數(shù)據(jù)」。接下來進(jìn)入源碼環(huán)節(jié)。第一步Mapper 層用 LIMIT 完成手動分頁 SQLjcalaBlog 的分頁 SQL 全部寫在 Mapper 接口的注解里核心方法在 BlogMapper.javaSelect({ select vid,title,tags, from blog_view, limit #{st},10 }) ListBlogView selectTenBlogs(Param(st) int start);這里就是MyBatis 手動分頁的關(guān)鍵limit #{st},10表示跳過前st條、再取 10 條。MySQL 中LIMIT 偏移量, 條數(shù)的語義讓 Mapper 只需要接收一個「偏移量」參數(shù)即可配合select count(*)統(tǒng)計(jì)總數(shù)分頁所需的兩塊拼圖就齊了。類似的寫法還出現(xiàn)在歸檔頁 BlogMapper.java每頁 12 條和項(xiàng)目列表 ProjectMapper.java每頁 5 條中說明這套模式在項(xiàng)目里被廣泛復(fù)用。第二步Service 層把頁碼換算成偏移量Mapper 只認(rèn)「偏移量」不認(rèn)「頁碼」中間的換算由 Service 層完成。見 BlogSerImpl.javapublic ListBlogView getBlogPage(int id){ int start (id - 1) * 10; return blogMapper.selectTenBlogs(start); }這就是手動分頁最精華的一行(id - 1) * 10。把頁碼與每頁條數(shù)10相乘就得到要跳過的記錄數(shù)。頁碼與偏移量的換算關(guān)系如下頁碼偏移量 (pageSize10)取出的記錄10第 110 條210第 1120 條320第 2130 條歸檔頁的getArchive(int page)同理只是每頁條數(shù)換成了 12BlogSerImpl.java。第三步總頁數(shù)計(jì)算決定分頁條渲染幾個數(shù)字光有當(dāng)前頁數(shù)據(jù)還不夠頁面底部還要顯示「一共有幾頁」。jcalaBlog 的做法是先count總數(shù)再向上取整見 BlogSerImpl.javaint num blogMapper.selectBlogNum(); return num % 10 0 ? num / 10 : num / 10 1;邏輯很好懂總數(shù)能被 10 整除就整除否則加一頁。比如 23 篇文章、每頁 10 條就會得到 3 頁。由于歸檔頁每頁 12 條getArchiveNum()也按同樣的思路獨(dú)立計(jì)算了一次。第四步Controller 通過路徑變量接收頁碼頁碼怎么從 URL 進(jìn)到代碼里答案是 Spring MVC 的PathVariable。后臺列表見 BlogCtrl.javaGetMapping(/blogList/{page}) public String blogList(PathVariable int page, Model model) { model.addAttribute(current, page); model.addAttribute(pageNum, blogSer.adminGetPageNum()); model.addAttribute(blogList, blogSer.getBlogPage(page)); return admin/blog_list; }前端歸檔頁也完全一致通過/archives/{page}接收頁碼并注入模型FontEndCtrl.java。這樣一次請求就拿到了三樣?xùn)|西當(dāng)前頁數(shù)據(jù)、總頁數(shù)、當(dāng)前頁碼接下來就交給模板渲染。第五步Velocity 分頁宏統(tǒng)一渲染翻頁控件jcalaBlog 使用 Velocity 模板引擎翻頁控件被封裝成了可復(fù)用的宏#flip定義在 VM_global_library.vm。它接收三個參數(shù)——總頁數(shù)、當(dāng)前頁、鏈接前綴內(nèi)部用$current - 1和$current 1生成上一頁/下一頁地址并用循環(huán)輸出所有頁碼后臺列表頁調(diào)用#flip($pageNum $current $href)見 blog_list.vm前端歸檔頁調(diào)用#frontFlip($pageNum $current $href)只有上一頁/下一頁兩種按鈕見 archives.vm宏的復(fù)用讓所有分頁頁面保持了一致的視覺風(fēng)格改一處即可全局生效。完整流程串起來一次點(diǎn)擊發(fā)生了什么把上面的環(huán)節(jié)連起來一次翻頁操作的完整鏈路是用戶點(diǎn)擊「第 2 頁」瀏覽器請求/admin/blogList/2Controller 用PathVariable拿到頁碼2同時查出總頁數(shù)Service 計(jì)算偏移量(2-1)*10 10調(diào)用 MapperMapper 執(zhí)行select ... limit 10,10從第 11 條開始取 10 條數(shù)據(jù)、總頁數(shù)、當(dāng)前頁碼一起放進(jìn) ModelVelocity 模板渲染列表與分頁宏用戶在瀏覽器看到第 2 頁內(nèi)容。整個過程沒有一行插件代碼全靠 MyBatis 手動分頁的LIMIT與頁碼換算條理清晰、極易排查問題。寫在最后這套分頁思路能給你什么啟發(fā)通過 jcalaBlog 分頁功能實(shí)現(xiàn)原理你至少收獲了三件事一是記住了MyBatis 手動分頁的核心公式start (page-1) * size二是學(xué)會了用「Controller 收頁碼 → Service 算偏移 → Mapper 執(zhí)行 LIMIT → 模板渲染」的四層協(xié)作模式組織代碼三是理解了count總數(shù)與向上取整的總頁數(shù)計(jì)算技巧。下次遇到分頁需求不妨先用手動方式把原理吃透再決定是否引入插件——畢竟知其然更要知其所以然。如果覺得文章有幫助歡迎收藏轉(zhuǎn)發(fā)讓更多初學(xué)者看懂分頁這件事【免費(fèi)下載鏈接】jcalaBloga personal blog site based on springbootsrpingMVCmybatisvelocitybootstrapmysql項(xiàng)目地址: https://gitcode.com/gh_mirrors/jc/jcalaBlog創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考