springboot mybatis 写分页

本文详细介绍了如何在SpringBoot项目中结合Mybatis进行分页查询的步骤,包括创建分页工具类、定义响应类、实体类继承PagingDomain、数据层和业务层的分页实现、控制器处理及XML文件配置,最后提及前端使用vue.js传递分页参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

步骤 1: 分页工具类

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.mideaframework.core.bean;

import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class PagingDomain  {
    private Integer pageNo;
    private Integer start = 0;
    private Integer pageSize = 30;
    private Date startTime;
    private Date endTime;
    private String orderBy = "1";
    private String orderByType = "asc";
    private String asc = " asc";
    private Map<String, List> dataMap = new HashMap();

    public PagingDomain() {
    }
-----添加get  set  方法
}

返回客户端响应类工具

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.mideaframework.core.web;

import com.google.common.collect.Lists;
import java.io.Serializable;
import java.util.List;

public class PageResponse<T> implements Serializable {
    private static final long serialVersionUID = -2103014265407834780L;
    public List<T> list;
    public Integer totalCount;
    public Integer totalPage;
    public Integer pageNo;
    public Integer pageSize;
    public Integer offset;

    public PageResponse() {
        this.list = Lists.newArrayList();
        this.totalCount = 0;
        this.totalPage = 0;
        this.pageNo = 1;
        this.pageSize = 30;
        this.offset = 0;
    }

    public List<T> getList() {
        return this.list;
    }

    public void setList(List<T> list) {
        this.list = list;
    }

    public Integer getTotalCount() {
        return this.totalCount;
    }

    public void setTotalCount(Integer totalCount) {
        this.totalCount = totalCount;
    }

    public Integer getTotalPage() {
        return this.totalPage;
    }

    public void setTotalPage(Integer totalPage) {
        this.totalPage = totalPage;
    }

    public Integer getPageNo() {
        return this.pageNo;
    }

    public void setPageNo(Integer pageNo) {
        this.pageNo = pageNo;
    }

    public Integer getPageSize() {
        return this.pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public Integer getOffset() {
        return this.offset;
    }

    public void setOffset(Integer offset) {
        this.offset = offset;
    }

    public PageResponse(Integer pageNo, Integer pageSize, Integer totalCount, List<T> list) {
        this.list = Lists.newArrayList();
        this.totalCount = 0;
        this.totalPage = 0;
        this.pageNo = 1;
        this.pageSize = 30;
        this.offset = 0;
        this.init(pageNo, pageSize, totalCount, list);
    }

    public PageResponse(Integer pageNo, Integer pageSize, Integer totalCount) {
        this(pageNo, pageSize, totalCount, (List)null);
    }

    public PageResponse(Integer pageNo, Integer pageSize) {
        this(pageNo, pageSize, (Integer)null);
    }

    public void init(Integer pageNo, Integer pageSize, Integer totalCount, List<T> list) {
        if (pageNo != null) {
            this.pageNo = pageNo;
        }

        if (pageSize != null) {
            this.pageSize = pageSize;
        }

        if (this.pageNo > 0) {
            this.offset = this.pageSize * this.pageNo;
        }

        if (totalCount != null) {
            this.totalCount = totalCount;
            this.totalPage = this.totalCount % pageSize > 0 ? this.totalCount / pageSize + 1 : this.totalCount / pageSize;
        }

        if (list != null) {
            this.list = list;
        }

    }
}

步骤2:实体类继承  PagingDomain

public class ErpWorkOrder extends PagingDomain{}

步骤3 数据层 :

import com.midea.lmes.intelligent.logistics.domain.mes.base.entity.base.ErpWorkOrder;
import com.midea.lmes.intelligent.logistics.dto.mes.base.ErpWorkOrderDto;
import com.mideaframework.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface ErpWorkOrderMapper extends BaseMapper<ErpWorkOrder>{}

步骤4:业务层 使用分页

@Override
public PageResponse<ErpWorkOrder> selectErpWorkOrderPage(ErpWorkOrder erpWorkOrder) {
    PageResponse<ErpWorkOrder> pagingData = new PageResponse<ErpWorkOrder>();
    if (null == erpWorkOrder) {
        LOGGER.warn("select erpWorkOrder page, but erpWorkOrder is null...");
        return pagingData;
    }
    //设置工单状态 用于IN 关键字查询
    if(StringUtils.isNotEmpty(erpWorkOrder.getStatusTypeName())){
        String[] str=erpWorkOrder.getStatusTypeName().split(",");
        StringBuffer stringBuffer =new StringBuffer();
        String statusTypeName="";
        List<String> list =new ArrayList<String>();
        for (int i = 0; i <str.length ; i++) {
            statusTypeName=str[i];
            list.add(statusTypeName);
        }
        erpWorkOrder.setList(list);
    }
    List<ErpWorkOrder> erpWorkOrders = selectErpWorkOrderByIndex(erpWorkOrder);
    if(erpWorkOrders !=null && erpWorkOrders.size()>0){
        SysOrg sysOrg = new SysOrg();;
        for (int i = 0; i <erpWorkOrders.size() ; i++) {
            if(erpWorkOrders.get(i).getMoLine() !=null && erpWorkOrders.get(i).getOrgId() !=null){
                sysOrg.setInvOrgId(ValueUtil.toInt(erpWorkOrders.get(i).getOrgId()));
                sysOrg.setSourceSystemId(ValueUtil.toInt(erpWorkOrders.get(i).getMoLine()));
                List<SysOrg> listSysOrg =sysOrgClient.queryLineCodeByCodeAndOrgId(sysOrg);
                if(listSysOrg !=null && listSysOrg.size()>0){
                    for (int j = 0; j <listSysOrg.size() ; j++) {
                        if(listSysOrg.get(j).getSourceSystemId()!=null
                         && erpWorkOrders.get(i).getMoLine().equals(listSysOrg.get(j).getSourceSystemId())
                         && erpWorkOrders.get(i).getOrgId().equals(ValueUtil.toLong(listSysOrg.get(j).getInvOrgId()))){
                            erpWorkOrders.get(i).setMoLineCode(listSysOrg.get(j).getCode());
                        }
                    }
                }else{
                    LOGGER.info("=====select SysOrg page ======服务异常, but count {} == 0 ...", listSysOrg.size());
                    return pagingData;
                }
            }

        }
        pagingData.setList(erpWorkOrders);
        Integer queryCount = erpWorkOrderMapper.selectByIndexCount(erpWorkOrder);
        pagingData.setTotalCount(queryCount);
        if (null != queryCount && queryCount <= 0) {
            LOGGER.info("select erpWorkOrder page , but count {} == 0 ...", queryCount);
            return pagingData;
        }
    }
    return pagingData;
}

步骤5 控制层

/**
 * @return 查询集合
 */
 @PostMapping(value = "/fndContainerInvRelations/search")
 public JsonResponse search(@RequestBody FndContainerInvRelation fndContainerInvRelation,HttpServletRequest request) {
     RestDoing doing = jsonResponse -> {
        PageResponse<FndContainerInvRelation> PageResponse = fndContainerInvRelationServiceImpl.selectFndContainerInvRelationPage(fndContainerInvRelation);
        jsonResponse.data = PageResponse;
     };
    return doing.go(request, logger);

 }

返回客户端响应类

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.mideaframework.core.web;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.mideaframework.core.constants.BaseCodeEnum;
import com.mideaframework.core.exception.IBusinessException;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;

public class JsonResponse<T> implements Serializable {
    private static final long serialVersionUID = -6609499448346439617L;
    private String code;
    private String msg;
    private String timestamp;
    public T data;

    public JsonResponse() {
        this.code = BaseCodeEnum.SUCCESS.getCode();
        this.msg = BaseCodeEnum.SUCCESS.getMsg();
    }

    public JsonResponse(IBusinessException resultCodeConstant) {
        this.code = BaseCodeEnum.SUCCESS.getCode();
        this.msg = BaseCodeEnum.SUCCESS.getMsg();
        this.code = resultCodeConstant.getCode();
        this.msg = resultCodeConstant.getMsg();
    }

    public JsonResponse(String code, String msg) {
        this.code = BaseCodeEnum.SUCCESS.getCode();
        this.msg = BaseCodeEnum.SUCCESS.getMsg();
        this.code = code;
        this.msg = msg;
    }

    private void saveJsonResult(IBusinessException resultCodeConstant) {
        this.code = resultCodeConstant.getCode();
        this.msg = resultCodeConstant.getMsg();
    }

    public void errorParam(String msg, Logger log) {
        this.code = BaseCodeEnum.FAILED.getCode();
        this.msg = BaseCodeEnum.FAILED.getMsg() + msg;
        log.error("error code|{}|msg|{}|", this.code, msg);
    }

    public void errorParam(String code, String msg, Logger log) {
        this.custom(code, msg, log);
    }

    public void custom(String code, String msg, Logger log) {
        this.code = code;
        this.msg = msg;
        log.error("error code|{}|msg:{}", code, msg);
    }

    public void saveResult(String codeInput, Logger log) {
        this.saveResult(codeInput, (String)null, (Logger)null);
    }

    public void saveResult(String codeInput, String msg, Logger log) {
        byte var5 = -1;
        switch(codeInput.hashCode()) {
        case 48:
            if (codeInput.equals("0")) {
                var5 = 0;
            }
        default:
            switch(var5) {
            case 0:
                this.saveJsonResult(BaseCodeEnum.SUCCESS);
                break;
            default:
                this.saveJsonResult(BaseCodeEnum.FAILED);
            }

            if (StringUtils.isNotBlank(msg)) {
                this.setMsg(msg);
            }

            if (null != log) {
                log.error("error code:{}|msg:{}", this.code, msg);
            }

        }
    }

    public String getTimestamp() {
        return this.timestamp;
    }

    public void setTimestamp(String timestamp) {
        this.timestamp = timestamp;
    }

    public String getCode() {
        return this.code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return this.msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return this.data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public void go(Logger logger) {
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        StackTraceElement[] var3 = stackTrace;
        int var4 = stackTrace.length;

        for(int var5 = 0; var5 < var4; ++var5) {
            StackTraceElement s = var3[var5];
            logger.error(s.getClassName() + ",-" + s.getMethodName() + ":[ " + s.getLineNumber() + "]");
        }

    }

    public JsonResponse build(String code, String msg) {
        this.code = code;
        this.msg = msg;
        LocalDateTime arrivalDate = LocalDateTime.now();
        DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS");
        String timestamp = arrivalDate.format(format);
        this.timestamp = timestamp;
        return this;
    }

    public String toString() {
        return JSON.toJSONStringWithDateFormat(this, "yyyy-MM-dd HH:mm:ss", new SerializerFeature[0]);
    }

    public static JsonResponse<Object> success(Object data) {
        JsonResponse<Object> jsonResponse = new JsonResponse(BaseCodeEnum.SUCCESS);
        jsonResponse.setData(data);
        return jsonResponse;
    }

    public static JsonResponse<Object> fail(String msg) {
        JsonResponse<Object> jsonResponse = new JsonResponse(BaseCodeEnum.FAILED.getCode(), msg);
        return jsonResponse;
    }

    public static JsonResponse<Object> fail(String code, String msg) {
        JsonResponse<Object> jsonResponse = new JsonResponse(code, msg);
        return jsonResponse;
    }
}
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.mideaframework.core.web;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mideaframework.core.constants.BaseCodeEnum;
import com.mideaframework.core.exception.BusinessException;
import com.mideaframework.core.exception.CommonException;
import com.mideaframework.core.utils.SpringContextHolder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.MessageSource;
import org.springframework.transaction.NoTransactionException;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

@FunctionalInterface
public interface RestDoing<T> {
    Logger log = LoggerFactory.getLogger(RestDoing.class);
    String sqlReturnFormat = "======================>return data : |{}|";

    default JsonResponse<T> go(Logger log) {
        return this.invoke((Object)null, (Object)null, (HttpServletRequest)null, (ObjectMapper)null, log);
    }

    default JsonResponse<T> go(HttpServletRequest r, Logger log) {
        return this.invoke((Object)null, (Object)null, r, (ObjectMapper)null, log);
    }

    default JsonResponse<T> go(HttpServletRequest r, ObjectMapper objectMapper, Logger log) {
        return this.invoke((Object)null, (Object)null, r, objectMapper, log);
    }

    default JsonResponse<T> go(Object visitor, HttpServletRequest request, ObjectMapper objectMapper, Logger log) {
        return this.invoke((Object)null, visitor, request, objectMapper, log);
    }

    default JsonResponse<T> go(Object inputData, Object visitor, HttpServletRequest request, ObjectMapper objectMapper, Logger log) {
        return this.invoke(inputData, visitor, request, objectMapper, log);
    }

    default JsonResponse<T> invoke(Object inputData, Object visitor, HttpServletRequest request, ObjectMapper objectMapper, Logger log) {
        JsonResponse<T> jr = new JsonResponse();
        Object[] args = null;

        try {
            this.service(jr);
        } catch (CommonException var24) {
            log.error("throw CommonException{}|", var24);
            throw var24;
        } catch (BusinessException var25) {
            try {
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            } catch (NoTransactionException var23) {
                log.error("NoTransactionException happen|{}|", var25);
            }

            jr.errorParam(var25.getCode(), var25.getMessage(), log);
            args = var25.getArgs();
        } catch (Exception var26) {
            try {
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            } catch (NoTransactionException var22) {
                log.error("NoTransactionException happen|{}|", var26);
            }

            log.error("error happen|{}|", var26);
            jr.saveResult(BaseCodeEnum.FAILED.getCode(), log);
        } finally {
            this.showReturnData(jr, objectMapper, log);
        }

        LocalDateTime arrivalDate = LocalDateTime.now();
        DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
        String timestamp = arrivalDate.format(format);
        if (StringUtils.isBlank(jr.getMsg())) {
            try {
                MessageSource messageSource = (MessageSource)SpringContextHolder.getBean(MessageSource.class);
                Locale locale = Locale.SIMPLIFIED_CHINESE;
                String msg = messageSource.getMessage(jr.getCode(), args, locale);
                jr.setMsg(msg);
            } catch (Exception var21) {
                log.error("cannot find messageSource,error:{}", var21.getMessage());
            }
        }

        jr.setTimestamp(timestamp);
        return jr;
    }

    default void showReturnData(JsonResponse jr, ObjectMapper objectMapper, Logger log) {
        if (objectMapper != null) {
            try {
                String returnData = objectMapper.writeValueAsString(jr);
                log.warn("======================>return data : |{}|", returnData);
            } catch (JsonProcessingException var5) {
                log.error(var5.getMessage(), var5);
            }
        }

    }

    void service(JsonResponse<T> var1) throws Exception;
}

步骤6 xml 文件

<select id="selectByIndexCount" resultType="Integer">
    select count(t.id)
    from erp_work_order t
    <include refid="whereFieldsSql"/>
</select>

<select id="selectByIndex" resultType="com.midea.lmes.intelligent.logistics.domain.mes.base.entity.base.ErpWorkOrder">
    select
    <include refid="searchFieldsSql"/>
    from erp_work_order t
    <include refid="whereFieldsSql"/>
    limit #{start},#{pageSize}
</select>

前端传给后台 字段  vue.js 

{"pageNo":1,"pageSize":10}

 

# Spring Boot 集成 MyBatis, 分页插件 PageHelper, 通用 Mapper ## 项目依赖 ```xml <!--mybatis--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.1.1</version> </dependency> <!--mapper--> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>1.1.1</version> </dependency> <!--pagehelper--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.1.1</version> </dependency> ``` ## Spring DevTools 配置 在使用 DevTools 时,通用Mapper经常会出现 class x.x.A cannot be cast to x.x.A。 同一个类如果使用了不同的类加载器,就会产生这样的错误,所以解决方案就是让通用Mapper和实体类使用相同的类加载器即可。 DevTools 默认会对 IDE 中引入的所有项目使用 restart 类加载器,对于引入的 jar 包使用 base 类加载器,因此只要保证通用Mapper的jar包使用 restart 类加载器即可。 在 `src/main/resources` 中创建 META-INF 目录,在此目录下添加 spring-devtools.properties 配置,内容如下: ```properties restart.include.mapper=/mapper-[\\w-\\.]+jar restart.include.pagehelper=/pagehelper-[\\w-\\.]+jar ``` 使用这个配置后,就会使用 restart 类加载加载 include 进去的 jar 包。 ## 集成 MyBatis Generator 通过 Maven 插件集成的,所以运行插件使用下面的命令: >mvn mybatis-generator:generate Mybatis Geneator 详解: >http://blog.youkuaiyun.com/isea533/article/details/42102297 ## application.properties 配置 ```properties #mybatis mybatis.type-aliases-package=tk.mybatis.springboot.model mybatis.mapper-locations=classpath:mapper/*.xml #mapper #mappers 多个接口时逗号隔开 mapper.mappers=tk.mybatis.springboot.util.MyMapper mapper.not-empty=false mapper.identity=MYSQL #pagehelper pagehelper.helperDialect=mysql pagehelper.reasonable=true pagehelper.supportMethodsArguments=true pagehelper.params=count=countSql ``` ## application.yml 配置 完整配置可以参考 [src/main/resources/application-old.yml](https://github.com/abel533/MyBatis-Spring-Boot/blob/master/src/main/resources/application-old.yml) ,和 MyBatis 相关的部分配置如下: ```yaml mybatis: type-aliases-package: tk.mybatis.springboot.model mapper-locations: classpath:mapper/*.xml mapper: mappers: - tk.mybatis.springboot.util.MyMapper not-empty: false identity: MYSQL pagehelper: helperDialect: mysql reasonable: true supportMethodsArguments: true params: count=countSql ``` 注意 mapper 配置,因为参数名固定,所以接收参数使用的对象,按照 Spring Boot 配置规则,大字母都变了带横线的小字母。针对如 IDENTITY(对应i-d-e-n-t-i-t-y)提供了全小的 identity 配置,如果 IDE 能自动提示,看自动提示即可。 ## SSM集成的基础项目 >https://github.com/abel533/Mybatis-Spring ## MyBatis工具 http://www.mybatis.tk - 推荐使用 Mybatis 通用 Mapper3 https://github.com/abel533/Mapper - 推荐使用 Mybatis 分页插件 PageHelper https://github.com/pagehelper/Mybatis-PageHelper ## 作者信息 - 作者博客:http://blog.youkuaiyun.com/isea533 - 作者邮箱:abel533@gmail.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值