备案 控制台
开发者社区 数据库 文章 正文

SpringCloud+MyBatis分页处理(前后端分离)

简介: 分页处理,这是做JavaWeb项目中常见的场景。

分页处理,这是做JavaWeb项目中常见的场景。


背景


  1. 系统架构:SpringCloud分布式
  2. 持久层:MyBatis
  3. 前端:前后分离vue.js/bootstrap等.
  4. 后台提供restful api 接口,前端访问后端接口展示数据。


2种方式提供分页处理方案:


一、直接MyBatis数据库进行分页


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 = "创建时间起始(示例:2018-09-05)", required = false, dataType = "String", paramType = "query", length = 10),            @ApiImplicitParam(name = "endTime", value = "创建时间截止(示例: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接口界面如下:

16182cd7b4ce77e714f7878e71421a0e_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


pageNum 和 pageSize 用于前端分页的参数,pageNum:表示页码第几页,pageSize:表示每页展示数据数量。


所有查询条件参数,在mapper-xml里进行处理,再利用数据库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>

优点:直观、方便、易排查问题。 缺点:访问数据库过于频繁,未利用到mybatis本身的缓存优势。


二、Java+缓存分页



这种方法对于前端而言是没变化,无感的。


只是在后端处理稍作变动,思路:

  • 先把所有数据记录查询出来
  • 数据库实体再次封装为查询实体
  • 纯java代码进行分页
  • controller接口不变
  • service业务处理——>数据库crud操作变动
  • 把所有数据库记录查询处理


<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));            }        }

优点:利用了mybatis缓存机制,分页查询快速,减少数据库访问次数。


缺点:当数据量大的时候,100W+;在没有条件查询数据库的时候,耗时久


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

da0a2e198fb7e846bb26b4a79a9e1bae_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

程序大视界
目录
相关文章
小趴菜111.
|
30天前
SpringBoot+Mybatis-Plus+PageHelper分页+多条件查询
SpringBoot+Mybatis-Plus+PageHelper分页+多条件查询
小趴菜111.
42 0
穆雄雄.
|
30天前
Mybatis+mysql动态分页查询数据案例——分页工具类(Page.java)
Mybatis+mysql动态分页查询数据案例——分页工具类(Page.java)
穆雄雄.
36 1
怒放de生命
|
30天前
|
SQL Java 数据库连接
mybatis常见分页技术和自定义分页原理实战
mybatis常见分页技术和自定义分页原理实战
怒放de生命
60 0
叶落闲庭
|
21天前
|
SQL Java 关系型数据库
基于SpringBoot使用MyBatisPlus,MyBatisPlus标准数据层开发(CRUD)、MyBatisPlus分页功能的使用
基于SpringBoot使用MyBatisPlus,MyBatisPlus标准数据层开发(CRUD)、MyBatisPlus分页功能的使用
叶落闲庭
30 2
老板这功能得加钱
|
28天前
|
前端开发 JavaScript Java
Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)五(前端页面
Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)五(前端页面
老板这功能得加钱
30 0
Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)五(前端页面
咕噜咕噜wy
|
29天前
|
SQL 存储 算法
Mybatis-Plus- CRUD接口-主键策略-自动填充和乐观锁-分页-逻辑删除-条件构造器和常用接口
Mybatis-Plus- CRUD接口-主键策略-自动填充和乐观锁-分页-逻辑删除-条件构造器和常用接口
咕噜咕噜wy
20 0
游客hjgt3xacvje4w
|
30天前
|
SQL 前端开发 Java
通过使用Mybatis插件来实现数据的分页功能
通过使用Mybatis插件来实现数据的分页功能
游客hjgt3xacvje4w
30 0
江帅帅
|
30天前
最新版 MyBatisPlus 分页插件(直接拿来就可以用)
最新版 MyBatisPlus 分页插件(直接拿来就可以用)
江帅帅
10 0
风水道人
|
30天前
|
SQL Java 数据库连接
Mybatis是如何实现分页功能的
Mybatis是如何实现分页功能的
风水道人
16 0
风水道人
|
30天前
|
druid Java 数据库连接
SpringBoot + Mybatis + Druid + PageHelper 实现多数据源分页
SpringBoot + Mybatis + Druid + PageHelper 实现多数据源分页
风水道人
63 0

热门文章

最新文章

  • 1
    Spring Boot 集成 MyBatis和 SQL Server实践
  • 2
    springboot+druid+mybatis plus的多数据源配置
  • 3
    还在使用MyBatis Generator?试试这个工具
  • 4
    mybatis的一对一 一对多 多对多
  • 5
    Mybatis基于XML配置SQL映射器(二)
  • 6
    [MyBatis日记](6)一对一与一对多映射
  • 7
    浅析Mybatis核心组件
  • 8
    Mybatis传多个参数(三种解决方案)
  • 9
    MyBatis之Hello world(Mybatis入门)
  • 10
    Mybatis原理分析一 从JDBC到Mybaits
  • 1
    SpringCloud Alibaba集成Dubbo实现远程服务间调用
    92
  • 2
    【十】SpringCloud Alibaba之整合gateway(包括配置详解以及各种坑)
    100
  • 3
    【九】SpringCloud Alibaba之整合Sentinel(实现热点控制)
    44
  • 4
    【八】SpringCloud Alibaba之整合Sentinel(实现流量控制3)
    41
  • 5
    【七】SpringCloud Alibaba之整合Sentinel(实现流量控制2)
    42
  • 6
    【六】SpringCloud Alibaba之整合Sentinel(实现流量控制)
    60
  • 7
    【五】SpringCloud Alibaba之整合Dubbo(实现远程调用)
    82
  • 8
    【四】SpringCloud Alibaba之重构Maven结构
    47
  • 9
    【二】SpringCloud Alibaba之Nacos整合篇(配置负载均衡)
    429
  • 10
    【一】SpringCloud Alibaba之Nacos整合篇(作为注册中心)
    282
  • 相关课程

    更多
  • 微服务+全栈在线教育实战项目演练(SpringCloud Alibaba+SpringBoot)
  • MyBatis持久层框架入门
  • Spring Boot 2.5.x开发实战
  • 5天实战Spring Boot 2.5
  • SpringBoot快速掌握 - 高级应用
  • SpringMVC框架入门
  • 相关电子书

    更多
  • 搭建基于SpringCloud的微服务应用
  • Java Spring Boot开发实战系列课程【第6讲】:Spring Boot 2.0实战MyBatis与优化(Java面试题)
  • Java Spring Boot开发实战系列课程【第15讲】:Spring Boot 2.0 API与Spring REST Docs实战
  • 下一篇
    2024年阿里云免费云服务器及学生云服务器申请教程参考

    深圳SEO优化公司上饶企业网站制作巴中网站搭建推荐衡水网站关键词优化推荐新乡网站排名优化报价阳江百搜标王推荐武威网站改版公司怒江网页设计推荐同乐网站推广方案价格滨州SEO按天扣费公司福田seo报价蚌埠网站优化哪家好昌吉网站推广哪家好塔城外贸网站制作哪家好福田网页制作推荐广州网站设计模板报价霍邱关键词按天扣费多少钱爱联网站搭建仙桃网站推广工具报价福州模板网站建设推荐黄南模板网站建设湘西阿里店铺托管报价三亚建网站推荐临夏建网站报价爱联百度爱采购咸宁企业网站改版推荐塘坑百搜标王滨州网站优化排名哪家好鄂州推广网站罗湖英文网站建设哪家好宁德百姓网标王推广多少钱歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

    深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化