MyBatis中RowBounds實現(xiàn)內(nèi)存分頁
是 MyBatis 提供的一種用于結(jié)果集分頁的功能,主要通過內(nèi)存分頁的方式實現(xiàn)。它通過在查詢時傳遞分頁參數(shù),限制返回的結(jié)果集的大小。RowBounds
并不依賴于數(shù)據(jù)庫層的分頁功能,而是通過 MyBatis 在內(nèi)存中對結(jié)果集進(jìn)行截取,從而實現(xiàn)分頁。
RowBounds 的基本屬性
offset
:從結(jié)果集的第幾條記錄開始截取。limit
:截取的記錄條數(shù)。
例如,offset=5
,limit=10
的 RowBounds
實例表示從結(jié)果集的第 6 條記錄開始,取 10 條記錄。
如何在 MyBatis 中使用 RowBounds 實現(xiàn)內(nèi)存分頁?
1. 使用 RowBounds 進(jìn)行內(nèi)存分頁
RowBounds
的使用非常簡單,可以通過 SqlSession
的 selectList
方法來傳遞 RowBounds
實例,從而實現(xiàn)分頁。
示例:
假設(shè)我們有一個數(shù)據(jù)庫表 user
,并希望對查詢結(jié)果進(jìn)行分頁。
Step 1: 定義 Mapper
接口
public interface UserMapper { List<User> selectAllUsers(RowBounds rowBounds); }
Step 2: 配置 XML 映射文件
<mapper namespace="com.example.mapper.UserMapper"> <select id="selectAllUsers" resultType="User"> SELECT * FROM user </select> </mapper>
Step 3: 使用 RowBounds
實現(xiàn)分頁查詢
try (SqlSession session = sqlSessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); ? // 分頁參數(shù):從第 10 條記錄開始,取 10 條記錄 RowBounds rowBounds = new RowBounds(10, 10); ? List<User> users = mapper.selectAllUsers(rowBounds); ? users.forEach(System.out::println); }
在這個例子中,RowBounds
實例被傳遞給 selectAllUsers
方法。RowBounds
將從查詢結(jié)果的第 11 條記錄開始,取 10 條記錄進(jìn)行返回。
2. RowBounds 的局限性
盡管 RowBounds
實現(xiàn)了分頁功能,但它有一些局限性:
內(nèi)存分頁:
RowBounds
是在內(nèi)存中對查詢結(jié)果進(jìn)行分頁,這意味著在數(shù)據(jù)庫層面,查詢?nèi)匀粫祷赝暾慕Y(jié)果集。如果結(jié)果集非常大(比如包含數(shù)百萬條記錄),則會消耗大量的內(nèi)存和處理時間,不適用于大數(shù)據(jù)量分頁。性能問題:由于
RowBounds
是在內(nèi)存中截取結(jié)果集,這對內(nèi)存和 CPU 的消耗較大,尤其是當(dāng)offset
較大時,查詢性能會顯著下降。
如何實現(xiàn)數(shù)據(jù)庫層面的分頁(推薦)?
由于 RowBounds
的局限性,通常更推薦在數(shù)據(jù)庫層面進(jìn)行分頁查詢。不同的數(shù)據(jù)庫支持不同的分頁查詢語法,以下是幾種常見數(shù)據(jù)庫的分頁實現(xiàn)方式。
1. MySQL
在 MySQL 中,可以通過 LIMIT
子句實現(xiàn)分頁:
SELECT * FROM user LIMIT #{offset}, #{limit};
MyBatis 配置:
<select id="selectUsersWithPagination" resultType="User"> SELECT * FROM user LIMIT #{offset}, #{limit} </select>
Mapper 接口:
public interface UserMapper { List<User> selectUsersWithPagination(@Param("offset") int offset, @Param("limit") int limit); }
調(diào)用:
try (SqlSession session = sqlSessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); List<User> users = mapper.selectUsersWithPagination(10, 10); users.forEach(System.out::println); }
2. Oracle
在 Oracle 中,可以通過 ROWNUM
或者 ROW_NUMBER()
函數(shù)實現(xiàn)分頁:
SELECT * FROM ( SELECT t.*, ROWNUM r FROM (SELECT * FROM user ORDER BY id) t WHERE ROWNUM <= #{end} ) WHERE r > #{start};
MyBatis 配置:
<select id="selectUsersWithPagination" resultType="User"> SELECT * FROM ( SELECT t.*, ROWNUM r FROM (SELECT * FROM user ORDER BY id) t WHERE ROWNUM <= #{end} ) WHERE r > #{start} </select>
Mapper 接口:
public interface UserMapper { List<User> selectUsersWithPagination(@Param("start") int start, @Param("end") int end); }
調(diào)用:
try (SqlSession session = sqlSessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); List<User> users = mapper.selectUsersWithPagination(10, 20); // 從第11到20條 users.forEach(System.out::println); }
3. PostgreSQL
在 PostgreSQL 中,使用 LIMIT
和 OFFSET
進(jìn)行分頁:
SELECT * FROM user LIMIT #{limit} OFFSET #{offset};
MyBatis 配置和調(diào)用方式與 MySQL 類似。
總結(jié)
RowBounds
的用途:RowBounds
是 MyBatis 提供的一種內(nèi)存分頁方式,適用于小數(shù)據(jù)量的分頁場景。局限性:由于
RowBounds
是在內(nèi)存中截取結(jié)果集,對于大數(shù)據(jù)量分頁會帶來性能問題和內(nèi)存消耗,通常不推薦在大數(shù)據(jù)量情況下使用。推薦的分頁方式:通常推薦在數(shù)據(jù)庫層面進(jìn)行分頁,通過 SQL 的
LIMIT
或OFFSET
等子句直接獲取分頁后的結(jié)果集,這樣可以有效減少數(shù)據(jù)傳輸和內(nèi)存占用,提高分頁性能。
在實際開發(fā)中,根據(jù)數(shù)據(jù)量大小和系統(tǒng)性能要求選擇合適的分頁方式。
到此這篇關(guān)于MyBatis中RowBounds實現(xiàn)內(nèi)存分頁的文章就介紹到這了,更多相關(guān)MyBatis RowBounds內(nèi)存分頁內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaWeb實現(xiàn)顯示mysql數(shù)據(jù)庫數(shù)據(jù)
MySQL是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在WEB應(yīng)用方面MySQL是最好的。本文將利用JavaWeb實現(xiàn)顯示mysql數(shù)據(jù)庫數(shù)據(jù)功能,需要的可以參考一下2022-03-03解決Feign調(diào)用的GET參數(shù)傳遞的問題
這篇文章主要介紹了解決Feign調(diào)用的GET參數(shù)傳遞的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03Spring Cloud 系列之負(fù)載均衡 Ribbon的示例代碼
Ribbon 是 Netflix 發(fā)布的負(fù)載均衡器,它有助于控制 HTTP 和 TCP 客戶端的行為。這篇文章主要介紹了Spring Cloud 系列之負(fù)載均衡 Ribbon的示例代碼,需要的朋友可以參考下2020-11-11Java?SimpleDateFormat與System類使用示例詳解
這篇文章主要介紹了Java?SimpleDateFormat與System類使用示例,對于SimpleDateFormat類,是一個用來區(qū)分區(qū)域設(shè)置的方式進(jìn)行日期的是指,以及對日期進(jìn)行處理分析的一個實現(xiàn)類2022-11-11如何基于java向mysql數(shù)據(jù)庫中存取圖片
這篇文章主要介紹了如何基于java向mysql數(shù)據(jù)庫中存取圖片,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02Spring Boot/Angular整合Keycloak實現(xiàn)單點登錄功能
Keycloak新的發(fā)行版命名為Quarkus,專為GraalVM和OpenJDK HotSpot量身定制的一個Kurbernetes Native Java框架,計劃2019年底正式發(fā)布。這篇文章主要介紹了Spring Boot/Angular整合Keycloak實現(xiàn)單點登錄,需要的朋友可以參考下2019-10-10非maven項目快速轉(zhuǎn)換為maven項目的方法步驟
時候我們導(dǎo)入的項目并不是有maven來管理依賴的,而是要手動添加jar包,比較麻煩,本文主要介紹了非maven項目快速轉(zhuǎn)換為maven項目的方法步驟,具有一定的參考價值,感興趣的可以了解一下2024-01-01Java設(shè)計模式模板方法(Template)原理解析
這篇文章主要介紹了Java設(shè)計模式模板方法(Template)原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11