您好,登錄后才能下訂單哦!
Spring Data中的分頁(yè)功能如何留 JPA+kkpager實(shí)現(xiàn)?相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
一、spring Data JPA分頁(yè)
分頁(yè)效果如下:
前臺(tái)表格用的是: Bootstrap
分頁(yè)插件用的是: kkpager
kkpager是一個(gè)js分頁(yè)展示控件,傳入簡(jiǎn)單參數(shù)就能使用的分頁(yè)效果控件,github地址:https://github.com/pgkk/kkpager
項(xiàng)目結(jié)構(gòu):
FamilyMember實(shí)體類:
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服務(wù)接口類:
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服務(wù)接口實(shí)現(xiàn)類:
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); } /** * 查詢用戶信息列表(支持分頁(yè)和多條件查詢)。 * */ @Override public Map<String, Object> getUserBySearch(Map<String, String> familyArgs, final String sortType) throws Exception { // 獲得分頁(yè)對(duì)象pageable,并且在pageable中頁(yè)碼是從0開始,設(shè)定按照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); } }
前臺(tái)接受參數(shù)工具類:
package com.fendo.util; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; /** * 工具類 * @author fendo * */ public class FamilyUtil { /** * 封裝從前臺(tái)傳遞過來(lái)的查詢參數(shù)。 * */ 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; } }
分頁(yè)工具類:
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 { /** * 封裝分頁(yè)數(shù)據(jù)到Map中。 */ public static Map<String, Object> getPageMap(Page<?> objPage) { Map<String, Object> resultMap = new HashMap<String, Object>(); resultMap.put("resultList", objPage.getContent()); // 數(shù)據(jù)集合 resultMap.put("totalNum", objPage.getTotalElements()); // 總記錄數(shù) resultMap.put("totalPage", objPage.getTotalPages()); // 總頁(yè)數(shù) resultMap.put("pageNum", objPage.getNumber()); // 當(dāng)前頁(yè)碼 resultMap.put("pageSize", objPage.getSize()); // 每頁(yè)顯示數(shù)量 return resultMap; } /** * 創(chuàng)建分頁(yè)請(qǐng)求。 * * @param pageNum 當(dāng)前頁(yè) * @param pageSize 每頁(yè)條數(shù) * @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); } } /** * 創(chuàng)建分頁(yè)請(qǐng)求(該方法可以放到util類中). */ public static PageRequest buildPageRequest(int pageNum, int pageSize, String sortType) { return buildPageRequest(pageNum, pageSize, sortType, null); } /** * 創(chuàng)建分頁(yè)請(qǐng)求 * * @param pageNum * @param pageSize * @param sort * @return */ public static PageRequest buildPageRequest(int pageNum, int pageSize, Sort sort) { return new PageRequest(pageNum - 1, pageSize, sort); } /** * 創(chuàng)建分頁(yè)請(qǐng)求(該方法可以放到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(); // 查詢表單或分頁(yè)保持請(qǐng)求時(shí) 請(qǐng)求參數(shù)的接收 Map<String, String> serArgs = new HashMap<String, String>(); serArgs = FamilyUtil.getSelArgsToMap(request);//這個(gè)類在下面給出 resultMap = FamilyMember.getUserBySearch(serArgs, "CreateData"); //按創(chuàng)建時(shí)間排序 model.addAttribute("resultMap",resultMap); } catch (Exception e) { e.printStackTrace(); } return "datatable"; } }
首頁(yè)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個(gè)meta標(biāo)簽*必須*放在最前面,任何其他內(nèi)容都*必須*跟隨其后! --> <title>Spring Data JPA分頁(yè)示例</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 > <h3>Spring Data JPA分頁(yè)示例</h3> </div> <div class="panel panel-primary"> <div class="panel-heading"> <h4 class="panel-title">數(shù)據(jù)表格</h4> </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>手機(jī)號(hào):</label> <input type="input" name="Mobile" id="Mobile" class="form-control" id="exampleInputMobile3" placeholder="手機(jī)號(hào)"></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" > <thead> <tr> <th></th> <th>順序</th> <th>家庭名稱</th> <th>家庭Key</th> <th>負(fù)責(zé)人</th> <th>手機(jī)號(hào)</th> <th>郵箱</th> <th>家庭地址</th> <th>創(chuàng)建時(shí)間</th> <th>狀態(tài)</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 > <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; //初始化分頁(yè)控件 //有些參數(shù)是可選的,比如lang,若不傳有默認(rèn)值 kkpager.init({ pno: pageNum, //總頁(yè)碼 total: "${resultMap.totalPage}", //總數(shù)據(jù)條數(shù) totalRecords: totalRecords, //鏈接前部 hrefFormer: '${ctx}/DataTable/home_list', //鏈接尾部 hrefLatter: '', getLink: function(n) { return getInitParam() + "&pageNum=" + n + "&pageSize=" + pageSize; }, lang: { prePageText: '上一頁(yè)', nextPageText: '下一頁(yè)', totalPageBeforeText: '共', totalPageAfterText: '頁(yè)', totalRecordsAfterText: '條數(shù)據(jù)', gopageBeforeText: '轉(zhuǎn)到', gopageButtonOkText: '確定', gopageAfterText: '頁(yè)', buttonTipBeforeText: '第', buttonTipAfterText: '頁(yè)' } }); //生成 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>
看完上述內(nèi)容,你們掌握Spring Data中的分頁(yè)功能如何留 JPA+kkpager實(shí)現(xiàn)的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。