MyBatisにおけるページング処理の実装方法

大量データを検索する際には、データベースへの負荷を制御するためにページング機能を使用します。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();
}

タグ: MyBatis pagination SQL Java database

5月29日 16:02 投稿