大量データを検索する際には、データベースへの負荷を制御するためにページング機能を使用します。MyBatisでページングを実現する主な方法には、Limitによるページング、RowBoundsによるページング、およびPageHelperによるページングがあります。
1. Limitによるページング(SQLレベルでの実装)
MySQLのLIMIT句を使用したページング構文:
// LIMITページング構文
SELECT * FROM table LIMIT offset, count
// offset: データ取得開始位置、count: 取得するレコード数
SELECT * FROM table LIMIT 5,10; // 6番目から15番目のレコードを取得
// 特定のオフセットから最後まで全て取得する場合
SELECT * FROM table LIMIT 95,-1; // 96番目から最終レコードまで取得
// 1つのパラメータのみ指定した場合、最初から指定数だけ取得
// つまり LIMIT n は LIMIT 0,n と同等
SELECT * FROM table LIMIT 5; // 最初の5件を取得
実装手順:
1. Mapperファイルの修正
<select id="fetchPagedUsers" parameterType="map" resultType="user">
SELECT * FROM user LIMIT #{offset},#{limit}
</select>
2. Mapperインターフェース(パラメータはMap型)
List<User> fetchPagedUsers(Map<String, Integer> params);
// 全ユーザー情報をページングで取得
3. テストクラスでパラメータを渡してテスト実行
// ページング検索、offsetとlimitの2つのパラメータを使用
@Test
public void testFetchPagedUsers() {
SqlSession sqlSession = MyBatisUtil.getSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
int pageNumber = 2; // ページ番号
int itemsPerPage = 3; // 1ページあたりのアイテム数
Map<String, Integer> parameters = new HashMap<>();
parameters.put("offset", (pageNumber - 1) * itemsPerPage);
parameters.put("limit", itemsPerPage);
List<User> userList = userMapper.fetchPagedUsers(parameters);
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
2. RowBoundsによるページング(Javaコードレベルでの実装)
実装手順:
1. Mapperインターフェース
// RowBoundsを使用した全ユーザー情報のページング取得
List<User> getAllUsersWithRowBounds();
2. Mapper XMLファイル
<select id="getAllUsersWithRowBounds" resultType="user">
SELECT * FROM user
</select>
3. テストクラス
@Test
public void testGetAllUsersWithRowBounds() {
SqlSession sqlSession = MyBatisUtil.getSession();
int targetPage = 3; // 対象ページ
int recordsPerPage = 2; // 1ページ当たりのレコード数
RowBounds rowBounds = new RowBounds(
(targetPage - 1) * recordsPerPage,
recordsPerPage
);
// session.selectListメソッドでRowBoundsを渡す(非推奨方式)
List<User> users = sqlSession.selectList(
"com.example.mapper.UserMapper.getAllUsersWithRowBounds",
null,
rowBounds
);
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}