Java自定义分页,结合MySQL的Limit函数来实现快速高效的分页

前言

在项目开发过程中,常常聊到的话题就是分页,怎么分页?不管使用什么方法来实现,最终是需要根据系统进行统一的,不能张三使用这个插件来分页,李四使用那个插件来分页,王五则利用数据库函数来分页,一个系统五花八门,花里胡哨滴,这样是不行的,在一个系统中要么统一的使用某个分页插件,要么使用统一使用数据库分页函数来实现分页。

通过本篇博文的学习,讲学会基于MySQL的数据分页,利用MySQL中的Limit函数来达到快速高效分页的目的,为了通俗易懂,博主已细分为了传统的三层,即:Dao层/Service层/Controller层,如有不到之处,欢迎指正!

Java自定义分页,结合MySQL的Limit函数来实现快速高效的分页

1、员工业务 Controller 层,示例代码内容如下:

package com.huazai.b2c.aiyou.controller;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 
 * @author HuaZai
 * @contact [email protected]
 *          <ul>
 * @description 员工控制层
 *              </ul>
 * @className EmployeeController
 * @package com.huazai.b2c.aiyou.controller
 * @createdTime 2016年7月22日 上午9:56:39
 *
 * @version V1.0.0
 */
@Slf4j
@RestController
@Api(value = "/employee")
@RequestMapping("/employee")
public class EmployeeController
{

	@Autowired
	private EmployeeService employeeService;

	@Autowired
	private DepartmentService departmentService;

	/**
	 * Description:[获取员工分页信息]
	 *
	 * @param pageSize
	 *            [单页大小]
	 * @param pageNo
	 *            [页数]
	 * @return ResponseData
	 */
	@SysLog("员工管理模块-获取分页员工信息")
	@GetMapping("/getPageList")
	@ApiOperation(value = "/getPageList", notes = "获取员工分页信息")
	public ResponseData getPageList(
			@RequestParam(name = "length") @ApiParam(name = "length", value = "页大小", defaultValue = "20") Long pageSize,
			@RequestParam(name = "current") @ApiParam(name = "current", value = "页数", defaultValue = "1") Long pageNo,
			@ApiParam(name = "employee", value = "搜索员工参数实体") Employee employee
			)
	{
		PageBean<EmployeeDto> employeePage;
		try
		{
			
			// 获取员工分页信息
			employeePage = employeeService.selectPageWithParam(pageNo, pageSize, employee);
		} catch (Exception e)
		{
			
			log.error(Constant.INFO_LOG_MSG, e.getMessage());
			return ResponseData.error(RespCodeEnum.ERROR_INTERNAL_SERVER.getCode(), "分页员工信息获取失败");
		}
		
		return ResponseData.ok().put("employeePage", employeePage);
	}

}

2、员工业务 Service 接口层,示例代码内容如下:

package com.huazai.b2c.aiyou.service;

import com.baomidou.mybatisplus.service.IService;

import java.util.List;

/**
 * 
 * @author HuaZai
 * @contact [email protected]
 *          <ul>
 * @description 员工服务接口层
 *              </ul>
 * @className EmployeeService
 * @package com.huazai.b2c.aiyou.service
 * @createdTime 2016年7月22日 上午11:12:27
 *
 * @version V1.0.0
 */

public interface EmployeeService extends IService<Employee>
{

	/**
	 * 查询所有员工账户信息
	 *
	 * @param pageNo
	 * @param pageSize
	 * @param empNo
	 * @return
	 */
	PageBean<EmployeeDto> selectPageWithParam(Long pageNo, Long pageSize, Employee employee);

}

3、员工业务 ServiceImpl 层,示例代码内容如下:

package com.huazai.b2c.aiyou.service.impl;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import io.jsonwebtoken.Claims;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;

/**
 * 
 * @author HuaZai
 * @contact [email protected]
 *          <ul>
 * @description 员工服务实现层
 *              </ul>
 * @className EmployeeServiceImpl
 * @package com.huazai.b2c.aiyou.service.impl
 * @createdTime 2016年7月22日 上午11:16:54
 *
 * @version V1.0.0
 */
@Service
public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements EmployeeService
{
	@Autowired
	private EmployeeMapper employeeMapper;

	@Override
	public PageBean<EmployeeDto> selectPageWithParam(Long pageNo, Long pageSize, Employee employee)
	{
		// 获取总体数据
		List<EmployeeDto> employeePages = employeeMapper.selectEmployeeeByPage(null, null, employee);
		Long totalSize = Long.valueOf(employeePages.size());
		PageBean pageBean = new PageBean(pageNo, pageSize, totalSize);
		// 获取数据索引
		Long startIndex = pageBean.getStartIndex();
		// 获取当前分页数据
		List<EmployeeDto> employeeDtos = employeeMapper.selectEmployeeeByPage(startIndex,
				pageSize, employee);
		pageBean.setDataList(employeeDtos);

		return pageBean;
	}

}

4、员工业务 Mapper 层,示例代码内容如下:

package com.huazai.b2c.aiyou.mapper;

import com.baomidou.mybatisplus.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.session.RowBounds;
import org.springframework.stereotype.Repository;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 
 * @author HuaZai
 * @contact [email protected]
 *          <ul>
 * @description TODO
 *              </ul>
 * @className EmployeeMapper
 * @package com.huazai.b2c.aiyou.mapper
 * @createdTime 2016年7月22日 上下午14:16:52
 *
 * @version V1.0.0
 */
@Repository
public interface EmployeeMapper extends BaseMapper<Employee>
{
	List<EmployeeDto> selectEmployeeByPage(@Param(value = "pageNo") Long pageNo,
			@Param(value = "pageSize") Long pageSize, @Param(value = "employee") Employee employee);

}

5、Mapper 的配置文件 Mapper.xml,示例内容如下:

   <select id="selectEmployeeByPage" resultType="com.huazai.b2c.aiyou.dto.resp.employee.EmployeeDto">
        SELECT e.id, e.name, e.address FROM employee e WHERE e.status IN (1, 2)
        <if test="employee.name != null and employee.name != ''">
            and e.name like concat('%',#{employee.name},'%')
        </if>
        <if test="pageNo != null" >
            limit #{pageNo}, #{pageSize}
        </if>
    </select>

6、分页PageBeans工具类,示例内容如下:

package com.huazai.b2c.aiyou.common;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.util.List;

/**
 * 
 * @author HuaZai
 * @contact [email protected]
 *          <ul>
 * @description 分页工具类
 *              </ul>
 * @className PageBean
 * @package com.huazai.b2c.aiyou.common
 * @createdTime 2016年7月17日 上午10:40:21
 *
 * @version V1.0.0
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class PageBean<T>
{

	// 当前页
	private Long currentNo;
	// 单页显示数据条数
	private Long pageSize;
	// 总的数据条数
	private Long totalRecord;
	// 总页数
	private Long totalPage;
	// 开始索引
	private Long startIndex;
	// 分页显示
	private Long start;
	private Long end;
	// 数据集合
	private List<T> dataList;

	/**
	 *
	 * @param currentNo
	 *            当前页
	 * @param pageSize
	 *            单页显示数据条数
	 * @param totalRecord
	 *            总的数据条数
	 */
	public PageBean(Long currentNo, Long pageSize, Long totalRecord)
	{
		this.currentNo = currentNo;
		this.pageSize = pageSize;
		this.totalRecord = totalRecord;
		// 获取总页数
		if (totalRecord % pageSize == 0)
		{
			this.totalPage = totalRecord / pageSize;
		} else
		{
			this.totalPage = totalRecord / pageSize + 1;
		}

		this.startIndex = (currentNo - 1) * pageSize;
		this.start = 1L;
		this.end = 5L;
		if (totalPage <= 5)
		{
			this.end = this.totalPage;
		} else
		{
			this.start = currentNo - 2;
			this.end = currentNo + 2;
			if (start < 0)
			{
				start = 1L;
				end = 5L;
			}
			if (end > this.totalPage)
			{
				this.end = totalPage;
				this.start = end - 5;
			}
		}
	}
}

 好了,关于 Java自定义分页,结合MySQL的Limit关键字实现快速高效的分页 就写到这儿了,如果还有什么疑问或遇到什么问题欢迎扫码提问,也可以给我留言哦,我会一一详细的解答的。 
歇后语:“ 共同学习,共同进步 ”,也希望大家多多关注CSND的IT社区。


作       者: 华    仔
联系作者: [email protected]
来        源: CSDN (Chinese Software Developer Network)
原        文: https://blog.csdn.net/Hello_World_QWP/article/details/89352124
版权声明: 本文为博主原创文章,请在转载时务必注明博文出处!
发布了318 篇原创文章 · 获赞 637 · 访问量 144万+

猜你喜欢

转载自blog.csdn.net/Hello_World_QWP/article/details/89352124