Spring Data JPA+kkpager实现分页功能实例

一、spring Data JPA分页

分页效果如下:

前台表格用的是: Bootstrap

分页插件用的是: kkpager

kkpager是一个js分页展示控件,传入简单参数就能使用的分页效果控件,github地址:https://github.com/pgkk/kkpager

项目结构:

FamilyMember实体类:

package com.fendo.entity; 

import java.io.Serializable;
import java.util.Date; 

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table; 

import org.hibernate.annotations.GenericGenerator; 

@Entity
@Table(name="FAMILY_MEMBER")
public class FamilyMember implements Serializable{ 

  private Integer id;
  private String FamilyName;
  private String FamilyCharge;
  private String Mobile;
  private String Email;
  private String Address;
  private Date CreateData; 

  @Id
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  public Integer getId() {
    return id;
  }
  public void setId(Integer id) {
    this.id = id;
  } 

  @Column(name="FAMILY_NAME")
  public String getFamilyName() {
    return FamilyName;
  }
  public void setFamilyName(String familyName) {
    FamilyName = familyName;
  } 

  @Column(name="FAMILY_CHARGE")
  public String getFamilyCharge() {
    return FamilyCharge;
  }
  public void setFamilyCharge(String familyCharge) {
    FamilyCharge = familyCharge;
  } 

  @Column(name="MOBILE")
  public String getMobile() {
    return Mobile;
  }
  public void setMobile(String mobile) {
    Mobile = mobile;
  } 

  @Column(name="EMAIL")
  public String getEmail() {
    return Email;
  }
  public void setEmail(String email) {
    Email = email;
  } 

  @Column(name="ADDRESS")
  public String getAddress() {
    return Address;
  }
  public void setAddress(String address) {
    Address = address;
  } 

  @Column(name="CREATE_DATA")
  public Date getCreateData() {
    return CreateData;
  }
  public void setCreateData(Date createData) {
    CreateData = createData;
  }
  public FamilyMember() {
    super();
    // TODO Auto-generated constructor stub
  }
  public FamilyMember(Integer id, String familyName, String familyCharge, String mobile, String email, String address,
      Date createData) {
    super();
    this.id = id;
    FamilyName = familyName;
    FamilyCharge = familyCharge;
    Mobile = mobile;
    Email = email;
    Address = address;
    CreateData = createData;
  } 

}

FamilyDao接口类:

package com.fendo.dao; 

import java.util.List;
import java.util.Map; 

import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.PagingAndSortingRepository; 

import com.fendo.entity.FamilyMember; 

public interface FamilyDao extends PagingAndSortingRepository<FamilyMember, String>, JpaSpecificationExecutor<FamilyMember>{ 

}

FamilyService服务接口类:

package com.fendo.service; 

import java.util.List;
import java.util.Map; 

import com.fendo.entity.FamilyMember; 

public interface FamilyService { 

  public List<FamilyMember> getAll() throws Exception; 

  public FamilyMember save(FamilyMember familyMember) throws Exception; 

  public Map<String, Object> getUserBySearch(Map<String, String> familyArgs, final String sortType) throws Exception; 

}

FamilyService服务接口实现类:

package com.fendo.service.imp; 

import java.util.ArrayList;
import java.util.List;
import java.util.Map; 

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery; 

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification; 

import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.transaction.Transactional; 

import org.springframework.stereotype.Service; 

import com.fendo.dao.FamilyDao;
import com.fendo.entity.FamilyMember;
import com.fendo.service.FamilyService;
import com.fendo.util.PageUtils; 

@Service
@Transactional
public class FamilyServiceImp implements FamilyService{ 

  @Autowired
  public FamilyDao familyDao; 

  @Override
  public List<FamilyMember> getAll() throws Exception {
    return (List<FamilyMember>) this.familyDao.findAll();
  } 

  @Override
  public FamilyMember save(FamilyMember familyMember) throws Exception {
    return familyDao.save(familyMember);
  } 

  /**
   * 查询用户信息列表(支持分页和多条件查询)。
   *
   */
  @Override
  public Map<String, Object> getUserBySearch(Map<String, String> familyArgs, final String sortType) throws Exception { 

    // 获得分页对象pageable,并且在pageable中页码是从0开始,设定按照sortType升序排列
    Pageable pageable = PageUtils.buildPageRequest(Integer.valueOf(familyArgs.get("pageNum")),
        Integer.valueOf(familyArgs.get("pageSize")), sortType);
    Page<FamilyMember> objPage = familyDao.findAll(new Specification<FamilyMember>() { 

      public Predicate toPredicate(Root<FamilyMember> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
        List<Predicate> lstPredicates = new ArrayList<Predicate>(); 

        if (StringUtils.isNotBlank(familyArgs.get("FamilyName"))) {
          lstPredicates.add(cb.like(root.get("familyName").as(String.class), "%" + familyArgs.get("FamilyName") + "%"));
        }
        if (StringUtils.isNotBlank(familyArgs.get("Mobile"))) {
          lstPredicates.add(cb.like(root.get("mobile").as(String.class), "%" + familyArgs.get("Mobile") + "%"));
        } 

        Predicate[] arrayPredicates = new Predicate[lstPredicates.size()];
        return cb.and(lstPredicates.toArray(arrayPredicates));
      }
    }, pageable); 

    return PageUtils.getPageMap(objPage);
  } 

}

前台接受参数工具类:

package com.fendo.util; 

import java.util.HashMap;
import java.util.Map; 

import javax.servlet.http.HttpServletRequest; 

/**
 * 工具类
 * @author fendo
 *
 */
public class FamilyUtil { 

  /**
   * 封装从前台传递过来的查询参数。
   *
   */
  public static Map<String, String> getSelArgsToMap(HttpServletRequest request) throws Exception {
    Map<String, String> serArgs = new HashMap<String, String>(); 

    String FamilyName = request.getParameter("FamilyName");
    String Mobile = request.getParameter("Mobile"); 

    String pageNum = request.getParameter("pageNum") == null ? "1" : request.getParameter("pageNum");
    String pageSize = request.getParameter("pageSize") == null ? "10" : request.getParameter("pageSize"); 

    serArgs.put("FamilyName", FamilyName);
    serArgs.put("Mobile", Mobile); 

    serArgs.put("pageNum", pageNum);
    serArgs.put("pageSize", pageSize); 

    return serArgs;
  } 

}

分页工具类:

package com.fendo.util; 

import java.util.HashMap;
import java.util.Map; 

import org.apache.commons.lang3.StringUtils;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction; 

public class PageUtils { 

  /**
   * 封装分页数据到Map中。
   */
  public static Map<String, Object> getPageMap(Page<?> objPage) { 

    Map<String, Object> resultMap = new HashMap<String, Object>(); 

    resultMap.put("resultList", objPage.getContent()); // 数据集合
    resultMap.put("totalNum", objPage.getTotalElements()); // 总记录数
    resultMap.put("totalPage", objPage.getTotalPages()); // 总页数
    resultMap.put("pageNum", objPage.getNumber()); // 当前页码
    resultMap.put("pageSize", objPage.getSize()); // 每页显示数量 

    return resultMap;
  } 

  /**
   * 创建分页请求。
   *
   * @param pageNum 当前页
   * @param pageSize 每页条数
   * @param sortType 排序字段
   * @param direction 排序方向
   */
  public static PageRequest buildPageRequest(int pageNum, int pageSize, String sortType, String direction) {
    Sort sort = null; 

    if (!StringUtils.isNotBlank(sortType)) {
      return new PageRequest(pageNum - 1, pageSize);
    } else if (StringUtils.isNotBlank(direction)) {
      if (Direction.ASC.equals(direction)) {
        sort = new Sort(Direction.ASC, sortType);
      } else {
        sort = new Sort(Direction.DESC, sortType);
      }
      return new PageRequest(pageNum - 1, pageSize, sort);
    } else {
      sort = new Sort(Direction.ASC, sortType);
      return new PageRequest(pageNum - 1, pageSize, sort);
    }
  } 

  /**
   * 创建分页请求(该方法可以放到util类中).
   */
  public static PageRequest buildPageRequest(int pageNum, int pageSize, String sortType) {
    return buildPageRequest(pageNum, pageSize, sortType, null);
  } 

  /**
   * 创建分页请求
   *
   * @param pageNum
   * @param pageSize
   * @param sort
   * @return
   */
  public static PageRequest buildPageRequest(int pageNum, int pageSize, Sort sort) {
    return new PageRequest(pageNum - 1, pageSize, sort);
  } 

  /**
   * 创建分页请求(该方法可以放到util类中).
   */
  public static PageRequest buildPageRequest(int pageNum, int pageSize) {
    return buildPageRequest(pageNum, pageSize, null, null);
  } 

}

Controller类:

package com.fendo.controller; 

import java.util.HashMap;
import java.util.List;
import java.util.Map; 

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; 

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView; 

import com.fendo.entity.FamilyMember;
import com.fendo.service.imp.FamilyServiceImp;
import com.fendo.util.FamilyUtil; 

@Controller()
@RequestMapping(value="DataTable")
public class DataTableController { 

  @Autowired
  public FamilyServiceImp FamilyMember; 

  @RequestMapping(value="/home_list")
  public String home(Model model,HttpServletRequest request,HttpServletResponse response){
    Map<String, Object> resultMap = new HashMap<>();
    List<FamilyMember> list;
    try {
      list = FamilyMember.getAll();
      // 查询表单或分页保持请求时 请求参数的接收
      Map<String, String> serArgs = new HashMap<String, String>();
      serArgs = FamilyUtil.getSelArgsToMap(request);//这个类在下面给出
      resultMap = FamilyMember.getUserBySearch(serArgs, "CreateData"); //按创建时间排序
      model.addAttribute("resultMap",resultMap);
    } catch (Exception e) {
      e.printStackTrace();
    } 

    return "datatable";
  }
}

首页datatable.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
  pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
<!DOCTYPE html>
<html lang="zh-CN">
 <head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
  <title>Spring Data JPA分页示例</title> 

  <!-- Bootstrap -->
  <link href="${ctx}/css/bootstrap.min.css" rel="external nofollow" rel="stylesheet"> 

  <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
  <script src="${ctx}/js/jquery-1.10.2.min.js"></script> 

  <!-- Include all compiled plugins (below), or include individual files as needed -->
  <script src="${ctx}/js/bootstrap.min.js"></script> 

  <script type="text/javascript" src="${ctx}/js/kkpager.min.js"></script>
  <link rel="stylesheet" type="text/css" href="${ctx}/css/kkpager_blue.css" rel="external nofollow" />
 </head>
 <body> 

   <div class="container"> 

    <div style="text-align:center">
     <h2>Spring Data JPA分页示例</h2>
    </div> 

    <div class="panel panel-primary"> 

     <div class="panel-heading">
      <h3 class="panel-title">数据表格</h3>
     </div> 

      <div class="panel-body" > 

  <form class="form-inline" id="searchForm" method="post" action="${ctx}/DataTable/home_list"> 

    <div class="row"> 

     <div class="form-group col-sm-3">
      <input type="checkbox" id="inlineCheckbox1" value="option1">
      <label>选择所有</label>
     </div> 

     <div class="form-group col-sm-3">
      <label>家庭名:</label>
      <input type="input" name="FamilyName" id="FamilyName" class="form-control" id="exampleInputName3" placeholder="用户名">
     </div> 

     <div class="form-group col-sm-3">
      <label>手机号:</label> 

      <input type="input" name="Mobile" id="Mobile" class="form-control" id="exampleInputMobile3" placeholder="手机号"></input> 

     </div> 

     <div class="col-sm-3">
      <button type="submit" class="btn btn-primary">搜索</button>
      <button type="button" class="btn btn-primary">删除</button>
     </div> 

    </div> 

  </form> 

  <table class="table table-hover" style="margin-top:2px;">
   <thead>
    <tr>
      <th></th>
      <th>顺序</th>
      <th>家庭名称</th>
      <th>家庭Key</th>
      <th>负责人</th>
      <th>手机号</th>
      <th>邮箱</th>
      <th>家庭地址</th>
      <th>创建时间</th>
      <th>状态</th>
      <th>操作</th>
    </tr>
   </thead>
   <tbody> 

   <c:forEach var="lise" items="${resultMap.resultList}" varStatus="status">
     <tr>
       <td><input type="checkbox" id="inlineCheckbox1" value="option1"></td>
       <th scope="row">${status.index+1}</th>
       <td>${lise.familyName}</td>
       <td>${lise.id}</td>
       <td>${lise.familyCharge}</td>
       <td>${lise.mobile }</td>
       <td>${lise.email}</td>
       <td>${lise.address}</td>
       <td>${lise.createData}</td>
       <td>启用</td>
       <td><a href="#" rel="external nofollow" >编辑</a></td>
      </tr> 

   </c:forEach> 

   </tbody>
  </table> 

      </div>
    </div> 

    <div style="width:800px;margin:0 auto;"> 

    <div id="kkpager"></div> 

    </div> 

  </div> 

  <script> 

  var param = ""; 

  $(function() {
    var totalPage = "${resultMap.totalPage}";
    var totalRecords = "${resultMap.totalNum}";
    var pageSize = "${resultMap.pageSize}"; 

    var pageNum = parseInt("${resultMap.pageNum}") + 1;
    //初始化分页控件
    //有些参数是可选的,比如lang,若不传有默认值
    kkpager.init({
      pno: pageNum,
      //总页码
      total: "${resultMap.totalPage}",
      //总数据条数
      totalRecords: totalRecords,
      //链接前部
      hrefFormer: '${ctx}/DataTable/home_list',
      //链接尾部
      hrefLatter: '',
      getLink: function(n) {
        return getInitParam() + "&pageNum=" + n + "&pageSize=" + pageSize;
      },
      lang: {
        prePageText: '上一页',
        nextPageText: '下一页',
        totalPageBeforeText: '共',
        totalPageAfterText: '页',
        totalRecordsAfterText: '条数据',
        gopageBeforeText: '转到',
        gopageButtonOkText: '确定',
        gopageAfterText: '页',
        buttonTipBeforeText: '第',
        buttonTipAfterText: '页'
      }
    });
    //生成
    kkpager.generPageHtml(); 

    $('#mykkpagerselect').val(pageSize);
  }); 

  function getInitParam() {
    var FamilyName = $('#FamilyName').val();
    var Mobile = $('#Mobile').val(); 

    var attr = "?FamilyName=" + encodeURI(encodeURI(FamilyName))
        + "&Mobile=" + Mobile;
    return "${ctx}/DataTable/home_list" + attr;
  } 

  /**
   * 搜索。
   */
  function search() {
    $('#searchForm').submit();
  }   

  </script> 

 </body>
</html>

完整示例: SpringData-JPA_jb51.rar

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • kkpager 实现ajax分页查询功能

    前台分页数据,适合数据少量的时候,因为分页的数据是从后台获取的,大数据的话不建议使用 先看下前台代码: @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <script src="~/kkpager/lib/jquery-1.10.2.min.js

  • ajax分页查询详解

    (1)先写个显示数据的页面,分页查询需要那几个部分呢? 1.首先是查询的文本框输入,还有查询按钮,那么就开始写代码吧 <div> <input type="text" id="key" /> //输入查询字的文本框 <input type="button" value="查询" id="chaxun" /> //查询按钮,起名字是为了以后给这个按钮加事件,因为只有点击了才

  • ajax实现数据分页查询

    用ajax实现对数据库的查询以及对查询数据进行分页,供大家参考,具体内容如下 主页面代码 <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题文档</title> <scri

  • ajax的分页查询示例(不刷新页面)

    既然是分页查询,那么就要有张数据很多的表,可以让它进行分页显示,用普通的方法进行分页查询必然是要刷新页面的,这里要实现不刷新页面进行分页显示数据,就要用到ajax方式.进行编写代码 (1)先写个显示数据的页面,分页查询需要那几个部分呢? 1.首先是查询的文本框输入,还有查询按钮,那么就开始写代码吧 <div> <input type="text" id="key" /> //输入查询字的文本框 <input type="but

  • Ajax写分页查询(实现不刷新页面)

    要求: 获取数据库中大量的信息显示在页面上,必然要使用到分页查询: 若不使用Ajax,而是用其他的方法,肯定是要刷新页面的,用户体检很不好, 所以最好使用Ajax的方法写分页查询: 1.先来找一张数据很多的表吧! 一张简单的表 代码,引入jquery包: <script src="jquery-1.11.2.min.js"></script> 写一张表格,显示我们的代号跟名称: <table class="table table-striped&

  • Ajax案例集下载:新增分页查询案例(包括《Ajax开发精要》中的两个综合案例) 下载

    在<Ajax开发精要>中,我构建了两个简单的综合范例.一个是支持增.删.改.模糊搜索的简单留言簿,另外一个是模拟MSN Space所提供的日志评论.固定链接.引用通告以及自定义列表管理的功能. 今天新增一个分页查询的案例.同样的,与之前的两个案例类似,分页查询的持久化数据依然来自xml文档,以方便网友的拷贝和部署.构建这个案例的方法与之前两个案例大致相当,都是使用XMLHttpRequest.responseXML获取数据,然后填充到页面的相应位置.构建过程中注意代码复用. <Ajax开

  • Spring Data JPA+kkpager实现分页功能实例

    一.spring Data JPA分页 分页效果如下: 前台表格用的是: Bootstrap 分页插件用的是: kkpager kkpager是一个js分页展示控件,传入简单参数就能使用的分页效果控件,github地址:https://github.com/pgkk/kkpager 项目结构: FamilyMember实体类: package com.fendo.entity; import java.io.Serializable; import java.util.Date; import

  • Spring Data JPA进行数据分页与排序的方法

    一.导读 如果一次性加载成千上万的列表数据,在网页上显示将十分的耗时,用户体验不好.所以处理较大数据查询结果展现的时候,分页查询是必不可少的.分页查询必然伴随着一定的排序规则,否则分页数据的状态很难控制,导致用户可能在不同的页看到同一条数据.那么,本文的主要内容就是给大家介绍一下,如何使用Spring Data JPA进行分页与排序. 二.实体定义 我们使用一个简单的实体定义:Article(文章) @Data @AllArgsConstructor @NoArgsConstructor @Bu

  • Spring Data JPA中的动态查询实例

    spring Data JPA大大的简化了我们持久层的开发,但是实际应用中,我们还是需要动态查询的. 比如,前端有多个条件,这些条件很多都是可选的,那么后端的SQL,就应该是可以定制的,在使用hibernate的时候,可以通过判断条件来拼接SQL(HQL),当然,Spring Data JPA在简化我们开发的同时,也是提供了支持的. 通过实现Criteria二实现的动态查询,需要我们的Repo接口继承JpaSpecificationExecutor接口,这是个泛型接口. 然后查询的时候,传入动态

  • Spring Data JPA带条件分页查询实现原理

    最新Spring Data JPA官方参考手册 Version 2.0.0.RC2,2017-07-25 https://docs.spring.io/spring-data/jpa/docs/2.0.0.RC2/reference/html/ JPA参考手册 (找了半天, 在线版的只找到这个) https://www.objectdb.com/java/jpa Spring Data JPA的Specification类, 是按照Eric Evans的<领域驱动设计>书中Specificat

  • Spring MVC+MyBatis+MySQL实现分页功能实例

    前言 最近因为工作的原因,在使用SSM框架实现一个商品信息展示的功能,商品的数据较多,不免用到分页,查了一番MyBatis分页的做法,终于是实现了,在这里记录下来分享给大家,下面来一起看看详细的介绍: 方法如下:  首先写一个分页的工具类,定义当前页数,总页数,每页显示多少等属性. /** * 分页 工具类 */ public class Page implements Serializable { private static final long serialVersionUID = -22

  • Spring Data JPA实现排序与分页查询超详细流程讲解

    目录 前言 1.创建持久化实体类 2.创建数据访问层 3.创建业务层 4.创建控制器类 5.创建View视图页面 6.运行主类 效果如下 前言 在实际开发场景中,排序与分页查询是必须的,幸运的是Spring Data JPA充分考虑了排序与分页查询的场景,为我们提供Sort类 Page接口 Pageable接口 下面通过一个实战来阐明 1.创建持久化实体类 创建名为com.ch.ch6_4.entity的包 并在该包中创建名为Article和Author的持久化实体类 代码如下 Article

  • spring data jpa使用详解(推荐)

    使用Spring data JPA开发已经有一段时间了,这期间学习了一些东西,也遇到了一些问题,在这里和大家分享一下. 前言: Spring data简介: Spring Data是一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务. Spring Data 包含多个子项目: Commons - 提供共享的基础框架,适合各个子项目使用,支持跨数据库持久化 JPA - 简化创建 JPA 数据访问层和跨存储的持久层

  • 关于Spring Data Jpa 自定义方法实现问题

    目录 Spring Data Jpa 自定义方法的实现 自己的接口 主接口 我新建一个类来实现我自己的接口 Spring Data Jpa自定义方法关键字 Spring Data Jpa 自定义方法的实现 最近项目中用到了Spring Data JPA,在里面我继承了一个PagingAndSortingRepository的接口,期望的是利用Spring Data JPA提供的便利. 同时我也希望自己有一个能定义自己方法的接口,因为单纯靠Spring Data JPA中提供的功能还是有很多业务逻

  • Spring Data Jpa实现分页和排序代码实例

    之前我们学习了如何使用Jpa访问关系型数据库.通过Jpa大大简化了我们对数据库的开发工作.但是,之前的例子中我们只提到了最简单的CRUD(增删改查)操作.实际上,Spring Data Jpa对于分页以及排序的查询也有着完美的支持,接下来,我们来学习如何通过Pageable来对数据库进行分页查询. 添加maven依赖 首先我们需要引入Jpa,数据库直接使用hsqldb内存数据库就可以了: <project xmlns="http://maven.apache.org/POM/4.0.0&q

  • Spring MVC结合Spring Data JPA实现按条件查询和分页

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 推荐视频:尚硅谷Spring Data JPA视频教程,一学就会,百度一下就有. 后台代码:在DAO层继承Spring Data JPA的PagingAndSortingRepository接口实现的 (实现方法主要在SbglServiceImpl.java类中) 前台表现:用kkpaper表现出来 实现效果: 1.实体类 package com.jinhetech.yogurt.sbgl.entity; im

随机推荐