一萝招、分頁技術的核心條件
二渤愁、代碼實現(xiàn)
2.1 分頁數(shù)據(jù)封裝類PageEntity
1.初始化當前頁數(shù)
2.初始化每頁顯示條數(shù)
3.計算limit中起始下標索引值
package cn.kooun.common.page;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
* 通用分頁參數(shù)封裝
* @author HuangJingNa
* @date 2019年12月23日 下午3:17:14
*
*/
@Getter
@Setter
@ToString
public class PageEntity {
/**當前頁數(shù)*/
private Integer currentPage;
/**分頁數(shù)據(jù)*/
private List<?> dataPage;
/**總記錄數(shù)*/
private Integer total;
/**每頁顯示的條數(shù)*/
private Integer countPage;
public PageEntity(Integer currentPage) {
this.currentPage = currentPage;
this.initCurrentPage();
this.initCountPage();
}
/**
* 初始化當前頁數(shù)
* @author HuangJingNa
* @date 2019年12月23日 下午3:25:35
*
*/
public void initCurrentPage() {
if(this.currentPage == null || this.currentPage <= 0) {
this.currentPage = 1;
}
}
/**
* 初始化每頁顯示的條數(shù)
* @author HuangJingNa
* @date 2019年12月23日 下午3:26:54
*
*/
public void initCountPage() {
//沒有移迫,以及小于下限
if(this.countPage == null || this.countPage <= 10) {
this.countPage = 10;
}
//大于上限
if(this.countPage >= 100) {
this.countPage = 100;
}
}
/**
* 計算起始索引
* @author HuangJingNa
* @date 2019年12月23日 下午3:23:07
*
*/
public static Integer countIndexStart(int currentPage, int countPage) {
return (currentPage - 1) * countPage;
}
public int countIndexStart() {
//(當前頁數(shù)-1)*每頁顯示的條數(shù)
return (currentPage - 1) * countPage;
}
}
1.2 controller層
/**
* 根據(jù)用戶昵稱/用戶賬號/用戶類別分頁查看所有的用戶
* @author HuangJingNa
* @date 2019年12月23日 下午3:30:16
*
* @return
*/
@GetMapping("find_user_all")
public Object findUserAll(
UserFindUserAllParam userFindUserAllParam) throws Exception{
return userService.findUserAll(userFindUserAllParam);
}
controller 中傳遞的參數(shù)
package cn.kooun.pojo.params;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
* 分頁查詢所有用戶參數(shù)封裝
* @author HuangJingNa
* @date 2019年12月23日 下午3:32:07
*
*/
@Getter
@Setter
@ToString
public class UserFindUserAllParam {
/**起始頁數(shù)*/
private Integer pageStart;
/**用戶昵稱*/
private String userNickName;
/**用戶賬號*/
private String username;
/**用戶類別*/
private Integer userType;
}
1.3 service層
/**
* 根據(jù)用戶昵稱/用戶賬號/用戶類別分頁查看所有的用戶
* @author HuangJingNa
* @date 2019年12月23日 下午3:33:01
*
* @param userFindUserAll
* @return
*/
public Object findUserAll(UserFindUserAllParam userFindUserAllParam) throws Exception{
//校驗數(shù)據(jù)
Object result = this.checkFindUserAll(userFindUserAllParam);
if(result != null) {
return result;
}
//封裝分頁數(shù)據(jù)
PageEntity pageEntity = packagePageParam(userFindUserAllParam);
//返回分頁數(shù)據(jù)
return ResultUtils.success(pageEntity);
}
/**
* 封裝分頁數(shù)據(jù)
* @author HuangJingNa
* @date 2019年12月23日 下午4:14:50
*
* @param userFindUserAllParam
* @return
*/
private PageEntity packagePageParam(UserFindUserAllParam userFindUserAllParam) {
PageEntity pageEntity = new PageEntity(userFindUserAllParam.getPageStart());
//獲取用戶總記錄數(shù)
int count = userMapper.findUserCountByPageParam(userFindUserAllParam);
//根據(jù)用戶昵稱/用戶賬號/用戶類別分頁查看所有的用戶
List<Map<String, Object>> data = userMapper.findUserDataPageByPageParam(
pageEntity.getCountPage(),
pageEntity.countIndexStart(),
userFindUserAllParam);
pageEntity.setDataPage(data);
pageEntity.setTotal(count);
return pageEntity;
}
/**
* 根據(jù)用戶昵稱/用戶賬號/用戶類別分頁查看所有的用戶_數(shù)據(jù)校驗
* @author HuangJingNa
* @date 2019年12月23日 下午3:49:39
*
* @param userFindUserAllParam
* @return
*/
private Object checkFindUserAll(UserFindUserAllParam userFindUserAllParam) {
String userNickName = userFindUserAllParam.getUserNickName();
String username = userFindUserAllParam.getUsername();
Integer userType = userFindUserAllParam.getUserType();
//過濾昵稱
if(!StringUtils.isEmpty(userNickName)) {
userFindUserAllParam.setUserNickName(SearchUtils.filterKeyWord(userNickName));
}
//過濾賬號
if(!StringUtils.isEmpty(username)) {
userFindUserAllParam.setUsername(SearchUtils.filterKeyWord(username));
}
//過濾類型
if(userType != null) {
if(userType < 0 || userType > 1) {
userFindUserAllParam.setUserType(1);
}
}
return null;
}
1.4 dao層中的.java
/**
* 獲取用戶總記錄數(shù)
* @author HuangJingNa
* @date 2019年12月23日 下午3:55:27
*
* @param userFindUserAllParam
* @return
*/
int findUserCountByPageParam(@Param("pageParam")UserFindUserAllParam pageParam);
/**
* 根據(jù)用戶昵稱/用戶賬號/用戶類別分頁查看所有的用戶
* @author HuangJingNa
* @date 2019年12月23日 下午3:56:08
*
* @param countPage
* @param countIndexStart
* @param userFindUserAllParam
* @return
*/
List<Map<String, Object>> findUserDataPageByPageParam(
@Param("countPage")int countPage,
@Param("indexStart")int indexStart,
@Param("pageParam")UserFindUserAllParam pageParam);
dao層中的mapper.xml
<?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.kooun.mapper.UserMapper">
<sql id="userPageselect">
SELECT
u.id userId,
u.create_time userCreateTime,
u.update_time userUpdateTime,
u.username UserName,
u.nick_name userNickName,
(
CASE u.type
WHEN 0 THEN
'管理員'
WHEN 1 THEN
'用戶'
ELSE
'未知用戶'
END
) userType
FROM
u_user u
</sql>
<sql id="userPageTotalSelect">
SELECT
COUNT(u.id)
FROM
u_user u
</sql>
<!-- 獲取用戶總記錄數(shù) -->
<select id="findUserCountByPageParam" resultType="int">
<include refid="userPageTotalSelect" />
<where>
<if test="pageParam.username != null">
u.username LIKE #{pageParam.username}
</if>
<if test="pageParam.userNickName != null">
OR u.nick_name LIKE #{pageParam.userNickName}
</if>
<if test="pageParam.userType != null">
OR u.type = #{pageParam.userType}
</if>
</where>
</select>
<!-- 根據(jù)用戶昵稱/用戶賬號/用戶類別分頁查看所有的用戶 -->
<select id="findUserDataPageByPageParam" resultType="map">
<include refid="userPageselect" />
<where>
<if test="pageParam.username != null">
u.username LIKE #{pageParam.username}
</if>
<if test="pageParam.userNickName != null">
OR u.nick_name LIKE #{pageParam.userNickName}
</if>
<if test="pageParam.userType != null">
OR u.type = #{pageParam.userType}
</if>
</where>
LIMIT #{indexStart},#{countPage}
</select>
</mapper>
1.5 SearchUtils模糊查詢工具
package cn.kooun.common.search;
import org.springframework.util.StringUtils;
/**
* 搜索工具類
*
* @author chenWei
* @date 2019年9月18日 下午3:54:52
*
*/
public class SearchUtils {
/**
* 過濾關鍵詞
* @author chenWei
* @date 2019年9月18日 下午4:13:32
* @param keyWord
* @return
*/
public static String filterKeyWord(String keyWord) {
/*
* 將關鍵詞過濾掉標點符號,然后每個字符的間隔都拼接上%號
* 執(zhí)行sql like模糊查詢能匹配更多數(shù)據(jù)
*/
keyWord = keyWord.replaceAll("\\p{Punct}", "").trim();
if (keyWord.length() < 20) {
keyWord = keyWord.substring(0, keyWord.length());
} else {
keyWord = keyWord.substring(0, 20);
}
if(StringUtils.isEmpty(keyWord)) {
return keyWord;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < keyWord.length(); i++) {
sb.append("%").append(keyWord.charAt(i));
}
sb.append("%");
return sb.toString();
}
}
由于數(shù)據(jù)庫查詢璃赡,一次性查出來的數(shù)據(jù)有可能過多宫峦,這樣會造成數(shù)據(jù)庫內存溢出(丟失數(shù)據(jù))血公,所以需要用到分頁查詢
分頁參數(shù)封裝辕录,一般需要封裝的參數(shù):當前頁數(shù)睦霎、總記錄數(shù)、每頁顯示條數(shù)走诞、分頁數(shù)據(jù)副女;
同時,我們需要計算開始下標索引值:(當前頁數(shù)-1)* 每頁顯示的條數(shù)蚣旱,用于查詢語句limit中的開始下標索引值碑幅;
以及每頁顯示條數(shù)的賦值(一般是系統(tǒng)自動賦值的,除了管理系統(tǒng)姻锁,客戶端可能會主動賦值枕赵;所以需要設置其上限和下限),用戶查詢語句limit中的顯示條數(shù)位隶;
需要設置當前頁數(shù)(若客戶端沒有傳遞當前頁數(shù)拷窜,默認進入的是第一頁)
由于查詢條件是模糊查詢的,需要每個字每個字重裝去進行搜索(需要利用到搜索框架)