MyBatis 实现分页功能

MySQL 的分页功能是基于内存的分页(即查出来所有记录,再按起始位置和页面容量取出结果)。

案例①根据用户名(支持模糊查询)、用户角色 id 查询用户列表(即根据用户名称或根据用户角色 id 又或是根据用户名称和用户角色 id 都可以查询出用户列表) 

    ②查询结果列表按照创建时间降序排列

UserMapper.java 中定义实现接口
package cn.mybatis.dao;

import java.util.List;
import org.apache.ibatis.annotations.Param;
import cn.mybatis.pojo.User;

public interface UserMapper {

    /**
     * 查询用户表记录数
     * @return 
     */
    public int count();

    /**
     * 根据用户名(支持模糊查询)、用户角色 id 查询用户列表(分页显示)
     * @param pageIndex 页码下标=(第几页-1)       
     * @param pageSize 每页容量        
     * @return
     */
    public List<User> getUserListByPage(@Param("name") String userName, 
                                        @Param("role") int roleId,
                                        @Param("index") int pageIndex, 
                                        @Param("size") int pageSize);

}
UserMapper.xml 映射文件中编写 SQL 语句
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="cn.mybatis.dao.UserMapper">

    <!--查询用户表记录数,使用聚合函数 count()实现,count(0)、count(1)、count(*)都可以查询出记录数 -->
    <select id="count" resultType="int">
        SELECT count(*) as count FROM
        smbms_user
    </select>

    <!-- 1、查询用户列表(分页显示) 2、实现分页,通过 limit(起始位置,页面容量) -->
    <select id="getUserListByPage" resultType="user">
        SELECT * FROM `smbms_user` WHERE 1=1
        <if test="role!=null">
            AND userRole=#{role}
        </if>
        <if test="name!=null and name!=''">
            AND userName LIKE CONCAT('%',#{name},'%')
        </if>
        ORDER BY creationDate DESC LIMIT #{index},#{size}
    </select>

</mapper>


单元测试类
package cn.mybatis.test;

import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import cn.mybatis.dao.UserMapper;
import cn.mybatis.pojo.User;
import cn.mybatis.util.MyBatisUtil;

public class UserMapperTest {

    @Test
    public void testGetUserListByPage() {
        SqlSession session = null;
        List<User> userList = new ArrayList<User>();

        int page = 1; // 第几页
        int pageSize = 3; // 每页容量
        int pageIndex = (page - 1) * pageSize; // 起始位置
        String userName = "";
        Integer roleId = 3;
        try {
            session = MyBatisUtil.getSqlSession();
            userList = session.getMapper(UserMapper.class).getUserListByPage(userName, roleId, pageIndex, pageSize);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            MyBatisUtil.close(session);
        }
        for (User user : userList) {
            System.out.println(user);
        }
    }
}
说明:
        1、MyBatis 实现分页查询,属于 DAO 层操作,由于 DAO 层是不牵涉任何业务实现的,所以实现分页的方法中第一个参数为 limit 的起始位置(下标从0开始)而不是用户输入的真正的页码(页码从1开始),页码转换成 limit 的起始位置下标,即:起始位置下标=(页码-1)×页面容量,那么这个转换操作必然不能在 DAO 层实现,需要在业务层实现。故我们在测试类中传入的参数为下标,而不是页码。 2、实际需求中,需要四个参数(总页码、总记录数、起始位置、页面容量),此处只是做测试,并没有在实际页面实现分页功能,因此没有使用到总页码、总记录数。
 

猜你喜欢

转载自www.cnblogs.com/wxdestiny/p/9776205.html