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、实际需求中,需要四个参数(总页码、总记录数、起始位置、页面容量),此处只是做测试,并没有在实际页面实现分页功能,因此没有使用到总页码、总记录数。
个性签名:北上广不相信眼泪,90后闯荡社会,不喝清晨的粥,只干最烈的酒,90后,加油!