Spring Boot集成Mybatis Plus通过Pagehelper实现分页查询

文章目录

  • 0 简要说明Pagehelper
  • 1 搭建环境
    • 1.1 项目目录
    • 1.2 项目搭建需要的依赖
    • 1.3 配置分页插件拦截器
    • 1.4 源代码
      • 启动类
      • 实体类
      • 数据层
      • xml映射文件
      • 业务层
      • 业务层实现类
      • 控制层
      • 接口配置swagger
      • 请求体
  • 2 可能出现的疑问或者问题
    • 2.1 关于total属性疑问
    • 2.2 分页不生效问题
  • 3 案例说明
    • 3.1 配置信息
    • 3.2 请求体
    • 3.3 控制层
    • 3.5 业务层
    • 4.6 业务层实现类
  • 4 关键问题:查询和录入操作使用一个dto出现强制分页情况【待定,问题未能复现,请稍等】

解决 PageInfo 返回的 total 不正确
关于PageInfo的total属性得到的值等于当前页记录数
Pagehelper官网
Pagehelper使用入门

0 简要说明Pagehelper

在这里插入图片描述

1 搭建环境

1.1 项目目录

在这里插入图片描述

1.2 项目搭建需要的依赖

		 <!-- SpringBoot的依赖配置--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.5.10</version><type>pom</type><scope>import</scope></dependency><!--Mybatis Plus 核心依赖--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency><!--MySQL驱动包--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><!--Mybatis Plus 扩展依赖--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-extension</artifactId><version>3.5.1</version></dependency><!--pagehelper分页插件--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.0</version></dependency>

1.3 配置分页插件拦截器

在properties或者yml配置拦截器信息,使其生效。
Spring Boot 引入 starter 后自动生效,对分页插件进行配置时,在 Spring Boot 对应的配置文件 application.[properties|yaml] 中配置

# DataSource Config
spring:datasource:username: rootpassword: rooturl: jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=true&serverTimezone=UTC&useSSL=false&allowMultiQueries=truedriver-class-name: com.mysql.cj.jdbc.Drivermvc:pathmatch:matching-strategy: ANT_PATH_MATCHER#配置日志
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmapper-locations: classpath:mapper/*.xmlserver:port: 8089pagehelper:reasonable: truesupport-methods-arguments: trueparams: countSqlhelperDialect: mysql

reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。

supportMethodsArguments:支持通过 Mapper 接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。 使用方法可以参考测试代码中的 com.github.pagehelper.test.basic 包下的 ArgumentsMapTestArgumentsObjTest

helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。

params:为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero

更加详细的参数说明,可以参考官网说明

1.4 源代码

启动类

package com.geekmice.sbpagehelper;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** @BelongsProject: spring-boot-scaffold* @BelongsPackage: PACKAGE_NAME* @Author: pingmingbo* @CreateTime: 2023-08-05  15:14* @Description: TODO* @Version: 1.0*/
@MapperScan(value = "com.geekmice.sbpagehelper.dao")
@SpringBootApplication
public class SbPageHelperApplication {public static void main(String[] args) {SpringApplication.run(SbPageHelperApplication.class, args);}
}

实体类

package com.geekmice.sbpagehelper.domain;import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;import java.io.Serializable;/*** (Teacher)实体类** @author pingmingbo* @since 2023-08-05 15:19:26*/
@TableName("teacher")
@Data
public class Teacher implements Serializable {private static final long serialVersionUID = -82982716139385175L;/*** 教师号*/@TableId@TableField(value = "teacher_no")private String teacherNo;/*** 教师名称*/@TableField(value = "teacher_name")private String teacherName;/*** 部门编号*/@TableField(value = "category_id")private Integer categoryId;}

数据层

package com.geekmice.sbpagehelper.dao;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.geekmice.sbpagehelper.domain.Teacher;
import org.apache.ibatis.annotations.Param;
import java.util.List;/*** (Teacher)表数据库访问层** @author pingmingbo* @since 2023-08-05 15:19:26*/
public interface TeacherDao extends BaseMapper<Teacher> {}

xml映射文件

    <?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="com.geekmice.sbpagehelper.dao.TeacherDao"><resultMap type="com.geekmice.sbpagehelper.domain.Teacher" id="TeacherMap"><result property="teacherNo" column="teacher_no" jdbcType="VARCHAR"/><result property="teacherName" column="teacher_name" jdbcType="VARCHAR"/><result property="categoryId" column="category_id" jdbcType="INTEGER"/></resultMap></mapper>

业务层

package com.geekmice.sbpagehelper.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.geekmice.sbpagehelper.domain.Teacher;
import com.geekmice.sbpagehelper.dto.QueryDTO;
import com.github.pagehelper.PageInfo;import java.util.List;/*** (Teacher)表服务接口** @author pingmingbo* @since 2023-08-05 15:19:26*/
public interface TeacherService extends IService<Teacher> {/*** @return 响应信息* @description 初次使用分页查询*/List<Teacher> queryPage();/*** @param pageSize 当前页数* @param pageNum  每页条数* @return 返回信息* @description 分页参数查询*/PageInfo<Teacher> queryPage(int pageNum, int pageSize);/*** @param queryDTO 请求体* @return 响应信息* @description 多参数分页查询*/PageInfo<Teacher> queryPage(QueryDTO queryDTO);
}

业务层实现类

在这里插入图片描述

package com.geekmice.sbpagehelper.service.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.geekmice.sbpagehelper.dao.TeacherDao;
import com.geekmice.sbpagehelper.domain.Teacher;
import com.geekmice.sbpagehelper.dto.QueryDTO;
import com.geekmice.sbpagehelper.service.TeacherService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.List;/*** (Teacher)表服务实现类** @author pingmingbo* @since 2023-08-05 15:19:26*/
@Service("teacherService")
@Slf4j
public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> implements TeacherService {@Resourceprivate TeacherDao teacherDao;/*** @return 响应信息* @description 初次使用分页查询*/@Overridepublic List<Teacher> queryPage() {PageHelper.startPage(1, 10);List<Teacher> result = teacherDao.selectList(null);return result;}/*** @param pageSize 当前页数* @param pageNum  每页条数* @return 返回信息* @description 分页参数查询*/@Overridepublic PageInfo<Teacher> queryPage(int pageNum, int pageSize) {PageHelper.startPage(pageNum, pageSize);QueryWrapper<Teacher> teacherQueryWrapper = new QueryWrapper<>();teacherQueryWrapper.likeRight("teacher_name", "小");List<Teacher> teachers = teacherDao.selectList(teacherQueryWrapper);PageInfo<Teacher> teacherPageInfo = new PageInfo<>(teachers);return teacherPageInfo;}/*** @param queryDTO 请求体* @return 响应信息* @description 多参数分页查询*/@Overridepublic PageInfo<Teacher> queryPage(QueryDTO queryDTO) {int pageNum = queryDTO.getPageNum();int pageSize = queryDTO.getPageSize();PageHelper.startPage(pageNum,pageSize);QueryWrapper<Teacher> teacherQueryWrapper = new QueryWrapper<>();teacherQueryWrapper.eq("teacher_name", queryDTO.getTeacherName());List<Teacher> teacherList = teacherDao.selectList(teacherQueryWrapper);PageInfo<Teacher> result = new PageInfo<>(teacherList);return result;}
}

控制层

在这里插入图片描述

package com.geekmice.sbpagehelper.controller;import com.geekmice.common.utils.AjaxResult;
import com.geekmice.sbpagehelper.domain.Teacher;
import com.geekmice.sbpagehelper.dto.QueryDTO;
import com.geekmice.sbpagehelper.service.TeacherService;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;
import java.util.List;/*** (Teacher)表控制层** @author pingmingbo* @since 2023-08-05 15:19:26*/
@RestController
@RequestMapping("teacher")
@Api(tags = "0.分页查询模块")
public class TeacherController {/*** 服务对象*/@Resourceprivate TeacherService teacherService;/*** 通过主键查询单条数据** @param id 主键* @return 单条数据*/@ApiOperation(value = "查询单条数据")@GetMapping("selectOne")public Teacher selectOne(String id) {return null;}/*** @return 响应信息* @description 初次使用分页查询*/@GetMapping(value = "queryPage")@ApiOperation(value = "分页查询")public List<Teacher> queryPage() {List<Teacher> result = teacherService.queryPage();return result;}/*** @param pageSize 当前页数* @param pageNum  每页条数* @return 返回信息* @description 分页参数查询*/@GetMapping(value = "queryPageHavingParams")@ApiOperation(value = "分页查询带有参数")public AjaxResult queryPageHavingParams(int pageSize, int pageNum) {PageInfo<Teacher> result = teacherService.queryPage(pageNum, pageSize);return AjaxResult.success(result);}/*** @param queryDTO 请求体* @return 响应信息* @description 多参数分页查询*/@GetMapping(value = "queryPageByDTO")@ApiOperation(value = "多参数分页查询")public AjaxResult queryPageByDTO(QueryDTO queryDTO) {PageInfo<Teacher> result = teacherService.queryPage(queryDTO);return AjaxResult.success(result);}}

接口配置swagger

package com.geekmice.sbpagehelper.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;/*** @BelongsProject: spring-boot-scaffold* @BelongsPackage: com.geekmice.sbhelloworld.com.geekmice.sbpagehelper.config* @Author: pingmingbo* @CreateTime: 2023-07-30  15:45* @Description: TODO* @Version: 1.0*/
@Configuration
public class Knife4jConfig {@Bean(value = "defaultApi2")public Docket customDocket() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select().apis(RequestHandlerSelectors.basePackage("com.geekmice.sbpagehelper.controller")).build();}/*** 构建 api文档的详细信息函数* @return*/private ApiInfo apiInfo() {return new ApiInfoBuilder().title("现货交易").version("1.0.0").description("现货交易详情").contact(new Contact("geekmice","http://geekmice.cn","2437690868@qq.com")).build();}
}

请求体

package com.geekmice.sbpagehelper.dto;import com.github.pagehelper.PageInfo;
import lombok.Data;/*** @BelongsProject: spring-boot-scaffold* @BelongsPackage: com.geekmice.sbpagehelper.dto* @Author: pingmingbo* @CreateTime: 2023-08-05  16:00* @Description: TODO* @Version: 1.0*/
@Data
public class QueryDTO extends PageInfo {private String teacherName;
}

2 可能出现的疑问或者问题

2.1 关于total属性疑问

2.2 分页不生效问题

  1. 当我们调用pagehelper.startPage()方法后下一条语句必须是你要调用的查询语句;
  2. 我们的PageInfo传入的结果集,必须是我们调用查询语句返回的结果集;

提前说明:入参是 pageNum:1 pageSize:2 userName:张 模糊查询
正常情况,没有分页是有以张开头有三条数据,有分页的情况下 张1,张2

第一种问题复现如下:
List userDomainList = userDao.selectList(userDomainQueryWrapper); // 位置1
PageHelper.startPage(pageNum, pageSize); // 位置2

        int pageNum = userVO.getPageNum();int pageSize = userVO.getPageSize();String userName = userVO.getUserName();QueryWrapper<UserDomain> userDomainQueryWrapper = new QueryWrapper<>();userDomainQueryWrapper.likeRight("user_name", userName);List<UserDomain> userDomainList = userDao.selectList(userDomainQueryWrapper); // 位置1PageInfo<UserDomain> userDomainPageInfo = new PageInfo<>(userDomainList);PageHelper.startPage(pageNum, pageSize); // 位置2return userDomainPageInfo;

返回结果有疑问:返回的是没有分页,只要是张开头的数据都返回了。

{"msg": "操作成功","code": 200,"data": {"total": 3,"list": [{"id": 1,"userName": "张1","birthday": "2023-08-09T16:00:00.000+00:00","sex": "男","address": "123@163.com"},{"id": 3,"userName": "张2","birthday": "2023-08-09T16:00:00.000+00:00","sex": "女","address": "999@163.com"},{"id": 4,"userName": "张3","birthday": "2023-08-09T16:00:00.000+00:00","sex": "男","address": "9994@qq.com"}],"pageNum": 1,"pageSize": 4,"size": 3,"startRow": 1,"endRow": 3,"pages": 1,"prePage": 0,"nextPage": 0,"isFirstPage": true,"isLastPage": true,"hasPreviousPage": false,"hasNextPage": false,"navigatePages": 8,"navigatepageNums": [1],"navigateFirstPage": 1,"navigateLastPage": 1}
}

3 案例说明

3.1 配置信息

添加依赖

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

yml配置信息

pagehelper:reasonable: truesupport-methods-arguments: trueparams: countSqlhelperDialect: mysql

3.2 请求体

PageInfo这个api是Pagehelper原生的对象,涵盖基本分页信息
在这里插入图片描述
在这里插入图片描述

package com.geekmice.sbpagehelper.dto;import com.github.pagehelper.PageInfo;
import lombok.Data;/*** @BelongsProject: spring-boot-scaffold* @BelongsPackage: com.geekmice.sbpagehelper.dto* @Author: pingmingbo* @CreateTime: 2023-08-05  16:00* @Description: TODO* @Version: 1.0*/
@Data
public class QueryDTO extends PageInfo {private String teacherName;
}

3.3 控制层

/*** (Teacher)表控制层** @author pingmingbo* @since 2023-08-05 15:19:26*/
@RestController
@RequestMapping("teacher")
@Api(tags = "0.分页查询模块")
public class TeacherController {/*** 服务对象*/@Resourceprivate TeacherService teacherService;/*** @param queryDTO 请求体* @return 响应信息* @description 多参数分页查询*/@GetMapping(value = "queryPageByDTO")@ApiOperation(value = "多参数分页查询")public AjaxResult queryPageByDTO(QueryDTO queryDTO) {PageInfo<Teacher> result = teacherService.queryPage(queryDTO);return AjaxResult.success(result);}
}

3.5 业务层

package com.geekmice.sbpagehelper.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.geekmice.sbpagehelper.domain.Teacher;
import com.geekmice.sbpagehelper.dto.QueryDTO;
import com.github.pagehelper.PageInfo;import java.util.List;/*** (Teacher)表服务接口** @author pingmingbo* @since 2023-08-05 15:19:26*/
public interface TeacherService extends IService<Teacher> {/*** @param queryDTO 请求体* @return 响应信息* @description 多参数分页查询*/PageInfo<Teacher> queryPage(QueryDTO queryDTO);
}

4.6 业务层实现类

package com.geekmice.sbpagehelper.service.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.geekmice.sbpagehelper.dao.TeacherDao;
import com.geekmice.sbpagehelper.domain.Teacher;
import com.geekmice.sbpagehelper.dto.QueryDTO;
import com.geekmice.sbpagehelper.service.TeacherService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;/*** (Teacher)表服务实现类** @author pingmingbo* @since 2023-08-05 15:19:26*/
@Service("teacherService")
@Slf4j
public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> implements TeacherService {@Resourceprivate TeacherDao teacherDao;/*** @param queryDTO 请求体* @return 响应信息* @description 多参数分页查询*/@Overridepublic PageInfo<Teacher> queryPage(QueryDTO queryDTO) {int pageNum = queryDTO.getPageNum();int pageSize = queryDTO.getPageSize();QueryWrapper<Teacher> teacherQueryWrapper = new QueryWrapper<>();teacherQueryWrapper.eq("teacher_name", queryDTO.getTeacherName());PageHelper.startPage(pageNum,pageSize);List<Teacher> teacherList = teacherDao.selectList(teacherQueryWrapper);PageInfo<Teacher> result = new PageInfo<>(teacherList );return result;}
}

再次说明 PageHelper.startPage(pageNum,pageSize);使用顺序

4 关键问题:查询和录入操作使用一个dto出现强制分页情况【待定,问题未能复现,请稍等】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/63732.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分类预测 | Matlab实现基于MIC-BP最大互信息系数数据特征选择算法结合BP神经网络的数据分类预测

分类预测 | Matlab实现基于MIC-BP最大互信息系数数据特征选择算法结合BP神经网络的数据分类预测 目录 分类预测 | Matlab实现基于MIC-BP最大互信息系数数据特征选择算法结合BP神经网络的数据分类预测效果一览基本介绍研究内容程序设计参考资料 效果一览 基本介绍 Matlab实现基于…

【Docker晋升记】No.2 --- Docker工具安装使用、命令行选项及构建、共享和运行容器化应用程序

文章目录 前言&#x1f31f;一、Docker工具安装&#x1f31f;二、Docker命令行选项&#x1f30f;2.1.docker run命令选项&#xff1a;&#x1f30f;2.2.docker build命令选项&#xff1a;&#x1f30f;2.3.docker images命令选项&#xff1a;&#x1f30f;2.4.docker ps命令选项…

多线程与高并发--------阻塞队列

四、阻塞队列 一、基础概念 1.1 生产者消费者概念 生产者消费者是设计模式的一种。让生产者和消费者基于一个容器来解决强耦合问题。 生产者 消费者彼此之间不会直接通讯的&#xff0c;而是通过一个容器&#xff08;队列&#xff09;进行通讯。 所以生产者生产完数据后扔到…

matlab使用教程(14)—稀疏矩阵的运算

1.运算效率 1.1计算复杂度 稀疏运算的计算复杂度与矩阵中的非零元素数 nnz 成比例。计算复杂度在线性上还与矩阵的行大小 m 和列大小 n 相关&#xff0c;但与积 m*n&#xff08;零元素和非零元素总数&#xff09;无关。相当复杂的运算&#xff08;例如对稀疏线性方程求解&…

RabbitMQ 事务

事务简介 就像我们了解的MySQL中的事务一样&#xff0c;RabbiMQ的事务也具备原子性和一致性&#xff0c;并且RabbiMQ的事务是针对消息从生产者发送到RabbitMQ中提供的支持&#xff0c;因此不同事务可以同时给同一个队列发送信息。   可通过channel.txSelect&#xff0c;chann…

Android侧滑栏(一)可缩放可一起移动的侧滑栏

在实际的各类App开发中&#xff0c;经常会需要做一个左侧的侧滑栏&#xff0c;类似于QQ这种。 今天这篇文章总结下自己在开发中遇到的这类可以跟随移动且可以缩放的侧滑栏。 一、实现原理 使用 HorizontalScrollView 实现一个水平方向的可滑动的View&#xff0c;左布局为侧滑…

MySQL多表关联查询

目录 1. inner join&#xff1a; 2. left join&#xff1a; 3. right join&#xff1a; 4.自连接 5.交叉连接&#xff1a; 6、联合查询 7、子查询 1. inner join&#xff1a; 代表选择的是两个表的交差部分。 内连接就是表间的主键与外键相连&#xff0c;只取得键值一致…

Grafana展示k8s中pod的jvm监控面板/actuator/prometheus

场景 为保障java服务正常运行&#xff0c;对服务的jvm进行监控&#xff0c;通过使用actuator组件监控jvm情况&#xff0c;使用prometheus对数据进行采集&#xff0c;并在Grafana展现。 基于k8s场景 prometheus数据收集 配置service的lable&#xff0c;便于prometheus使用labl…

【ES6】深入理解ES6(1)

一、块级作用域绑定 var声明及变量提升机制 二、字符串和正则表达式 字符串&#xff08;String&#xff09;是JavaScript6大原始数据类型。其他几个分别是Boolean、Null、Undefined、Number、Symbol&#xff08;es6新增&#xff09;。 更好的Unicode支持 1. UTF-16码位 字…

【Archaius技术专题】「Netflix原生态」动态化配置服务之微服务配置组件变色龙

前提介绍 如果要设计开发一套微服务基础架构&#xff0c;参数化配置是一个非常重要的点&#xff0c;而Netflix也开源了一个叫变色龙Archaius的配置中心客户端&#xff0c;而且Archaius可以说是比其他客户端具备更多生产级特性&#xff0c;也更灵活。*在NetflixOSS微服务技术栈…

《Java-SE-第三十四章》之Optional

前言 在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!” 博客主页&#xff1a;KC老衲爱尼姑的博客主页 博主的github&#xff0c;平常所写代码皆在于此 共勉&#xff1a;talk is cheap, show me the code 作者是爪哇岛的新手&#xff0c;水平很有限&…

RFID工业识别技术:供应链智能化的科技颠覆

RFID工业识别技术&#xff0c;作为物联网的先锋&#xff0c;正在供应链管理领域展现着前所未有的科技颠覆。从物料追踪到库存管理&#xff0c;再到物流配送&#xff0c;RFID技术以其高效的数据采集和智能的自动化处理&#xff0c;彻底改变着传统供应链的运营方式。 RFID在物料追…