当前位置: 首页 > news >正文

mybatis-plus动态分页

一、需求

mybatis-plus自带了CRUD和单表的分页方法,但是真实场景中,我们可能需要多表关联,自己写list查询,这就面临分页问题,之前都是通过内存分页,感觉是颗定时炸弹,所以有没有办法通过数据库物理分页,读了官方文档终于找到了方法。mybatis-plus依赖包自己去引入,这里默认大家已经集成了mybatis-plus。

二、xml文件sql


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="cn.iocoder.yudao.module.product.dal.mysql.sku.ProductSkuMapper"><select id="selectSkuList1" parameterType="cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSpuPageReqqVO"resultType="cn.iocoder.yudao.module.product.controller.admin.spu.vo.ProductSkuRespReVO">SELECT sk.id AS skuId,sp.id AS spuId,sp.`name`,pb.`name` AS brandName,sk.stock AS stock,sk.properties AS propertiesStr,sk.price as price,sk.pic_url as picUrlFROM product_sku skLEFT JOIN product_spu sp ON sk.spu_id = sp.idLEFT JOIN product_brand pb ON pb.id = sp.brand_idWHEREsk.`deleted` =0<if test="vo.brandName != null and vo.brandName != ''">and pb.`name` like concat('%',#{vo.brandName},'%')</if><if test="vo.name != null and vo.name != ''">and sp.`name` like concat('%',#{vo.name},'%')</if><if test="vo.categoryId != null">and sp.`category_id` =#{vo.categoryId}</if><if test="vo.skuIds != null and vo.skuIds.size > 0">and sk.id in<foreach item="item" collection="vo.skuIds" open="(" separator="," close=")" index="">#{item}</foreach></if></select></mapper>

三、三个实体类(需要替换成自己项目的实体)

根据自己项目的实体类替换,这里只是举例子。
1、实体一


import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.*;import java.util.List;/**
* 商品 SKU DO
*
* @author 
*/
@TableName(value = "product_sku", autoResultMap = true)
@KeySequence("product_sku_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ProductSkuDO {/*** 商品 SKU 编号,自增*/@TableIdprivate Long id;/*** SPU 编号**/private Long spuId;/*** 属性数组,JSON 格式*/@TableField(typeHandler = JacksonTypeHandler.class)private List<Property> properties;/*** 商品价格,单位:分*/private Integer price;/*** 市场价,单位:分*/private Integer marketPrice;/*** 成本价,单位:分*/private Integer costPrice;/*** 商品条码*/private String barCode;/*** 图片地址*/private String picUrl;/*** 库存*/private Integer stock;/*** 商品重量,单位:kg 千克*/private Double weight;/*** 商品体积,单位:m^3 平米*/private Double volume;/*** 一级分销的佣金,单位:分*/private Integer firstBrokeragePrice;/*** 二级分销的佣金,单位:分*/private Integer secondBrokeragePrice;// ========== 营销相关字段 =========// ========== 统计相关字段 =========/*** 商品销量*/private Integer salesCount;/*** 商品属性*/@Data@NoArgsConstructor@AllArgsConstructorpublic static class Property {/*** 属性编号*/private Long propertyId;/*** 属性名字** 注意:每次属性名字发生变化时,需要更新该冗余*/private String propertyName;/*** 属性值编号*/private Long valueId;/*** 属性值名字** 注意:每次属性值名字发生变化时,需要更新该冗余*/private String valueName;}}

2、实体二


import com.alibaba.fastjson.JSONArray;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;import java.io.Serializable;
import java.util.Collections;
import java.util.List;@Data
public class ProductSkuRespReVO implements Serializable {private Long spuId;private Long skuId;private String name;private String brandName;private Integer stock;private String propertiesStr;private String picUrl;private List<ProductSkuSaveReqVO.Property> properties;public List<ProductSkuSaveReqVO.Property> getProperties() {if (StringUtils.isNotBlank(propertiesStr)) {return JSONArray.parseArray(propertiesStr, ProductSkuSaveReqVO.Property.class);}return Collections.emptyList();}
}

3、实体三


import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;import java.util.List;@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class ProductSpuPageReqqVO extends PageParam {private Integer pageNo ;private Integer pageSize;private String name;private String brandName;private Long categoryId;private List<Long> skuIds;}

四、mapper接口


import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;@Mapper
public interface ProductSkuMapper extends BaseMapperX<ProductSkuDO> {Page<ProductSkuRespReVO> selectSkuList1(Page<ProductSkuRespReVO> page, @Param("vo") ProductSpuPageReqqVO vo);
}

五、service接口

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;import java.util.Collection;
import java.util.List;/*** 商品 SKU Service 接口** @author */
public interface ProductSkuService {Page<ProductSkuRespReVO> selectSkuList1(Page<ProductSkuRespReVO> page, ProductSpuPageReqqVO vo);}

六、service实现类


import java.util.*;
import java.util.stream.Collectors;/*** 商品 SKU Service 实现类** @author */
@Service
@Validated
public class ProductSkuServiceImpl implements ProductSkuService {@Resourceprivate ProductSkuMapper productSkuMapper;@Overridepublic Page<ProductSkuRespReVO> selectSkuList1(Page<ProductSkuRespReVO> page, ProductSpuPageReqqVO vo) {return productSkuMapper.selectSkuList1(page, vo);}}

七、controller


@RestController
@RequestMapping("/product/spu")
@Validated
public class ProductSpuController {@Resourceprivate ProductSkuService productSkuService;@GetMapping("/page/sku")@Operation(summary = "套装关联spu/sku商品列表")@PreAuthorize("@ss.hasPermission('product:spu:sku:query')")public CommonResult<PageResult<ProductSkuRespReVO>> getSkuPage1(@Valid ProductSpuPageReqqVO pageVO) {Page<ProductSkuRespReVO> classInfoPage = new Page<>(pageVO.getPageNo(), pageVO.getPageSize());productSkuService.selectSkuList1(classInfoPage, pageVO);PageResult<ProductSkuRespReVO> bean = new PageResult<>();bean.setTotal(classInfoPage.getTotal());bean.setList(classInfoPage.getRecords());return success(bean);}
}
http://www.xdnf.cn/news/664057.html

相关文章:

  • ARM架构
  • 密钥分发与公钥证书
  • 工厂方法模式之Factory Method(工厂方法)
  • Python网络编码——聊天小工具
  • 2025年中国ERP软件前十名对比:选型指南与适用场景的分析
  • 数控滑台技术革新:提升生产效率的关键
  • [浏览器]缓存策略机制详解
  • (12)Quarkus 编译时增强原理
  • GIS局部放电图绘制指南
  • UE 骨骼模型 会没有face index的原因
  • IPv6能自动分配地址,就不需要DHCP服务器了吗?
  • Unity3D仿星露谷物语开发52之菜单页面
  • RK3568DAYU开发板-平台驱动开发:GPIO驱动
  • 冒险岛 职业名及代码
  • 为什么需要清除浮动?清除浮动的方式有哪些?
  • day28:零基础学嵌入式之进程2
  • MQTT通信协议
  • [面试精选] 0076. 最小覆盖子串
  • Linux多线程(二)之进程vs线程
  • Cell Metab.|复旦大学储以微、骆菲菲团队:Foxp3改造CAR-T,从「能量危机」到「代谢续航」的实体瘤治疗新路径
  • Android GPU Inspector深度解析:从零掌握驱动级性能数据抓取与优化
  • FastAPI 中间件
  • 电子标签倒计时应用
  • 从自发到赋能:产品经理的成长与 AI 时代的自我重塑
  • 测试W5500的第7步_使用ioLibrary库创建HTTP客户端
  • Linux中SHELL脚本常用命令
  • 安卓实用复制功能增强工具
  • 【杂谈】STM32使用快速傅里叶变换库函数后如何比较准确地找到n次谐波幅值
  • Python不要使用可变对象作为函数的默认参数
  • 记忆术-拼音字母形象法【针对“音形义“里谐音法的补充记忆法】