分頁插件

一萝招、分頁技術的核心條件
分頁技術的核心條件.png
二渤愁、代碼實現(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ù)拷窜,默認進入的是第一頁)

  • 由于查詢條件是模糊查詢的,需要每個字每個字重裝去進行搜索(需要利用到搜索框架)

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末涧黄,一起剝皮案震驚了整個濱河市篮昧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌笋妥,老刑警劉巖懊昨,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異春宣,居然都是意外死亡酵颁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門月帝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躏惋,“玉大人,你說我怎么就攤上這事嚷辅〔疽蹋” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長扁位。 經常有香客問我准潭,道長,這世上最難降的妖魔是什么域仇? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任刑然,我火速辦了婚禮,結果婚禮上殉簸,老公的妹妹穿的比我還像新娘闰集。我一直安慰自己,他們只是感情好般卑,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布武鲁。 她就那樣靜靜地躺著,像睡著了一般蝠检。 火紅的嫁衣襯著肌膚如雪沐鼠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天叹谁,我揣著相機與錄音饲梭,去河邊找鬼。 笑死焰檩,一個胖子當著我的面吹牛憔涉,可吹牛的內容都是我干的。 我是一名探鬼主播析苫,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼兜叨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了衩侥?” 一聲冷哼從身側響起国旷,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茫死,沒想到半個月后跪但,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡峦萎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年屡久,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爱榔。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡涂身,死狀恐怖,靈堂內的尸體忽然破棺而出搓蚪,到底是詐尸還是另有隱情,我是刑警寧澤丁鹉,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布妒潭,位于F島的核電站悴能,受9級特大地震影響,放射性物質發(fā)生泄漏雳灾。R本人自食惡果不足惜漠酿,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谎亩。 院中可真熱鬧炒嘲,春花似錦、人聲如沸匈庭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阱持。三九已至夭拌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間衷咽,已是汗流浹背鸽扁。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留镶骗,地道東北人桶现。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像鼎姊,于是被迫代替她去往敵國和親骡和。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內容