Java + mybatis 分页查询后台实现(三层实现全部过程)

1:java分页查询后台实现的基本过程

注意:实现原理:了解一个sql语句

select * from coupon_card  LIMIT #{offset}, #{limit}
解释:offset :查询结果的索引值(默认从0开始),当offset=0时可省略offset
	 limit  :为查询结果返回的数量

本次测试coupon_card表有22条数据
例如: 索引为0 返回的数量为10 获取的就是coupon_card表的前1~10条数据
索引为10 返回的数量为10 获取的就是coupon_card表的11~20条数据
索引为20 返回的数量为10 获取的就是coupon_card表的21~30条数据

controller

@GetMapping("/coupon/ceshifenye")
    public Result<?> getCeShiFenYe(@RequestParam(value = "pageNo", defaultValue = "0") Integer pageNo,
                                   @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize){
        CouponPageBO result=couponService.getCeShiFenyePage(pageNo,pageSize);
        IPage ipage=new Page<>();
        ipage.setTotal(result.getTotal());//总共有多少条数据
        ipage.setSize(pageSize);//每页大小(也就是每页最多多少条数据)
        ipage.setRecords(result.getList());//分页的当前页数据
        ipage.setCurrent(pageNo);//分页的当前页页码
        return Result.ok(ipage);
    }

service(接口层)

CouponPageBO getCeShiFenyePage(Integer pageNo, Integer pageSize);

ServiceImpl(实现类)

@Override
    public CouponPageBO getCeShiFenyePage(Integer pageNo, Integer pageSize) {
        CouponPageBO couponPageBO = new CouponPageBO();
        //查询分页数据
        int offert=(pageNo - 1) * pageSize;
        couponPageBO.setList(couponCardMapper.getFenYeShuJu(offert,pageSize));
        //查询分页总数据数
        couponPageBO.setTotal(couponCardMapper.getFenYeZongTiaoShu());
        return couponPageBO;
    }

Mapper

/**
     * 测试分页---查询分页数据
     * @param offert
     * @param pageSize
     * @return
     */
    List<CouponBO> getFenYeShuJu(@Param("offset") int offert,
                                 @Param("limit") Integer pageSize);

    /**
     * 测试分页---查询分页总数
     * @return
     */
    Integer getFenYeZongTiaoShu();

xml

<!--测试分页查询-查询分页数据-->
    <select id="getFenYeShuJu" resultType="org.mall.modules.pojo.promotion.bo.CouponBO">
        select
       *
        from coupon_card
        LIMIT #{offset}, #{limit}
    </select>
    <!-- 测试分页查询-查询分页总数-->
    <select id="getFenYeZongTiaoShu" resultType="Integer">
        select
        COUNT(1)
        FROM coupon_card
    </select>

使用的工具类

IPage

/*
 * Copyright (c) 2011-2020, baomidou ([email protected]).
 * <p>
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * <p>
 * https://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.baomidou.mybatisplus.core.metadata;

import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.function.Function;

import static java.util.stream.Collectors.toList;

/**
 * 分页 Page 对象接口
 *
 * @author hubin
 * @since 2018-06-09
 */
public interface IPage<T> extends Serializable {

    /**
     * 降序字段数组
     *
     * @return order by desc 的字段数组
     * @see #orders()
     */
    @Deprecated
    default String[] descs() {
        return null;
    }

    /**
     * 升序字段数组
     *
     * @return order by asc 的字段数组
     * @see #orders()
     */
    @Deprecated
    default String[] ascs() {
        return null;
    }

    /**
     * 获取排序信息,排序的字段和正反序
     *
     * @return 排序信息
     */
    List<OrderItem> orders();

    /**
     * KEY/VALUE 条件
     *
     * @return ignore
     */
    default Map<Object, Object> condition() {
        return null;
    }

    /**
     * 自动优化 COUNT SQL【 默认:true 】
     *
     * @return true 是 / false 否
     */
    default boolean optimizeCountSql() {
        return true;
    }

    /**
     * 进行 count 查询 【 默认: true 】
     *
     * @return true 是 / false 否
     */
    default boolean isSearchCount() {
        return true;
    }

    /**
     * 计算当前分页偏移量
     */
    default long offset() {
        return getCurrent() > 0 ? (getCurrent() - 1) * getSize() : 0;
    }

    /**
     * 当前分页总页数
     */
    default long getPages() {
        if (getSize() == 0) {
            return 0L;
        }
        long pages = getTotal() / getSize();
        if (getTotal() % getSize() != 0) {
            pages++;
        }
        return pages;
    }

    /**
     * 内部什么也不干
     * <p>只是为了 json 反序列化时不报错</p>
     */
    default IPage<T> setPages(long pages) {
        // to do nothing
        return this;
    }

    /**
     * 分页记录列表
     *
     * @return 分页对象记录列表
     */
    List<T> getRecords();

    /**
     * 设置分页记录列表
     */
    IPage<T> setRecords(List<T> records);

    /**
     * 当前满足条件总行数
     *
     * @return 总条数
     */
    long getTotal();

    /**
     * 设置当前满足条件总行数
     */
    IPage<T> setTotal(long total);

    /**
     * 当前分页总页数
     *
     * @return 总页数
     */
    long getSize();

    /**
     * 设置当前分页总页数
     */
    IPage<T> setSize(long size);

    /**
     * 当前页,默认 1
     *
     * @return 当前页
     */
    long getCurrent();

    /**
     * 设置当前页
     */
    IPage<T> setCurrent(long current);

    /**
     * IPage 的泛型转换
     *
     * @param mapper 转换函数
     * @param <R>    转换后的泛型
     * @return 转换泛型后的 IPage
     */
    @SuppressWarnings("unchecked")
    default <R> IPage<R> convert(Function<? super T, ? extends R> mapper) {
        List<R> collect = this.getRecords().stream().map(mapper).collect(toList());
        return ((IPage<R>) this).setRecords(collect);
    }
}

使用的返回结果封装类

package org.mall.common.api.vo;

import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.mall.common.constant.CommonConstant;
import lombok.Data;


@Data
@ApiModel(value="接口返回对象", description="接口返回对象")
public class Result<T> implements Serializable {

	private static final long serialVersionUID = 1L;

	/**
	 * 成功标志
	 */
	@ApiModelProperty(value = "成功标志")
	private boolean success = true;

	/**
	 * 返回处理消息
	 */
	@ApiModelProperty(value = "返回处理消息")
	private String message = "操作成功!";

	/**
	 * 返回代码
	 */
	@ApiModelProperty(value = "返回代码")
	private Integer code = 0;
	
	/**
	 * 返回数据对象 data
	 */
	@ApiModelProperty(value = "返回数据对象")
	private T result;
	
	/**
	 * 时间戳
	 */
	@ApiModelProperty(value = "时间戳")
	private long timestamp = System.currentTimeMillis();

	public Result() {
		
	}
	
	public Result<T> error500(String message) {
		this.message = message;
		this.code = CommonConstant.SC_INTERNAL_SERVER_ERROR_500;
		this.success = false;
		return this;
	}
	
	public Result<T> success(String message) {
		this.message = message;
		this.code = CommonConstant.SC_OK_200;
		this.success = true;
		return this;
	}
	
	
	public static Result<Object> ok() {
		Result<Object> r = new Result<Object>();
		r.setSuccess(true);
		r.setCode(CommonConstant.SC_OK_200);
		r.setMessage("成功");
		return r;
	}
	
	public static Result<Object> ok(String msg) {
		Result<Object> r = new Result<Object>();
		r.setSuccess(true);
		r.setCode(CommonConstant.SC_OK_200);
		r.setMessage(msg);
		return r;
	}
	
	public static Result<Object> ok(Object data) {
		Result<Object> r = new Result<Object>();
		r.setSuccess(true);
		r.setCode(CommonConstant.SC_OK_200);
		r.setResult(data);
		return r;
	}
	
	public static Result<Object> error(String msg) {
		return error(CommonConstant.SC_INTERNAL_SERVER_ERROR_500, msg);
	}
	
	public static Result<Object> error(int code, String msg) {
		Result<Object> r = new Result<Object>();
		r.setCode(code);
		r.setMessage(msg);
		r.setSuccess(false);
		return r;
	}
	
	/**
	 * 无权限访问返回结果
	 */
	public static Result<Object> noauth(String msg) {
		return error(CommonConstant.SC_JEECG_NO_AUTHZ, msg);
	}
}

后台返回结果

在这里插入图片描述

前端测试数据展示

在这里插入图片描述

用到的两个实体类

CouponPageBO

package org.mall.modules.pojo.promotion.bo;

import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.List;


@Data
@Accessors(chain = true)
public class CouponPageBO implements Serializable {

    /**
     * 数据 数组
     */
    private List<CouponBO> list;
    /**
     * 总量
     */
    private Integer total;

}

CouponBO

package org.mall.modules.pojo.promotion.bo;

import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

/**
 * @Description: coupon_card
 * @Date:   2019-12-10
 * @Version: V1.0
 */
@Data
@TableName("coupon_card")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="coupon_card对象", description="coupon_card")
public class CouponBO {
    
	/**创建时间*/
	private java.util.Date createTime;

	/**优惠劵编号*/
	private Integer id;
	/**是否删除(0:未删除,1:已删除)*/
	private Integer isDelete;
	/**折扣*/

	private Integer percentOff;
	/**优惠类型
     *
     * 1-代金卷
     * 2-折扣卷*/

	private Integer preferentialType;
	/**是否设置满多少金额可用,单位:分
     *
     * 0-不限制
     * 大于0-多少金额可用*/

	private Integer priceAvailable;
	/**优惠金额,单位:分。*/

	private Integer priceOff;
	/**商店id*/

	private String shopId;
	/**优惠码状态
     *
     * 1-未使用
     * 2-已使用
     * 3-已失效*/

	private Integer status;
	/**领取类型
     *
     * 1 - 用户主动领取
     * 2 - 后台自动发放*/

	private Integer takeType;
	/**优惠劵(码)分组编号,{@link } 的 id*/

	private Integer templateId;
	/**标题*/

	private String title;
	/**最后更新时间*/

	private java.util.Date updateTime;
	/**使用时间*/
	private java.util.Date usedTime;
	/**用户编号*/
	private String userId;
	/**生效结束时间*/

	private java.util.Date validEndTime;
	/**生效开始时间*/
	private java.util.Date validStartTime;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章