MyBatisにおけるPageHelper分頁プラグインの実装方法

MyBatisの分頁機能を実現するPageHelperプラグインの基本的な使用方法について説明します。このプラグインを使用することで、データベースクエリ結果のページ分割を簡単に実装できます。

プロジェクト構成

Mavenプロジェクトに以下の構成要素を準備します:

ユーザーエンティティクラス

package com.example.model;

public class User {
    private int userId;
    private String userName;
    private int userAge;
    
    public int getUserId() {
        return userId;
    }
    
    public void setUserId(int userId) {
        this.userId = userId;
    }
    
    public String getUserName() {
        return userName;
    }
    
    public void setUserName(String userName) {
        this.userName = userName;
    }
    
    public int getUserAge() {
        return userAge;
    }
    
    public void setUserAge(int userAge) {
        this.userAge = userAge;
    }
    
    @Override
    public String toString() {
        return "User [id=" + userId + ", name=" + userName + ", age=" + userAge + "]";
    }
}

マッパーXML設定

<?xml version="1.0" encoding="UTF-8" ?>
<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectUserById" parameterType="int" resultType="User">
        SELECT * FROM user WHERE user_id = #{id}
    </select>
    
    <select id="selectAllUsers" resultType="User">
        SELECT * FROM user
    </select>
    
    <insert id="insertUser" parameterType="User">
        <selectKey resultType="int" order="AFTER" keyProperty="userId">
            SELECT LAST_INSERT_ID()
        </selectKey>
        INSERT INTO user(user_name, user_age) VALUES (#{userName}, #{userAge})
    </insert>
    
    <delete id="deleteUserById" parameterType="int">
        DELETE FROM user WHERE user_id = #{id}
    </delete>
    
    <update id="updateUser" parameterType="User">
        UPDATE user SET user_name = #{userName}, user_age = #{userAge} 
        WHERE user_id = #{userId}
    </update>
</mapper>

MyBatis設定ファイル

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <properties resource="database.properties">
        <property name="username" value="root"/>
        <property name="password" value="password"/>
    </properties>
    
    <typeAliases>
        <typeAlias type="com.example.model.User" alias="User"/>
    </typeAliases>
    
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageHelper">
            <property name="dialect" value="mysql"/>
            <property name="rowBoundsWithCount" value="true"/>
        </plugin>
    </plugins>
    
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

依存関係の設定

<dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.6</version>
    </dependency>
    
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.26</version>
    </dependency>
    
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper</artifactId>
        <version>5.2.0</version>
    </dependency>
</dependencies>

分頁機能の実装

package com.example.demo;

import java.io.Reader;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

import com.example.model.User;

public class Application {
    public static void main(String[] args) throws Exception {
        String configFile = "mybatis-config.xml";
        Reader reader = Resources.getResourceAsReader(configFile);
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = factory.openSession();
        
        // 全データ表示
        System.out.println("=== 全ユーザーデータ ===");
        List<User> allUsers = session.selectList("com.example.mapper.UserMapper.selectAllUsers");
        for (User user : allUsers) {
            System.out.println(user.toString());
        }
        
        // 分頁処理
        System.out.println("=== ページ分割結果 ===");
        PageHelper.startPage(1, 5);
        List<User> pagedUsers = session.selectList("com.example.mapper.UserMapper.selectAllUsers");
        
        for (User user : pagedUsers) {
            System.out.println(user.toString());
        }
        
        // ページ情報の取得
        PageInfo<User> pageInfo = new PageInfo<>(pagedUsers);
        System.out.println("総データ数: " + pageInfo.getTotal());
        System.out.println("総ページ数: " + pageInfo.getPages());
        System.out.println("最終ページ: " + pageInfo.getLastPage());
        
        session.close();
    }
}

PageHelper.startPage()メソッドでページ番号とページサイズを指定することで、自動的に分頁クエリが実行されます。PageInfoオブジェクトを使用すると、総データ数や総ページ数などの詳細なページ情報を取得できます。

タグ: MyBatis PageHelper 分頁 データベース Java

6月18日 22:40 投稿