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オブジェクトを使用すると、総データ数や総ページ数などの詳細なページ情報を取得できます。