SpringCloud+MyBatis分頁處理(前后端分離)

分頁處理场晶,這是做JavaWeb項目中常見的場景。

背景:

系統(tǒng)架構(gòu):SpringCloud分布式

持久層:MyBatis

前端:前后分離vue.js/bootstrap等.

后臺提供restful api 接口,前端訪問后端接口展示數(shù)據(jù)令野。

2種方式提供分頁處理方案:

一轻专、直接MyBatis數(shù)據(jù)庫進行分頁

controller接口

@ApiImplicitParams({

? ? ? ? ? ? @ApiImplicitParam(name = "categoryId", value = "支付渠道大類Id", required = false, dataType = "Long",? paramType = "query"),

? ? ? ? ? ? @ApiImplicitParam(name = "payChannelId", value = "支付渠道ID", required = false, dataType = "Long", paramType = "query"),

? ? ? ? ? ? @ApiImplicitParam(name = "bankCode", value = "銀行名稱code", required = false, dataType = "String", paramType = "query"),

? ? ? ? ? ? @ApiImplicitParam(name = "startTime", value = "創(chuàng)建時間起始(示例:2018-09-05)", required = false, dataType = "String", paramType = "query", length = 10),

? ? ? ? ? ? @ApiImplicitParam(name = "endTime", value = "創(chuàng)建時間截止(示例:2018-09-05)", required = false, dataType = "String", paramType = "query", length = 10),

? ? ? ? ? ? @ApiImplicitParam(name = "pageNum", value = "查詢開始頁", required = true, dataType = "int", paramType = "query"),

? ? ? ? ? ? @ApiImplicitParam(name = "pageSize", value = "查詢的頁面大小不需要分頁則把此值填大一點", required = true, dataType = "int", paramType = "query")})

? ? public PageResult<ChannelBaseDataResp> queryPayChannel(

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @RequestParam(value = "categoryId", required = false) Long categoryId,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @RequestParam(value = "payChannelId", required = false) Long payChannelId,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @RequestParam(value = "bankCode", required = false) String bankCode,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @RequestParam(value = "startTime", required = false) String startTime,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @RequestParam(value = "endTime", required = false) String endTime,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @RequestParam(value = "pageNum", required = true) Integer pageNum,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @RequestParam(value = "pageSize", required = true) Integer pageSize) {

? ? ? ? PageResult<ChannelBaseDataResp> response = new PageResult<ChannelBaseDataResp>();

? ? ? ? try {

? ? ? ? ? ? int endRowNo = pageNum * pageSize;

? ? ? ? ? ? int beginRowNo = (pageNum - 1) * pageSize + 1;

? ? ? ? ? ? return channelBaseDataService.queryBaseData(categoryId,payChannelId,bankCode,startTime,endTime,beginRowNo,endRowNo);

? ? ? ? }? catch (Exception e) {

? ? ? ? ? ? response = new PageResult<ChannelBaseDataResp>();

? ? ? ? ? ? if (e instanceof AppException) {

? ? ? ? ? ? ? ? response.setCode(((AppException) e).getErrorCode());

? ? ? ? ? ? ? ? response.setResult(((AppException) e).getErrorMsg());

? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? response.setCode(CumReturnCode.SYSTEM_EXCEPTION.code);

? ? ? ? ? ? ? ? response.setResult(CumReturnCode.SYSTEM_EXCEPTION.message);

? ? ? ? ? ? }

? ? ? ? ? ? return response;

? ? ? ? }

? ? }

Swagger-ui接口界面如下:

pageNum 和 pageSize 用于前端分頁的參數(shù),pageNum:表示頁碼第幾頁卵迂,pageSize:表示每頁展示數(shù)據(jù)數(shù)量裕便。

所有查詢條件參數(shù),在mapper-xml里進行處理见咒,再利用數(shù)據(jù)庫oracle本身的rownum行值進行分頁偿衰。

xml代碼:

<select id="queryBaseDataList" resultMap="BaseResultMap">

? ? select

? ? ID, PAY_CHANNEL_MAIN_ID, PAY_CHANNEL_ID,

? ? BANK_CODE, CREATE_TIME, UPDATE_TIME,UPDATOR

? ? from (

? ? select A.*, rownum RN

? ? from (

? ? select ID, PAY_CHANNEL_MAIN_ID, PAY_CHANNEL_ID,

? ? BANK_CODE, CREATE_TIME, UPDATE_TIME,UPDATOR

? ? from CUM_PAY_CHANNEL_BASE

? ? <where>

? ? ? <if test="beginCreateTime != null">

? ? ? ? CREATE_TIME <![CDATA[ >= ]]>? #{beginCreateTime,jdbcType=TIMESTAMP}

? ? ? </if>

? ? ? <if test="endCreateTime != null">

? ? ? ? AND CREATE_TIME <![CDATA[ <= ]]>? #{endCreateTime,jdbcType=TIMESTAMP}

? ? ? </if>

? ? ? <if test="categoryId != null and categoryId != '' ">

? ? ? ? AND PAY_CHANNEL_MAIN_ID = #{categoryId,jdbcType=DECIMAL}

? ? ? </if>

? ? ? <if test="payChannelId != null and payChannelId != ''">

? ? ? ? AND PAY_CHANNEL_ID = #{payChannelId,jdbcType=DECIMAL}

? ? ? </if>

? ? ? <if test="bankCode != null and bankCode != ''">

? ? ? ? AND BANK_CODE = #{bankCode,jdbcType=VARCHAR}

? ? ? </if>

? ? </where>

? ? order by CREATE_TIME desc

? ? ) A

? ? where rownum &lt;= #{endRowNo,jdbcType=DECIMAL}

? ? )

? ? where RN &gt;= #{beginRowNo,jdbcType=DECIMAL}

? </select>

優(yōu)點:直觀、方便改览、易排查問題下翎。 缺點:訪問數(shù)據(jù)庫過于頻繁,未利用到mybatis本身的緩存優(yōu)勢恃疯。

二漏设、Java+緩存分頁

這種方法對于前端而言是沒變化,無感的今妄。

只是在后端處理稍作變動郑口,思路:

先把所有數(shù)據(jù)記錄查詢出來

數(shù)據(jù)庫實體再次封裝為查詢實體

純java代碼進行分頁

controller接口不變

service業(yè)務處理——>數(shù)據(jù)庫crud操作變動

把所有數(shù)據(jù)庫記錄查詢處理

<select id="queryBaseDataList" resultMap="BaseResultMap">

? ? select

? ? ID, PAY_CHANNEL_MAIN_ID, PAY_CHANNEL_ID,

? ? BANK_CODE, CREATE_TIME, UPDATE_TIME,UPDATOR

? ? from CUM_PAY_CHANNEL_BASE

? ? <where>

? ? ? <if test="beginCreateTime != null">

? ? ? ? CREATE_TIME <![CDATA[ >= ]]>? #{beginCreateTime,jdbcType=TIMESTAMP}

? ? ? </if>

? ? ? <if test="endCreateTime != null">

? ? ? ? AND CREATE_TIME <![CDATA[ <= ]]>? #{endCreateTime,jdbcType=TIMESTAMP}

? ? ? </if>

? ? ? <if test="categoryId != null and categoryId != '' ">

? ? ? ? AND PAY_CHANNEL_MAIN_ID = #{categoryId,jdbcType=DECIMAL}

? ? ? </if>

? ? ? <if test="payChannelId != null and payChannelId != ''">

? ? ? ? AND PAY_CHANNEL_ID = #{payChannelId,jdbcType=DECIMAL}

? ? ? </if>

? ? ? <if test="bankCode != null and bankCode != ''">

? ? ? ? AND BANK_CODE = #{bankCode,jdbcType=VARCHAR}

? ? ? </if>

? ? </where>

? ? order by CREATE_TIME desc

</select>

再按照pageNum和pageSize進行分頁處理

? ? ? ? //以分頁形式輸出給前端

? ? ? ? List<ChannelRouteGroupResp> resultList = new ArrayList<>();

? ? ? ? if(groupRespList.size() >= endRowNo){

? ? ? ? ? ? for(int i=(beginRowNo-1); i< endRowNo; i++){

? ? ? ? ? ? ? ? resultList.add(groupRespList.get(i));

? ? ? ? ? ? }

? ? ? ? }else{

? ? ? ? ? ? for(int i=(beginRowNo-1); i< groupRespList.size(); i++){

? ? ? ? ? ? ? ? resultList.add(groupRespList.get(i));

? ? ? ? ? ? }

? ? ? ? }

優(yōu)點:利用了mybatis緩存機制鸳碧,分頁查詢快速,減少數(shù)據(jù)庫訪問次數(shù)犬性。

缺點:當數(shù)據(jù)量大的時候瞻离,100W+;在沒有條件查詢數(shù)據(jù)庫的時候乒裆,耗時久


前端分頁后的界面展示如下:

關(guān)注個人技術(shù)公眾號:nick_coding1024

不定期分享最新前沿技術(shù)框架和bat大廠常用技術(shù)等套利,加群不定期分享行業(yè)內(nèi)大牛直播講課以及獲得內(nèi)退一線互聯(lián)網(wǎng)公司機會。

---------------------CSDN技術(shù)博客

原文:https://blog.csdn.net/xuri24/article/details/83583748

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鹤耍,一起剝皮案震驚了整個濱河市肉迫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌稿黄,老刑警劉巖喊衫,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異杆怕,居然都是意外死亡族购,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門陵珍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寝杖,“玉大人,你說我怎么就攤上這事互纯∩唬” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵伟姐,是天一觀的道長收苏。 經(jīng)常有香客問我,道長愤兵,這世上最難降的妖魔是什么鹿霸? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮秆乳,結(jié)果婚禮上懦鼠,老公的妹妹穿的比我還像新娘。我一直安慰自己屹堰,他們只是感情好肛冶,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扯键,像睡著了一般睦袖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上荣刑,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天馅笙,我揣著相機與錄音伦乔,去河邊找鬼。 笑死董习,一個胖子當著我的面吹牛烈和,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播皿淋,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼招刹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了窝趣?” 一聲冷哼從身側(cè)響起疯暑,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎高帖,沒想到半個月后缰儿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體畦粮,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡散址,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了宣赔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片预麸。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖儒将,靈堂內(nèi)的尸體忽然破棺而出吏祸,到底是詐尸還是另有隱情,我是刑警寧澤钩蚊,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布贡翘,位于F島的核電站,受9級特大地震影響砰逻,放射性物質(zhì)發(fā)生泄漏鸣驱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一蝠咆、第九天 我趴在偏房一處隱蔽的房頂上張望踊东。 院中可真熱鬧,春花似錦刚操、人聲如沸闸翅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坚冀。三九已至,卻和暖如春鉴逞,著一層夾襖步出監(jiān)牢的瞬間记某,已是汗流浹背联喘。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留辙纬,地道東北人豁遭。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像贺拣,于是被迫代替她去往敵國和親蓖谢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容