springboot 实现mybatis 分页

在学习jsp的时候,我用到了分页,那时候分页对于我来说很难,调试了大半天,不是这错就是那错,如今学了mybatis 和他的插件mybatis-pagehelper觉得分页简单了。

耐心看完,最后有完整的使用案例

1. 引入分页插件的依赖:

<!--pagehelper -->
< dependency >
< groupId > com.github.pagehelper </ groupId >
< artifactId > pagehelper-spring-boot-starter </ artifactId >
< version > 1.2.12 </ version >
</ dependency >

2.在.yml文件中添加:

# 分页插件配置
  pagehelper:
    helperDialect: mysql
    supportMethodsArguments: true  
3. 使用分页插件,在查询前使用分页插件,原理:统一拦截 sql ,为其提供分页功能:
 
/**
* page: 第几页
* pageSize: 每页显示条数
* 这两个参数都是由前端传来
*/
PageHelper . startPage ( page , pageSize );
 
 
 
4. 分页数据封装到 PagedGridResult.java 传给前端( PagedGridResult  是自定义的,但也是通用的,会提供 ):
 
PageInfo <?> pageList = new PageInfo <> ( list );
PagedGridResult grid = new PagedGridResult ();
grid . setPage ( page );  // 当前页数
grid . setRows ( list ); //这个list是分页后的数据,是每行的数据
grid . setTotal ( pageList . getPages ());
grid . setRecords ( pageList . getTotal ());
 
 
/*****
     看到4 中的代码你可能会迷:
    1.PageInfo中的 total  表示: 总记录数  ,而 他的 records才 表示:总记录数
    2.PageInfo 中的 page 表示:  总页数,而  PagedGridResult  中的 total 表示 总页数
*/
 
==================================================================
 
5.  PagedGridResult  类:
/**
 * 
 * @Title: PagedGridResult.java
 * @Package com.imooc.utils
 * @Description: 用来返回分页Grid的数据格式
 * Copyright: Copyright (c) 2019
 */
public class PagedGridResult {
   
   private int page;        // 当前页数
   private int total;       // 总页数 
   private long records;     // 总记录数
   private List<?> rows;     // 每行显示的内容

   public int getPage() {
      return page;
   }
   public void setPage(int page) {
      this.page = page;
   }
   public int getTotal() {
      return total;
   }
   public void setTotal(int total) {
      this.total = total;
   }
   public long getRecords() {
      return records;
   }
   public void setRecords(long records) {
      this.records = records;
   }
   public List<?> getRows() {
      return rows;
   }
   public void setRows(List<?> rows) {
      this.rows = rows;
   }
}

========================================================================

6. 使用案例:

@Transactional(propagation = Propagation.SUPPORTS)
@Override
public PagedGridResult queryPagedComments(String itemId, Integer level,
                                              Integer page,Integer pageSize) {

    Map<String,Object>map =new HashMap<>();
    map.put("itemId",itemId);
    map.put("level",level);

    /*** page: 第几页 * pageSize: 每页显示条数 */
    PageHelper.startPage(page, pageSize);
    List<ItemCommentVO> list=itemsMapperCustom.queryItemComments(map);
    
    PageInfo<?> pageList = new PageInfo<>(list); //<>中就是 ? ,不是乱码,可以传任何类
    PagedGridResult grid = new PagedGridResult();
    grid.setPage(page);
    grid.setRows(list);
    grid.setTotal(pageList.getPages());
    grid.setRecords(pageList.getTotal());

    return grid;
}

================================================================================

7.如果你有很多地方要用到分页,也可以将其抽取出来:

@Transactional(propagation = Propagation.SUPPORTS)
@Override
public PagedGridResult queryPagedComments(String itemId, Integer level,
                                              Integer page,Integer pageSize) {

    Map<String,Object>map =new HashMap<>();
    map.put("itemId",itemId);
    map.put("level",level);

    /*** page: 第几页 * pageSize: 每页显示条数 */
    PageHelper.startPage(page, pageSize);
    List<ItemCommentVO> list=itemsMapperCustom.queryItemComments(map);
    
    return setterPagedGrid(list,page);
}


private PagedGridResult setterPagedGrid(List<?>list,Integer page){
    PageInfo<?> pageList = new PageInfo<>(list);
    PagedGridResult grid = new PagedGridResult();
    grid.setPage(page);
    grid.setRows(list);
    grid.setTotal(pageList.getPages());
    grid.setRecords(pageList.getTotal());
    return grid;
}

 pageHelper 不支持 嵌套分页,会出现一些问题:

关于订单有三张表:订单表,订单状态表,订单关联商品表

比如说:查询订单信息,一个订单对应多个商品,这种情况:

不用分页一般是用一条sql语句:

od.id as orderId,
od.created_time as createdTime,
od.pay_method as payMethod,
od.real_pay_amount as realPayAmount,
od.post_amount as postAmount,
os.order_status as orderStatus,
oi.item_id as itemId,
oi.item_name as itemName,
oi.item_img as itemImg,
oi.item_spec_name as itemSpecName,
oi.buy_counts as buyCounts,
oi.price as price
FROM
orders od
LEFT JOIN
order_status os
on od.id = os.order_id
LEFT JOIN
order_items oi
ON od.id = oi.order_id
WHERE
od.user_id = #{paramsMap.userId}
AND
od.is_delete = 0
<if test="paramsMap.orderStatus != null">
    and os.order_status = #{paramsMap.orderStatus}
</if>
ORDER BY
od.updated_time ASC

但是对于分页就不行了,

如何解决呢?答:先查询订单信息(order 和order_status先关联),再根据订单信息中的orderId 来查询对应的商品关联信息

resultMap中的collection中配置的select传递条件

<resultMap id="myOrdersVO" type="com.imooc.pojo.vo.MyOrdersVO">
  <id column="orderId" property="orderId"/>
  <result column="createdTime" property="createdTime"/>
  <result column="payMethod" property="payMethod"/>
  <result column="realPayAmount" property="realPayAmount"/>
    <result column="postAmount" property="postAmount"/>
    <result column="orderStatus" property="orderStatus"/>
    <result column="isComment" property="isComment"/>

  <collection property="subOrderItemList"
              select="getSubItems"
              column="orderId"
              ofType="com.imooc.pojo.vo.MySubOrderItemVO">
    <result column="itemId" property="itemId"/>
    <result column="itemName" property="itemName"/>
    <result column="itemImg" property="itemImg"/>
      <result column="itemSpecId" property="itemSpecId"/>
      <result column="itemSpecName" property="itemSpecName"/>
      <result column="buyCounts" property="buyCounts"/>
      <result column="price" property="price"/>
  </collection>
</resultMap>

============================================================

<select id="queryMyOrders" resultMap="myOrdersVO" parameterType="Map">
  SELECT
      od.id as orderId,
      od.created_time as createdTime,
      od.pay_method as payMethod,
      od.real_pay_amount as realPayAmount,
      od.post_amount as postAmount,
      os.order_status as orderStatus,
      od.is_comment as isComment
  FROM
      orders od
  LEFT JOIN
      order_status os
  on od.id = os.order_id
  WHERE
      od.user_id = #{paramsMap.userId}
  AND
      od.is_delete = 0
      <if test="paramsMap.orderStatus != null">
        and os.order_status = #{paramsMap.orderStatus}
      </if>
  ORDER BY
      od.updated_time ASC
</select>
  
  ========================================================
  <select id="getSubItems" parameterType="String" resultType="com.imooc.pojo.vo.MySubOrderItemVO">

    select
      oi.item_id as itemId,
      oi.item_name as itemName,
      oi.item_img as itemImg,
      oi.item_spec_name as itemSpecName,
      oi.buy_counts as buyCounts,
      oi.price as price
    from
      order_items oi
    where
      oi.order_id = #{orderId}

  </select>
发布了55 篇原创文章 · 获赞 5 · 访问量 6065

猜你喜欢

转载自blog.csdn.net/weixin_42528855/article/details/103542608