实现分页

作用:分页展示,减少数据的处理量

封装一个MyBatisUtils工具类

一、直接使用sql中的关键字limit(物理分页)

使用Mybatis实现分页,核心仍为SQL

  1. 写mybatis的接口UserMapper

    List<User> getUserByLimit(Map<String,Integer> map);
    
  2. 写Mapper.xml

    <select id="getUserByLimit" parameterType="map" resultType="user">
        select * from mybatis.users limit #{startIndex},#{pageSize}
    </select>
    
  3. 可以测试了

        @Autowire
    	UserMapper mapper;
    
    	//分页
        @Test
        public void getUserByLimit(){
            HashMap<String, Integer> map = new HashMap<String, Integer>();
            map.put("startIndex",0);//从第0个开始
            map.put("pageSize",10);//每页10个
    
            List<User> userList = mapper.getUserByLimit(map);
            for (User user : userList) {
                System.out.println(user);
            }
        }
    }
    

二、逻辑分页

/**
 * 逻辑分页
 * @param list 全量数据
 * @param pageNum 页码
 * @papram pageSize 每页显示条数
 */
private Map<String, Object> getLogicPage(List list, int pageNum, int pageSize){
	Map<String, Object> map = new HashMap<>();
	int firstIndex = (pageNum -1) * pageSize;
	int lastIndex = 0;
	int total = 0;
	List subList = null;
	if(list == null || list.size() == 0) {
		subList = new ArrayList<>();
	}else {
		if(firstIndex > list.size()-1 || firstIndex < 0) {
			subList = new ArrayList<>();
		}
		lastIndex = pageNum * pageSize;
		if(lastIndex > list.size()) {
			lastIndex = list.size();
		}
		subList = list.subList(firstIndex, lastIndex);
	}
	map.put("total", total);
	map.put("list", subList);
	return map;
}
	

三、使用RowBounds分页

使用代码实现分页,不需要用SQL 逻辑分页

MyBatis使用RowBounds实现的分页是逻辑分页,也就是先把数据记录全部查询出来,然在再根据 offset 和 limit 截断记录返回,表示从第几条开始,取多少条。
数据量小时,RowBounds不失为一种好办法。但是数据量大时,实现拦截器就很有必要了。

  1. 写接口UserInfoDao

    //RowBounds分页
    List<UserInfo> queryAllUserByRowBounds(RowBounds rowBounds);
    
  2. 写mapper.xml配置文件

    <!--RowBounds分页-->
    <select id="queryAllUserByRowBounds" resultType="UserInfo">
        select * from userinfo
    </select>
    
  3. 可以测试了

        @Autowired
        UserInfoService userInfoService;
    
    	@GetMapping("/listByRowBounds")
        public List<UserInfo> queryAllUserByRowBounds(@RequestParam(defaultValue = "1")Integer pageNum, @RequestParam(defaultValue = "10")Integer pageSize){
            return userInfoService.queryAllUserByRowBounds(new RowBounds((pageNum-1)*pageSize,pageSize));
        }
    

四、使用分页插件pageHelper(拦截器)

第一种:使用PageHelper

  1. 导入pagehelper依赖

    <!-- pagehelper 分页插件 -->
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper</artifactId>
        <version>5.1.2</version>
    </dependency>
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper-spring-boot-starter</artifactId>
        <version>1.3.0</version>
    </dependency>
    
  2. Dao层

    @Mapper
    public interface UserMapper{
       // 接口上添加分页参数必须是pageNum, pageSize 自动会分页
    	@Select("select * from user")
    	List<User> queryByPageHelper(@Param("pageNum")int pageNum, @Param("pageSize")int pageSize); 
    }
    
  3. Service实现类

    @ApiOperation("使用PageHelper来进行分页")
    @GetMapping("/listByPageHelper")
    public void queryByPageHelper(@RequestParam(defaultValue = "1")Integer pageNum, @RequestParam(defaultValue = "10")Integer pageSize) {
    	//利用PageHelper分页查询 
        /**
        注意:这个一定要放查询语句的前一行,否则无法进行分页,因为它对紧随其后第一个sql语句有效
        */
    	PageHelper.startPage(pageNum, pageSize);
    	List<User> userList = userMapper.queryByPageHelper(pageNum,pageSize);
    	PageInfo<User> pageInfo = new PageInfo<User>(userList);
    }
    

    第二种:不使用PageHelper,实用配置分页参数

    1. 配置文件

      #mybatis分页
      pagehelper:
        helper-dialect: mysql
        reasonable: true
        support-methods-arguments: true
        params: count=countSql
      
    2. Service实现类 直接查

      @ApiOperation("使用PageHelper来进行分页")
      @GetMapping("/listByPageHelper")
      public void queryByPageHelper(@RequestParam(defaultValue = "1")Integer pageNum, @RequestParam(defaultValue = "10")Integer pageSize) {
         //不使用PageHelper ,自动会在Mapper接口分页
      	List<User> userList = userMapper.queryByPageHelper(pageNum, pageSize);
      }
      

    五、使用List的subList方法

List下的方法:

List<E> subList(int fromIndex, int toIndex);  //参数一:集合元素下标,参数二:第几个元素。。。

/*例如list.subList(0,2)  即为从下标0开始,取到第二个元素,结果为下标0,1的元素*/

分页算法简单使用:

public void queryBySubList(Integer pageNum,Integer pageSize) {
	List<User> list = userMapper.queryByPage();
    try {
         list.subList(pageSize*(pageNum-1),pageSize*pageNum); //从下标0开始,找到第10个 即0-9
    } catch (IndexOutOfBoundsException e) {
         list.subList(pageSize*(pageNum-1),list.size());  //数组越界异常时,取到最后一个元素
    }
	PageInfo<User> pageInfo = new PageInfo<User>(userList);
}