TK-MyBatis 分页查询的具体使用

记 tkMybatis 查询出一个  List集合 该集合已经做好了一层分页Page封装 即查询出的list 使用类型判断 instanceof Page 为true
但是,中途不明白这是一个带分页的集合,把查询出的结果集又做了一层封装 需要返回的对象类型为GoodsCategoryDTO,代码如下: 

   // 商品集合
             List<GoodsCategoryDTO> goodsCategorys  = goodsLists.stream().map(x->{
            GoodsCategoryDTO goodsDTO = new GoodsCategoryDTO();
            goodsDTO.setGoodsId(x.getGoodsId());
            // 价格,名字
            if(x.getPriceInfo().getPriceValue() == null && x.getPriceInfo().getPriceType() == null){
                goodsDTO.setOriginalPrice(x.getPriceInfo().getOriginalPrice());
            }else {
                goodsDTO.setOriginalPrice(x.getPriceInfo().getOriginalPrice());
                goodsDTO.setPrice(x.getPriceInfo().getPriceValue() == null ?  new BigDecimal(""): x.getPriceInfo().getPriceValue());
                goodsDTO.setGoodsLable(x.getPriceInfo().getPriceName());
            }
            goodsDTO.setTitle(x.getGoodsName());
            goodsDTO.setSubTitle(x.getGoodsSubname());
            goodsDTO.setImg(x.getGoodsImage());
            goodsDTO.setSkuId(x.getSkuId());
            return goodsDTO;
        }).collect(Collectors.toList());
         return goodsCategorys;

从字面意思上理解 没有问题 返回一个需要出里商品的集合 在controller里面做分页的时候new 一个PageInfo 把该集合传入 代码如下:

 PageHelper.startPage(goodsParam.getPage(), goodsParam.getSize());  //  设置分页值
        // 返回值
         List<GoodsCategoryDTO> goodsCategoryDTO = goodsService.getGoodsCategoryInfo(goodsParam);
         PageInfo<GoodsCategoryDTO> pageInfo = new PageInfo<>(goodsCategoryDTO);
         return ResultGenerator.genSuccessResult("返回数据成功", pageInfo);

但是万万没有想到,在创建分页对象PageInfo过程中 goodsCategoryDTO这个集合来判断分页形式,然后根据page 获取当前页pageNum和pageSize和pageTotal,但是如果goodsCategoryDTO 使用instanceof 判断一直是Collection 无法分页。

public PageInfo(List<T> list, int navigatePages) {
        if (list instanceof Page) {
            Page page = (Page) list;
            this.pageNum = page.getPageNum();
            this.pageSize = page.getPageSize();

            this.pages = page.getPages();
            this.list = page;
            this.size = page.size();
            this.total = page.getTotal();
            //由于结果是>startRow的,所以实际的需要+1
            if (this.size == 0) {
                this.startRow = 0;
                this.endRow = 0;
            } else {
                this.startRow = page.getStartRow() + 1;
                //计算实际的endRow(最后一页的时候特殊)
                this.endRow = this.startRow - 1 + this.size;
            }
        } else if (list instanceof Collection) {
            this.pageNum = 1;
            this.pageSize = list.size();

            this.pages = this.pageSize > 0 ? 1 : 0;
            this.list = list;
            this.size = list.size();
            this.total = list.size();
            this.startRow = 0;
            this.endRow = list.size() > 0 ? list.size() - 1 : 0;
        }
        if (list instanceof Collection) {
            this.navigatePages = navigatePages;
            //计算导航页
            calcNavigatepageNums();
            //计算前后页,第一页,最后一页
            calcPage();
            //判断页面边界
            judgePageBoudary();
        }
    }

想了一下 使用如下的解决办法可能会好一点 直接new 一个新的Page对象 获取新的pageNum pageSize Total 然后赋值给该对象 ,然后遍历集合中goodsList 然后做二次封装 添加到 page集合 最后返回该集合即可。

 /**
     * 查询分类商品信息
     * @param goodsParam
     * @return
     */
    public List<GoodsCategoryDTO> getGoodsCategoryInfo (GoodsParam goodsParam){

         // 查询出已经实现和封装好的Page的list
         List<GoodsDTO> goodsLists = queryGoodsByCat(goodsParam);

         if (goodsLists instanceof Page<?>) {
             Page<GoodsDTO> goodsPage = (Page<GoodsDTO>) goodsLists;
             return new Page<GoodsCategoryDTO>() {{
                 this.setPageNum(goodsPage.getPageNum());
                 this.setPageSize(goodsPage.getPageSize());
                 this.setTotal(goodsPage.getTotal());
                 this.setPages(goodsPage.getPages());
                 this.addAll(goodsPage.stream().map(goods -> new GoodsCategoryDTO() {{
                     this.setGoodsId(goods.getGoodsId());
                     this.setTitle(goods.getGoodsName());
                     this.setSubTitle(goods.getGoodsSubname());
                     this.setImg(goods.getGoodsImage());
                     this.setSkuId(goods.getSkuId());
                     if(goods.getPriceInfo().getPriceValue() == null && goods.getPriceInfo().getPriceType() == null){
                         this.setOriginalPrice(goods.getPriceInfo().getOriginalPrice());
                     }else {
                         this.setOriginalPrice(goods.getPriceInfo().getOriginalPrice());
                         this.setPrice(goods.getPriceInfo().getPriceValue() == null ?  new BigDecimal(""): goods.getPriceInfo().getPriceValue());
                         this.setGoodsLable(goods.getPriceInfo().getPriceName());
                     }
                 }}).collect(Collectors.toList()));
             }};
         } else {
             throw new IllegalStateException("goods list must be instance of Page");
         }
    }

到此这篇关于TK-MyBatis 分页查询的具体使用的文章就介绍到这了,更多相关TK-MyBatis 分页查询内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • tk-mybatis 的使用方法详解

    tkmybatis是在mybatis框架的基础上提供了很多工具,让开发更加高效,下面来看看这个框架的基本使用,后面会对相关源码进行分析,感兴趣的同学可以看一下,挺不错的一个工具 实现对员工表的增删改查的代码  java的dao层接口 public interface WorkerMapper extends Mapper<Worker> { } 实体对象 @Table(name = "worker") public class Worker { @Id @Generated

  • 解决tk.mybatis中写自定义的mapper的问题

    问题 使用tk.mybatis能满足大多数操作,但是想添加自己的查询方法时候今天遇到了坑,总结一下 官方教程 大致分两种 1. 使用纯接口注解方式时 在mapper接口中自定义方法上添加如@Select,@insert类似的注释,里边写相应的sql语句,如下 import org.apache.ibatis.annotations.Select; import tk.mybatis.mapper.common.Mapper; public interface CountryMapper exte

  • tk.mybatis如何扩展自己的通用mapper

    tk.mybatis扩展自己的通用mapper 目的:tk.mybatis 提供的通用mapper,虽然使用方便,不过在有些sql还是不能满足我们的需要的,而且我们希望对于deleted语句进行管控(因为通用mapper提供的都是物理删除,有时我们对一些敏感数据只能进行逻辑删除),因此我们将基于原有的通用mapper进行自己的扩展 1 jar引入 <!-- 非springboot --> <dependency> <groupId>tk.mybatis</grou

  • tk.mybatis扩展通用接口使用详解

    一.tk.mybatis已经为我们封装好了许多拆箱即用的通用mapper,但在实际的项目开发中想必不少小伙伴在数据库设计中都会采用逻辑删除这种方案,再去使用通用的mapper接口就不行了. 这时候就需要我们封装一些扩展的通用Mapper接口. 二.项目中提供了大量现成的方法,这些方法可以作为扩展时的参考. 例如 selectAll 方法. 首先定义接口: @RegisterMapper public interface SelectAllMapper<T> { /** * 查询全部结果 * *

  • TKmybatis的框架介绍和原理解析

    一.TkMybatis Tkmybatis 是基于 Mybatis 框架开发的一个工具,通过调用它提供的方法实现对单表的数据操作,不需要写任何 sql 语句,这极大地提高了项目开发效率. 二.怎么用? 1. 引用 在 pom.xml 中引入 tk.mybatis 的引用. <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifact

  • TKMybatis的介绍和使用详解

    目录 一.什么是 TKMybatis 二.TKMybatis 使用 2.1 Springboot 项目中加入依赖 2.2 使用讲解 2.3 实际案例 三.扩展介绍 泛型(实体类)的类型必须符合要求 所有的mapper继承此类将具有以下通用方法 一.什么是 TKMybatis TKMybatis 是基于 Mybatis 框架开发的一个工具,内部实现了对单表的基本数据操作,只需要简单继承 TKMybatis 提供的接口,就能够实现无需编写任何 sql 即能完成单表操作. 二.TKMybatis 使用

  • Java Fluent Mybatis 分页查询与sql日志输出详解流程篇

    目录 前言 准备数据 Sql日志配置 官方分页查询 PageHelper分页查询 总结 前言 接着我上一章:Java Fluent Mybatis 项目工程化与常规操作详解流程篇 下 上一章我把项目做了一部分工程化包装,主要还是想要之后的调试能够方便一些.那么这一章接着上一章的内容,做一下查询分页,并且将每次请求所调用的sql语句写在日志里面,便于我们观察定位问题.代码之后还是会上传到github. GitHub代码仓库地址:GitHub仓库 准备数据 简单的准备了一些数据. Sql日志配置 之

  • Mybatis分页查询的实现(Rowbounds和PageHelper)

    我们实现查询除了 @org.junit.Test public void test02(){ SqlSession session = MybatisUtil.getSession(); UserDao mapper = session.getMapper(UserDao.class); List<User> allUser = mapper.getAllUser(); session.close(); for (User user : allUser) { System.out.printl

  • Java Fluent Mybatis 聚合查询与apply方法详解流程篇

    前言 接着上一篇文章:Java Fluent Mybatis 分页查询与sql日志输出详解流程篇 我把分页已经调整好了,现在实验一下官方给出的聚合查询方法. GitHub代码仓库:GitHub仓库 数据准备 为了聚合查询的条件,添加了几条数据. MIN 我们试着获取最小的年龄. 方法实现 @Override public Integer getAgeMin() { Map<String, Object> result = testFluentMybatisMapper .findOneMap(

  • Mybatis实现增删改查及分页查询的方法

    MyBatis的前身就是iBatis.是一个数据持久层(ORM)框架. MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持 久层框架.MyBatis消除了几乎所有的JDBC 代码和参数的手工 设置以及结果集的检索.MyBatis使用简单的XML或注解用于 配置和原始映射,将接口和Java 的POJOs(Plan Old Java Objects,普通的Java 对象)映射成数据库中的记录.每个 MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个 SqlS

  • Oracle使用MyBatis中RowBounds实现分页查询功能

    Oracle中分页查询因为存在伪列rownum,sql语句写起来较为复杂,现在介绍一种通过使用MyBatis中的RowBounds进行分页查询,非常方便. 使用MyBatis中的RowBounds进行分页查询时,不需要在 sql 语句中写 offset,limit,mybatis 会自动拼接 分页sql ,添加 offset,limit,实现自动分页. 需要前台传递参数currentPage和pageSize两个参数,分别是当前页和每页数量,controller层把参数传递给service层即可

  • MyBatis Plus 实现多表分页查询功能的示例代码

    在Mybatis Plus 中,虽然IService 接口帮我们定义了很多常用的方法,但这些都是 T 对象有用,如果涉及到 多表的查询,还是需要自定义Vo 对象和自己编写sql 语句,Mybatis Plus提供了一个Page 对象,查询是需要设置其中的 size 字段 和 current 字段的值 一.分页配置 可以直接使用selectPage这样的分页,但返回的数据确实是分页后的数据,但在控制台打印的SQL语句其实并没有真正的物理分页,而是通过缓存来获得全部数据中再进行的分页,这样对于大数据

  • mybatis模糊查询、分页和别名配置的方法

    mybatis模糊查询(3种) 第一种 select * from user where username like "%" #{name} "%" 第二种 select * from user where username like "%${value}%" 第三种 <!--concat拼接字符串 mysql独有的函数--> select * from user where username like concat("%&

  • 最简单的MyBatis Plus的多表联接、分页查询实现方法

    一.前言 最近在加强 ITAEM 团队的一个 app 项目--学生教师学习交流平台 人员组成:安卓 + 前端 + 后台 后台 DAO 层借鉴了华工其他软件开发团队,使用了新颖强大的 MyBatisPlus 框架,里边有一个类似百度贴吧的发帖子的功能: 而如果设计表,应为 帖子表 t_post - id - title 标题 - content 内容 - xx - user_id 用户外键 用户表 t_user + id + name 帖子发起者名字 + xx 示例图中红色框中的内容为 t_use

  • 解决mybatis plus 一对多分页查询问题

    最近用mybatis plus做项目,单表的增删改查都正常,做到 1对多表的分页时,用resultMap返回的时候发现返回的记录和总数对不上 返回的记录是 一 表的,二返回的总数是 多 表 查了一下,这个或者是PLUS的bug 大概的解决办法如下图:用collection,传参用column,我这里用了一个小技巧, 把外面传入的参数,作为主表的column传入到从表. 这里没找到其他方法,有其他方法可以评论告诉我 补充知识:解决Mybatis-plus利用collection查询一对多分页数据的

  • 解决mybatis plus 分页查询有条数,total和pages都是零的问题

    一. 问题还原 1. Controller代码部分 Page<FixedAssetsEntity> pageForPlus = getPage(); Page<FixedAssetsEntity> fixedAssetsEntityPage = fixedAssetsService.selectPage(pageForPlus); 2.spring-mybatis.xml中的sqlSessionFactory配置 <bean id="sqlSessionFactor

随机推荐