Spring BootとMyBatisでのページネーション設定ガイド

一:PageHelperプラグインを使用したページネーション設定

1:まずSpring Boot + MyBatisフレームワークを設定します。参考:http://www.cnblogs.com/liyafei/p/7911549.html

2:PaginationConfigという設定クラスを作成し、ページネーションプラグインを設定します。mybatis-config.xmlをクラスパスの下に移動します。

package com.example.config.pagination;

import java.util.Properties;

import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.TransactionManagementConfigurer;

import com.github.pagehelper.PageHelper;

@Configuration   //このアノテーションは設定ファイルと同等
@EnableTransactionManagement
public class PaginationConfig implements TransactionManagementConfigurer {
       //PaginationConfigはクラスパス下のmybatis-config.xmlにマッピングされ、XML設定と同様の機能を提供
    @Autowired
    DataSource dataSource;

    @Bean(name = "sqlSessionFactory")
    public SqlSessionFactory sqlSessionFactoryBean() {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        //ページネーションプラグイン
        PageHelper pageHelper = new PageHelper();
        Properties props = new Properties();
        props.setProperty("reasonable", "true");
        props.setProperty("supportMethodsArguments", "true");
        props.setProperty("returnPageInfo", "check");
        props.setProperty("params", "count=countSql");
        pageHelper.setProperties(props);
        //プラグインの追加
        bean.setPlugins(new Interceptor[]{pageHelper});
        try {
            ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
            bean.setConfigLocation(resolver.getResource("classpath:mybatis-config.xml"));
            return bean.getObject();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

    @Bean
    @Override
    public PlatformTransactionManager annotationDrivenTransactionManager() {
        return new DataSourceTransactionManager(dataSource);
    }
}

3:コントローラーでPageHelperページネーションプラグインを使用します。ページネーションプラグインは1つのみ設定でき、複数使用できません。PageHelper.startPageを呼び出した後、次の行(その行のみ)のクエリ結果が自動的にページネーションプラグインを呼び出します。

    @RequestMapping("/query/{page}/{pageSize}")
    public PageInfo queryUsers(@PathVariable Integer page, @PathVariable Integer pageSize) {
        if(page != null && pageSize != null){
            System.out.println("ページ: " + page + ", サイズ: " + pageSize);
            PageHelper.startPage(page, pageSize);
        }
        List<User> userList = userService.fetchAllUsers();
        
        for(User user:userList){
            System.out.print("ID: " + user.getId());
            System.out.println(" ユーザー名: " + user.getUsername());
            
        }
        
        return new PageInfo(userList);
    }

4:テストが成功しました。

二:MyBatis組み込みのRowBoundsページネーションパラメータを使用する

1:まずUserMapper.javaにRowBoundsをパラメータとして取るクエリ関数を追加します。

	public List<User> findUsersWithBounds(RowBounds rowBounds);

2:UserMapper.xmlでクエリ関数のSQL文を設定します(赤色部分)。

<?xml version="1.0" encoding="UTF-8"?>

<mapper namespace="com.example.dao.mapper.UserMapper" >
    <resultMap id="BaseResultMap" type="com.example.dao.pojo.User" >  //idはresultMapの識別子、typeはマッピングに使用するクラスを表す
        <id column="id" property="id" jdbcType="INTEGER" />  //idはresultMapの主キーを表し、resultはその属性を表す
        <result column="username" property="username" jdbcType="VARCHAR" />   //columnはSQLの列名、propertyはPOJOの属性、jdbcTypeはSQLのタイプを表す
        <result column="age" property="age" jdbcType="INTEGER" />
        <result column="ctm" property="ctm" jdbcType="TIMESTAMP"/>
    </resultMap>

    <sql id="Base_Column_List" >
        id, username, age, ctm
    </sql>
<br></br>   <!-- resultMapは上で定義したマッピングセットで、BaseResultMapをマッピングルールとして使用 -->
    <select id="fetchAllUsers" resultMap="BaseResultMap"  >
        SELECT
        <include refid="Base_Column_List" />
        FROM tb_user
    </select>
    
    <select id="findUsersWithBounds" resultMap="BaseResultMap">   
        SELECT 
        <include refid="Base_Column_List" />
        FROM tb_user
    </select>

    <select id="getUserById" parameterType="java.lang.Integer" resultMap="BaseResultMap" >
        SELECT
        <include refid="Base_Column_List" />
        FROM tb_user
        WHERE id = #{id}
    </select>

    <insert id="addUser" parameterType="com.example.dao.pojo.User" >
        INSERT INTO
        tb_user
        (username,age,ctm)
        VALUES
        (#{username}, #{age}, now())
    </insert>

    <update id="updateUser" parameterType="java.util.Map" >
        UPDATE
        tb_user
        SET
        username = #{user.username},age = #{user.age}
        WHERE
        id = #{id}
    </update>

    <delete id="deleteUser" parameterType="java.lang.Integer" >
        DELETE FROM
        tb_user
        WHERE
        id = #{id}
    </delete>
</mapper>

3:クエリパラメータを作成し、UserControllerでクエリ関数を呼び出し、クエリパラメータをクエリ関数のパラメータとして渡します。

    @RequestMapping("/rowquery/{page}/{pageSize}")
    public PageInfo findUsersWithPagination(@PathVariable Integer page,@PathVariable Integer pageSize){
        RowBounds rowBounds=new RowBounds(page,pageSize);
        List<User> userList = userMapper.findUsersWithBounds(rowBounds); 
        return new PageInfo(userList);
    }

4:ページネーションクエリが成功しました。

タグ: Spring Boot MyBatis ページネーション PageHelper RowBounds

7月9日 21:45 投稿