Spring Boot - Spring Boot 集成 MyBatis 分頁實現 手寫 SQL 分頁

一、準備階段

1、依賴引入
  • pom.xml
<properties>...<postgresql.verison>42.5.6</postgresql.verison><mybatis.version>3.0.1</mybatis.version>
</properties>
<dependencies>...<!-- postgresql 驅動 --><dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>${postgresql.verison}</version></dependency><!-- mybatis 和 springboot 整合的起步依賴 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.version}</version></dependency>
</dependencies>
2、配置文件
  1. application.yml
mybatis:mapper-locations: classpath:/mapper/*.xml # 映射文件路徑config-location: classpath:/mybatis-config.xml # 核心配置文件路徑
  1. mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC"-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><settings><!-- 設置駝峰標識 --><setting name="mapUnderscoreToCamelCase" value="true"/><!-- 打印 SQL 語句 --><setting name="logImpl" value="STDOUT_LOGGING"/></settings>
</configuration>
3、準備數據
  1. 創建數據表
CREATE TABLE staff (id SERIAL PRIMARY KEY,name VARCHAR(255) NOT NULL,role VARCHAR(255),salary DECIMAL(10, 2)
);
  1. 插入數據
INSERT INTO staff (name, role, salary) VALUES
('張三', '項目經理', 25000.00),
('李四', '高級開發工程師', 18000.00),
('王五', '開發工程師', 15000.00),
('趙六', '測試工程師', 12000.00),
('錢七', 'UI設計師', 13000.00),
('孫八', '產品經理', 20000.00),
('周九', '運維工程師', 14000.00),
('吳十', '初級開發工程師', 10000.00),
('鄭十一', '數據庫管理員', 16000.00),
('王十二', '技術總監', 30000.00);

二、手寫 SQL 分頁實現

1、XML 方式
(1)Mapper
  1. StaffMapper.java
@Mapper
public interface StaffMapper {List<Staff> queryStaffs(int offset, int pageSize);Integer countStaffs();
}
  1. StaffMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd" ><mapper namespace="com.my.mapper.StaffMapper"><resultMap id="staffResultMap" type="com.my.model.db.Staff"><id column="id" property="id"/><result column="name" property="name"/><result column="role" property="role"/><result column="salary" property="salary"/></resultMap><select id="queryStaffs" resultMap="staffResultMap">SELECT *FROM staff LIMIT #{pageSize}OFFSET #{offset}</select><select id="countStaffs" resultType="int">SELECT COUNT(*)FROM staff</select>
</mapper>
(2)Test
// 分頁參數計算
int pageNum = 2; // 當前頁碼
int pageSize = 2; // 每頁條數
int offset = (pageNum - 1) * pageSize;List<Staff> staffs = staffMapper.queryStaffs(offset, pageSize);
int total = staffMapper.countStaffs();
int pageTotal = (int) Math.ceil((double) total / pageSize);for (Staff staff : staffs) {System.out.println(staff);
}System.out.println("pageNum: " + pageNum);
System.out.println("pageSize: " + pageSize);
System.out.println("pageTotal: " + pageTotal);
System.out.println("total: " + total);
# 輸出結果Staff(id=5, name=王五, role=開發工程師, salary=15000.0)
Staff(id=6, name=趙六, role=測試工程師, salary=12000.0)
pageNum: 2
pageSize: 2
pageTotal: 5
total: 10
2、注解方式
(1)Mapper
  • StaffMapper.java
@Select("SELECT * FROM staff ORDER BY id LIMIT #{pageSize} OFFSET #{offset}")
List<Staff> queryStaffs(int offset, int pageSize);@Select("SELECT COUNT(*) FROM staff")
Integer countStaffs();
(2)Test
// 分頁參數計算
int pageNum = 2; // 當前頁碼
int pageSize = 2; // 每頁條數
int offset = (pageNum - 1) * pageSize;List<Staff> staffs = staffMapper.queryStaffs(offset, pageSize);
int total = staffMapper.countStaffs();
int pageTotal = (int) Math.ceil((double) total / pageSize);for (Staff staff : staffs) {System.out.println(staff);
}System.out.println("pageNum: " + pageNum);
System.out.println("pageSize: " + pageSize);
System.out.println("pageTotal: " + pageTotal);
System.out.println("total: " + total);
# 輸出結果Staff(id=5, name=王五, role=開發工程師, salary=15000.0)
Staff(id=6, name=趙六, role=測試工程師, salary=12000.0)
pageNum: 2
pageSize: 2
pageTotal: 5
total: 10

三、手寫 SQL 分頁實現封裝

1、Entity
  • PageResult.java
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageResult<T> {private List<T> data;private Integer pageNum;private Integer pageSize;private Integer pageTotal;private Integer total;
}
2、Mapper
  • StaffMapper.java
@Select("SELECT * FROM staff ORDER BY id LIMIT #{pageSize} OFFSET #{offset}")
List<Staff> queryStaffs(int offset, int pageSize);@Select("SELECT COUNT(*) FROM staff")
Integer countStaffs();
3、Service
  1. StaffService.java
public interface StaffService {PageResult<Staff> queryStaffs(int pageNum, int pageSize);
}
  1. StaffServiceImpl.java
@Service
public class StaffServiceImpl implements StaffService {@Autowiredprivate StaffMapper staffMapper;@Overridepublic PageResult<Staff> queryStaffs(int pageNum, int pageSize) {int offset = (pageNum - 1) * pageSize;List<Staff> staffs = staffMapper.queryStaffs(offset, pageSize);int total = staffMapper.countStaffs();int pageTotal = (int) Math.ceil((double) total / pageSize);return new PageResult<>(staffs, pageNum, pageSize, pageTotal, total);}
}
4、Test
PageResult<Staff> staffPageResult = staffService.queryStaffs(1, 5);List<Staff> staffs = staffPageResult.getData();
int pageNum = staffPageResult.getPageNum();
int pageSize = staffPageResult.getPageSize();
int pageTotal = staffPageResult.getPageTotal();
int total = staffPageResult.getTotal();for (Staff staff : staffs) {System.out.println(staff);
}System.out.println("pageNum: " + pageNum);
System.out.println("pageSize: " + pageSize);
System.out.println("pageTotal: " + pageTotal);
System.out.println("total: " + total);
# 輸出結果Staff(id=3, name=張三, role=項目經理, salary=25000.0)
Staff(id=4, name=李四, role=高級開發工程師, salary=18000.0)
Staff(id=5, name=王五, role=開發工程師, salary=15000.0)
Staff(id=6, name=趙六, role=測試工程師, salary=12000.0)
Staff(id=7, name=錢七, role=UI設計師, salary=13000.0)
pageNum: 1
pageSize: 5
pageTotal: 2
total: 10

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/91337.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/91337.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/91337.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

李宏毅《生成式人工智能導論》 | 第9講 AI Agent

文章目錄大模型未來趨勢&#xff1a;以大型語言模型打造的AgentAI Agent運行的可能原理有記憶的ChatGPT大模型未來趨勢&#xff1a;以大型語言模型打造的Agent 人類需要做多步驟的復雜任務&#xff0c;AI可以做到這件事嗎&#xff1f; 如果可以我們將其稱為AI Agent&#xff…

OCR 與 AI 圖像識別:協同共生的智能雙引擎

OCR 擅長提取圖像中的文字信息&#xff0c;但面對復雜背景、扭曲角度的圖片時&#xff0c;容易受干擾&#xff1b;AI 圖像識別能解析圖像場景、物體形態&#xff0c;卻難以精準捕捉文字細節 —— 兩者結合才能釋放最大價值。比如在票據處理中&#xff0c;AI 圖像識別先定位票據…

C# 按照主題的訂閱 按照類型的訂閱

安裝TinyPubSub庫&#xff0c;按照 主題發布訂閱using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Form…

當執行shell時,出現未預期的符號 `$‘\r‘‘ 附近有語法錯誤

1.當執行shell時&#xff0c;出現未預期的符號 $‘\r’’ 附近有語法錯誤 解決&#xff1a; linux下解決&#xff1a; 方案一&#xff1a; Linux下打開shell文件&#xff0c;用vi/vim命令打開腳本文件&#xff0c;輸入“:set fileformatunix”&#xff0c;回車&#xff0c;保存…

合作共贏|華望系統科技受邀出席杭州市基礎軟件和工業軟件產業技術聯盟成立大會

大會現場&#xff08;圖源官方&#xff09;2025年7月11日&#xff0c;在杭州市經濟和信息化局&#xff08;杭州市數字經濟局&#xff09;的指導下&#xff0c;杭州市基礎軟件與工業軟件產業技術聯盟成立大會暨工業軟件生態共性云平臺發布儀式在西電杭州研究院圓滿舉行。會上&am…

7.17 滑動窗口

lc523.同余定理兩個注意點同余定理&#xff1a;余數相同的兩個數&#xff0c;做差可被整除。--前綴和hash存mod&#xff0c;不可以用set&#xff0c;因為要保證len大于等于2&#xff0c;所以要存idx映射&#xff01;&#xff01;還有對于全選和全不選的兩個邊界&#xff0c;下標…

算法與前端的可訪問性

引言 可訪問性&#xff08;Accessibility, a11y&#xff09;是現代 Web 開發的核心&#xff0c;確保所有用戶&#xff0c;包括殘障人士&#xff0c;都能無障礙地使用應用。算法在優化前端性能的同時&#xff0c;也能通過高效的數據處理和交互邏輯提升可訪問性體驗。例如&#x…

使用token調用Spring OAuth2 Resource Server接口錯誤 insufficient_scope

1、場景 最近照著《Spring Security實戰》學習&#xff0c;學到第18章&#xff0c;使用Keycloak作為授權服務器&#xff0c;使用 org.springframework.boot:spring-boot-starter-oauth2-resource-server 實現資源服務器&#xff0c;調用資源服務器的接口返回403&#xff0c;具…

4. 觀察者模式

目錄一、現實應用場景二、初步實現2.1 實現方案12.2 實現方案2三、觀察者模式3.1 應用場景3.2 詳解3.3 實現3.4 設計類圖四、實現五、更多一、現實應用場景 教師的手機號改變之后要通知給所有學生如果有一個學生沒有通知到位就會產生遺漏如何自動完成 二、初步實現 2.1 實現…

es 啟動中的一些記錄

完整修復流程 bash # 1. 創建用戶主目錄(如果需要) mkdir -p /home/es8 chown es8:es8 /home/es8# 2. 變更 Elasticsearch 目錄所有權 chown -R es8:es8 /data/es/elasticsearch-8.17.2/# 3. 調整目錄和文件權限 chmod -R 755 /data/es/elasticsearch-8.17.2/ chmod 644 /d…

區塊鏈之拜占庭容錯算法——Practical Byzantine Fault Tolerance(PBFT)

實用拜占庭容錯算法&#xff08;PBFT&#xff09;是由 Barbara Liskov 和 Miguel Castro 于 90 年代末提出的一種共識算法。原論文鏈接如下&#xff1a; http://pmg.csail.mit.edu/papers/osdi99.pdf pBFT 被設計為在異步&#xff08;響應請求的時間沒有上限&#xff09;系統…

從電子管到CPU

在線verilog轉電路圖 簡單門電路 https://logic.ly/demo/ 數學基礎 普通邏輯 與自然語言關系緊密, 亞里士多德三段論,??穆勒五法 , 語言, 語義,概念,定義,辯論, 詐騙 等, 是文科類的邏輯。 離散數學 不連續數學 數理邏輯 命題邏輯與謂詞邏輯, 與數學推理關系緊密, 它…

Javase-8.數組的練習

1.查找數組中指定元素(二分查找)以升序數組為例, 二分查找的思路是先取中間位置的元素, 然后使用待查找元素與數組中間元素進行比較&#xff1a; 如果相等&#xff0c;即找到了返回該元素在數組中的下標 如果小于&#xff0c;以類似方式到數組左半側查找 如果大于&#xff0c;以…

H3CNE綜合實驗之機器人

H3CNE綜合實驗之機器人 實驗拓撲圖實驗需求 1.按照圖示配置 IP 地址 2.SW1 和 SW2 之間的直連鏈路配置鏈路聚合 3.公司內部業務網段為 Vlan10 和 Vlan20;Vlan10 是市場部&#xff0c;Vlan20 是技術部&#xff0c;要求對 Vlan 進行命名以識別; ? PC8 屬于 Vlan10&#xff0c…

2025/7/15——java學習總結

Java IO、Stream、異常與 File 全體系總結&#xff1a;從基礎到進階的完整突破一、核心知識深耕&#xff1a;四大模塊的體系與底層邏輯&#xff08;一&#xff09;IO 流&#xff1a;數據傳輸的基礎通道體系架構與核心分類按流向&#xff1a;輸入流&#xff08;InputStream/Read…

【軌物方案】當補貼退潮,光伏電站如何回歸價值本質?

中國光伏產業正站在一個歷史性的拐點。過去&#xff0c;國家補貼的“黃金時代”催生了裝機量的爆發式增長&#xff0c;許多電站在建設初期將重心放在了快速并網&#xff0c;卻忽視了貫穿2-30年生命周期的運維規劃。如今&#xff0c;補貼浪潮逐漸退去&#xff0c;各大企業開始從…

群暉Nas - Docker(ContainerManager)上安裝SVN Server和庫權限設置問題

上次安裝了Gitlab&#xff0c;可以參考這篇&#xff08;群暉Nas - Docker&#xff08;ContainerManager&#xff09;上安裝GitLab&#xff09;&#xff0c;今天來搞SVN服務器&#xff0c;廢話不多說。 下載鏡像 還是先下載鏡像&#xff08;garethflowers/svn-server&#xff…

前端打包自動壓縮為zip--archiver

安裝依賴 pnpm add archiver types/archiver/vitePlugins/autoBuildZip.ts import { Plugin } from vite; import archiver from archiver; import fs from fs;const compressFolder (folderPath: string, outputFilePath: string) > {const output fs.createWriteStream(…

React響應式組件范式:從類組件到Hooks

?引言 在UI開發中&#xff0c;"狀態變化自動觸發UI更新"的響應式機制是構建動態界面的核心。React通過獨特的??單向數據流??和??虛擬DOM&#xff08;Virtual DOM&#xff09;?? 實現這一目標&#xff0c;但類組件&#xff08;Class Components&#xff09;…

com2tcp工具

com2tcp 是 com0com 套件中的一個實用工具&#xff0c;用于將本地串口&#xff08;COM&#xff09;數據轉發到 TCP/IP 網絡&#xff0c;或者將 TCP/IP 數據轉發到本地串口&#xff0c;實現串口數據的網絡透傳。 1. com2tcp 基本用法 &#xff08;1&#xff09;安裝 com0com 從…