SpringCloud+MyBatis分頁(yè)處理(前后端分離)
分頁(yè)處理,這是做JavaWeb項(xiàng)目中常見(jiàn)的場(chǎng)景。
背景:
1.系統(tǒng)架構(gòu):SpringCloud分布式
2.持久層:MyBatis
3.前端:前后分離vue.js/bootstrap等.
后臺(tái)提供restful api 接口,前端訪(fǎng)問(wèn)后端接口展示數(shù)據(jù)。
2種方式提供分頁(yè)處理方案:
一、直接MyBatis數(shù)據(jù)庫(kù)進(jìn)行分頁(yè)
controller接口
@ApiImplicitParams({
@ApiImplicitParam(name = "categoryId", value = "支付渠道大類(lèi)Id", required = false, dataType = "Long", paramType = "query"),
@ApiImplicitParam(name = "payChannelId", value = "支付渠道ID", required = false, dataType = "Long", paramType = "query"),
@ApiImplicitParam(name = "bankCode", value = "銀行名稱(chēng)code", required = false, dataType = "String", paramType = "query"),
@ApiImplicitParam(name = "startTime", value = "創(chuàng)建時(shí)間起始(示例:2018-09-05)", required = false, dataType = "String", paramType = "query", length = 10),
@ApiImplicitParam(name = "endTime", value = "創(chuàng)建時(shí)間截止(示例:2018-09-05)", required = false, dataType = "String", paramType = "query", length = 10),
@ApiImplicitParam(name = "pageNum", value = "查詢(xún)開(kāi)始頁(yè)", required = true, dataType = "int", paramType = "query"),
@ApiImplicitParam(name = "pageSize", value = "查詢(xún)的頁(yè)面大小不需要分頁(yè)則把此值填大一點(diǎn)", 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 用于前端分頁(yè)的參數(shù),pageNum:表示頁(yè)碼第幾頁(yè),pageSize:表示每頁(yè)展示數(shù)據(jù)數(shù)量。
所有查詢(xún)條件參數(shù),在mapper-xml里進(jìn)行處理,再利用數(shù)據(jù)庫(kù)oracle本身的rownum行值進(jìn)行分頁(yè)。
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 <= #{endRowNo,jdbcType=DECIMAL}
)
where RN >= #{beginRowNo,jdbcType=DECIMAL}
</select>
優(yōu)點(diǎn):直觀(guān)、方便、易排查問(wèn)題。 缺點(diǎn):訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)過(guò)于頻繁,未利用到mybatis本身的緩存優(yōu)勢(shì)。
二、Java+緩存分頁(yè)
這種方法對(duì)于前端而言是沒(méi)變化,無(wú)感的。
只是在后端處理稍作變動(dòng),思路:
1.先把所有數(shù)據(jù)記錄查詢(xún)出來(lái)
2.數(shù)據(jù)庫(kù)實(shí)體再次封裝為查詢(xún)實(shí)體
3.純java代碼進(jìn)行分頁(yè)
controller接口不變
service業(yè)務(wù)處理——>數(shù)據(jù)庫(kù)crud操作變動(dòng)
把所有數(shù)據(jù)庫(kù)記錄查詢(xún)處理
<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進(jìn)行分頁(yè)處理
//以分頁(yè)形式輸出給前端
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)點(diǎn):利用了mybatis緩存機(jī)制,分頁(yè)查詢(xún)快速,減少數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)次數(shù)。
缺點(diǎn):當(dāng)數(shù)據(jù)量大的時(shí)候,100W+;在沒(méi)有條件查詢(xún)數(shù)據(jù)庫(kù)的時(shí)候,耗時(shí)久
前端分頁(yè)后的界面展示如下:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JDK8新出Optional類(lèi)的方法探索與思考分析
這篇文章主要為大家介紹了JDK8新出Optional類(lèi)的發(fā)方法示例探索與思考分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
Jmeter分布式壓力測(cè)試實(shí)現(xiàn)過(guò)程詳解
這篇文章主要介紹了Jmeter分布式壓力測(cè)試實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
創(chuàng)建SpringBoot項(xiàng)目的全過(guò)程
文章介紹了如何在IDEA專(zhuān)業(yè)版中創(chuàng)建SpringBoot項(xiàng)目,并通過(guò)一個(gè)簡(jiǎn)單的示例展示了如何使用SpringBoot輸出"hello,Springboot"2025-03-03
Java如何實(shí)現(xiàn)通過(guò)證書(shū)訪(fǎng)問(wèn)Https請(qǐng)求
這篇文章主要介紹了Java如何實(shí)現(xiàn)通過(guò)證書(shū)訪(fǎng)問(wèn)Https請(qǐng)求,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
Mybatis輸入輸出映射及動(dòng)態(tài)SQL Review
這篇文章主要介紹了Mybatis輸入輸出映射及動(dòng)態(tài)SQL Review,需要的朋友可以參考下2017-02-02
RocketMQ消息過(guò)濾與查詢(xún)的實(shí)現(xiàn)
這篇文章主要介紹了RocketMQ消息過(guò)濾與查詢(xún)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
關(guān)于Spring配置文件加載方式變化引發(fā)的異常詳解
這篇文章主要給大家介紹了關(guān)于Spring配置文件加載方式變化引發(fā)的異常的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-01-01

