zoukankan      html  css  js  c++  java
  • 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、实际需求中,需要四个参数(总页码、总记录数、起始位置、页面容量),此处只是做测试,并没有在实际页面实现分页功能,因此没有使用到总页码、总记录数。
     
  • 相关阅读:
    页面反向映射之文件页面
    页面反向映射之匿名页面
    cp so文件导致进程SIGBUS或者SEGV原因分析
    由systemtap直接修改内核代码段想到的
    epoll的内核实现
    从一些现象看printf的缓冲机制
    Linux由浅入深学习 (转)
    每天一个Linux命令 (转)
    Redis与数据库同步问题
    PHP使用文件流下载文件方法(附:解决下载文件内容乱码问题)
  • 原文地址:https://www.cnblogs.com/wxdestiny/p/9776205.html
Copyright © 2011-2022 走看看