【MyBatis插件】PageHelper 分页

image

前言

  在开发 Web 应用时,我们经常需要处理海量数据的展示问题。例如,在一个电商平台上,商品列表可能有成千上万条数据。如果我们一次性将所有数据返回给前端,不仅会导致页面加载缓慢,还会对数据库造成巨大压力。为了解决这个问题,分页查询应运而生。所谓分页查询,就是当查询结果数据较多时,采用按页显示的方法将数据分成若干个“页面”,每次只加载当前页面的数据,而不是一次性全部显示。通过分页可以有效减少单次查询的返回数据量,提升性能和用户体验。PageHelper 是国内非常优秀的一款开源的 MyBatis 分页插件,能够帮助我们快速实现分页功能。而且它支持基本主流与常用的数据库, 例如mysql、 oracle、mariaDB、 DB2、 SQLite、Hsqldb等,今天就给大家聊聊 PageHelper 这款分页插件。

一、PageHelper 概述

1.1 什么是 PageHelper

  在开发过程中实现分页查询,我们可以使用 SQL 语句中添加 limit 关键字的方法实现分页查询。但是查询分页内容时,需要计算相关的分页信息和参数。而且无论什么业务其分页逻辑都是类似的,所以有框架帮助我们高效实现分页功能。PageHelper 是一个基于 MyBatis 的分页插件,它通过拦截 MyBatis 的执行器,在 SQL 语句执行前后动态添加分页逻辑来实现分页功能。通过简单的配置和调用,PageHelper 可以自动处理 SQL 查询中的分页逻辑,极大地简化了分页功能的开发过程,支持多种分页方式和结果集排序、筛选等操作。
image

  • PageHelper 官网:https://pagehelper.github.io
  • PageHelper 源码:https://gitee.com/free/Mybatis_PageHelper/
  • PageHelper API:https://apidoc.gitee.com/free/Mybatis_PageHelper/

1.2 PageHelper 的工作原理

  PageHelper 的工作原理主要依赖于拦截 MyBatis 的查询操作,在查询前设置分页参数,并在执行 SQL 语句时动态添加分页逻辑,从而实现分页查询。它通过修改当前执行的 SQL 语句来添加分页条件,执行添加了分页条件的 SQL 语句,最终返回分页后的结果集。此外,PageHelper 还提供了详细的配置选项和默认参数支持,如pagehelper.reasonable、pagehelper.defaultCount等,用户可以根据自己的需求进行配置。在整合PageHelper到项目中时,需要确保已经正确导入了MyBatis的依赖,并且按照官方文档的指引进行依赖的引入和配置。

  总的来说,PageHelper 是一款功能强大且易于使用的 MyBatis 分页插件,它大大简化了分页查询的实现过程,提高了开发效率,是 Java 项目中实现分页功能的常用工具之一。

二、PageHelper 的基本使用

2.1 引入依赖

  在使用 PageHelper 之前,需要在项目中引入 PageHelper 的相关依赖。如果使用的是 Maven,可以在 pom.xml 中添加以下依赖:

<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>x.y.z</version>
</dependency>

  若是 Spring Boot中集成 PageHelper,需要在 pom.xml 中添加以下依赖即可,无需额外配置,PageHelper 会自动集成 MyBatis。

<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>x.y.z</version>
</dependency><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>x.y.z</version>
</dependency>

2.2 配置拦截器插件

在 MyBatis 配置文件中配置

  在 MyBatis 的配置文件中(通常是 mybatis-config.xml ),添加 PageHelper 的插件配置,关键代码如下所示:

<plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"> <!-- 配置全局的分页参数 --><property name="helperDialect" value="mysql"/><property name="offsetAsPageNum" value="true"/><property name="rowBoundsWithCount" value="true"/></plugin>
</plugins>

在 Spring Boot中配置

 Spring Boot 引入 starter 后自动生效,对分页插件进行配置时,通常可以通过配置文件 application.propertiesapplication.yaml 中进行配置,关键代码如下所示:

pagehelper:helper-dialect: mysql # 配置分页插件的方言,即使用的什么数据库则就用什么数据库reasonable: true 	# 开启合理查询:即若超过最大页跳到最后一页,若查询-1页,默认查询第一页。support-methods-arguments: true	# 通过 Mapper 接口方法的参数来传递分页参数params: count=countSql # 指定count查询的参数名称。

  或者可以通过配置类定义设置相关的参数信息,关键代码如下所示:

import com.github.pagehelper.PageHelper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Properties;@Configuration
public class MyBatisConfig {@Beanpublic PageHelper pageHelper() {PageHelper pageHelper = new PageHelper();Properties properties = new Properties();properties.setProperty("dialect", "Mysql");properties.setProperty("offsetAsPageNum", "true");properties.setProperty("rowBoundsWithCount", "true");pageHelper.setProperties(properties);return pageHelper;}
}

2.3 编写 Mapper 接口和 XML 文件

为了实现 PageHelper,定义一个实体类,关键代码如下所示:

@Data
public class SysUser {private Long id;private String userName;private String password;private String phone;private String realName;private String nickName;private String email;// 账户状态(1.正常 2.锁定 )private Integer status;// 性别(1.男 2.女)private Integer sex;// 是否删除(1未删除;0已删除)private Integer deleted;private Long createUserId;private Long updateUserId;private Date createTime;private Date updateTime;
}

  编写相关 Mapper 接口和对应的 XML 文件,这些文件应该包含需要进行分页查询的 SQL 语句。注意,这里不需要特别修改 SQL 语句以支持分页,因为 PageHelper 会自动处理。假设我们有一个 UserMapper 接口,用于查询用户数据,关键代码如下所示:

@Mapper
public interface SysUserMapper {List<SysUser> selectUserList(Page<SysUser> page);
}
<?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.dllwh.mybatis.mapper.SysUserMapper"><select id="selectUserList" resultType="com.dllwh.mybatis.model.SysUser">SELECT * FROM sys_user</select>
</mapper>

2.4 实现分页查询

  在 Service 层或 Controller 层中,我们可以通过 PageHelper 提供的方法来进行分页参数的设置和获取分页结果。PageHelper 的核心方法是 PageHelper.startPage(),它的作用是为当前线程开启分页上下文,并在接下来的查询中拦截 SQL,添加分页参数。关键代码如下所示:

public interface UserService {PageInfo<User> selectUserList(int pageNum, int pageSize);
}@Service 
public class UserServiceImpl implements UserService{@Resource private SysUserMapper sysUserMapper;public PageInfo<User> selectUserList(int pageNum, int pageSize) {// 这句代码要放在查询 mapper 语句的前面,用于对数据库查询 SQL 设置分页参数PageHelper.startPage(pageNum,  pageSize);// 执行查询操作List<User> userList = sysUserMapper.selectUserList(null);// 将查询到的结果对象封装到pageInfo中,可以查看分页的各种数据return new PageInfo<>(userList);}
}

  PageHelper 利用 MyBatis 的插件机制拦截查询语句,在查询 SQL 中自动加入分页语法,如 MySQL 的 LIMIT 或 Oracle 的 ROWNUM,并执行两次 SQL 查询:

  1. 查询总记录数:执行 SELECT COUNT(*) FROM ... 获取满足条件的记录总数。
  2. 查询分页数据:在原始查询 SQL 后追加分页条件。

2.5 返回分页结果

  在 Controller 层中,我们可以将分页结果返回给前端,关键代码如下所示:

@RestController 
@RequestMapping("/user")
public class UserController {@Resource private UserService userService;@GetMapping("/list")public PageInfo<User> getUsersList(int pageNum, int pageSize) {return userService.getUsersList(pageNum,  pageSize);}
}

  从服务层获取到分页数据后,就可以在前端页面上进行展示,并添加分页导航条等控件来控制分页。

三、PageHelper 的核心功能

分页对象 Page

  Page 是一个接口,它包含分页数据以及一些基本的分页信息(如总记录数、当前页等)。当使用 PageHelper 进行分页查询时,查询结果会被自动封装到一个实现了 Page 接口的对象中。

public class Page<E> extends ArrayList<E> implements Closeable {// 页码,从1开始private int pageNum;// 页面大小private int pageSize;// 起始行private long startRow;// 末行private long endRow;// 总数private long total;// 总页数private int pages;// 包含count查询private boolean count = true;// 分页合理化private Boolean reasonable;// 当设置为true的时候,如果pagesize设置为0(或RowBounds的limit=0),就不执行分页,返回全部结果private Boolean pageSizeZero;// 进行count查询的列名private String countColumn;// 排序private String orderBy;// 只增加排序private boolean orderByOnly;// sql拦截处理private BoundSqlInterceptor boundSqlInterceptor;// 分页实现类,可以使用 {@link com.github.pagehelper.page.PageAutoDialect} 类中注册的别名,例如 "mysql", "oracle"private String dialectClass;// 转换count查询时保留查询的 order by 排序private Boolean keepOrderBy;// 转换count查询时保留子查询的 order by 排序private Boolean keepSubSelectOrderBy;// 异步count查询private Boolean asyncCount;
}
方法默认值简要说明
List getResult()emptyList获取分页后的数据列表
Long getTotal()0获取列表总记录数
int getPageNum()1获取当前页码
int getPageSize()10每页显示条数,默认 10
boolean isLastPage()判断是否为第一页
boolean isLastPage()判断是否为最后一页
boolean hasPreviousPage()判断是否有上一页
boolean hasNextPage()判断是否有下一页
int getPrePage()获取上一页的页码。
int getNextPage()获取下一页的页码。

分页信息封装类 PageInfo

  我们在使用 MyBatis 分页时,不论是使用自动分页还是手动分页都会使用 PageInfo 对象作为承接介质。PageInfo 是 PageHelper 提供的用于封装分页结果的对象,包含完整的分页信息。它可以将分页查询结果和分页参数封装在一个对象中,便于传输和使用。

public class PageInfo<T> extends PageSerializable<T> {// 当前页private int pageNum;// 每页的数量private int pageSize;// 当前页的数量private int size;// 当前页面第一个元素在数据库中的行号(不常用)private long startRow;// 当前页面最后一个元素在数据库中的行号(不常用)private long endRow;// 总页数private int pages;// 前一页private int prePage;// 下一页private int nextPage;// 是否为第一页private boolean isFirstPage = false;// 是否为最后一页private boolean isLastPage = false;// 是否有前一页private boolean hasPreviousPage = false;// 是否有下一页private boolean hasNextPage = false;// 导航页码数private int navigatePages;// 所有导航页号private int[] navigatepageNums;// 导航条上的第一页private int navigateFirstPage;// 导航条上的最后一页private int navigateLastPage;

  PageHelper 提供了丰富的存储和管理分页相关的参数配置选项,例如:

public PageInfo<User> getUsers(int pageNum, int pageSize, String orderBy) {PageHelper.startPage(pageNum,  pageSize).setOrderBy(orderBy);List<User> userList = userMapper.selectUsers(null); return new PageInfo<>(userList);
}

  PageInfo 作为后端返回给前端的标准分页数据格式,便于前端渲染分页组件。它不仅包含了分页数据,还提供了更多的辅助信息,如是否为第一页、最后一页、导航页码等,前端在使用时无需手动计算分页参数,提高可读性和可维护性。

public void print PageInfo pageInfo) {System.out.println(" 当前页码:" + pageInfo.getPageNum()); System.out.println(" 总记录数:" + pageInfo.getTotal()); System.out.println(" 总页数:" + pageInfo.getPages()); 
}

四、PageHelper 实现原理

4.1 使用 ThreadLocal 记录分页参数

在调用 startPage 方法时,会通过 ThreadLocal 存储当前分页参数:

public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count, Boolean reasonable, Boolean pageSizeZero) {Page<E> page = new Page<E>(pageNum, pageSize, count);page.setReasonable(reasonable);page.setPageSizeZero(pageSizeZero);//当已经执行过orderBy的时候Page<E> oldPage = getLocalPage();if (oldPage != null && oldPage.isOrderByOnly()) {page.setOrderBy(oldPage.getOrderBy());}//设置ThreadLocalsetLocalPage(page);return page;
}

附录

分页插件参数

分页插件提供了多个可选参数,这些参数使用时,按照上面配置方式中的示例配置即可。分页插件可选参数如下表所示:

属性简要说明
Boolean offsetAsPageNum通常用于指定是否将传入的 offset 当作 pageNum 页码使用。
因为 PageHelper 默认使用页码(pageNum)、每页记录数(pageSize)来进行分页的。
Boolean rowBoundsWithCount用于指定是否进行 count 查询以获取总记录数。
设置为 true 表示 PageHelper 在执行分页查询时,会先执行一个 count 查询来获取总记录数。
Boolean pageSizeZero
Boolean reasonable
Boolean supportMethodsArguments
String dialect不同数据库 SQL 语句不同,指定了数据库方言为 Mysql。
String helperDialect指定分页插件使用哪种方言,候选值可参考 PageAutoDialect.java。
Boolean autoRuntimeDialect设置为 true 时,允许在运行时根据多数据源自动识别对应方言
Boolean autoDialect
Boolean closeConn通过该属性来设置是否关闭获取的这个连接,默认 true 关闭,设置为 false 后,不会关闭获取的连接。
String params
Boolean defaultCount用于控制默认不带 count 查询的方法中,是否执行 count 查询,默认 true 会执行 count 查询。
String dialectAlias允许配置自定义实现的 别名,可以用于根据 JDBC URL 自动获取对应实现,允许通过此种方式覆盖已有的实现,
String autoDialectClass用于自动获取数据库类型
String countColumn用于配置自动 count 查询时的查询列,默认值 0,也就是 count(0)。
String replaceSql可选值为 regex 和 simple,默认值空时采用 regex 方式
String sqlCacheClass针对 SQLServer 生成的 count 和 page sql 进行缓存
String boundSqlInterceptors
Boolean keepOrderBy转换count查询时保留查询的 order by 排序。
Boolean keepSubSelectOrderBy转换count查询时保留子查询的 order by 排序。
String sqlParser
Boolean asyncCount
String countSqlParser
String orderBySqlParser
String sqlServerSqlParser

常见问题及解决方法

分页上下文未清理导致干扰

  在同一个查询操作中,如果多次调用 PageHelper.startPage() 方法,可能会导致分页参数被覆盖或产生不可预期的结果。

/*** 第一次分页查询*/
PageHelper.startPage(1, 10);
List<DataA> listA = mapperA.queryDataA();/*** 第二次分页查询*/
PageHelper.startPage(2, 5);
List<DataB> listB = mapperB.queryDataB();// 结果可能被第二次分页干扰
PageInfo<DataA> pageInfoA = new PageInfo<>(listA);

  对此,在每次分页查询后,调用 PageHelper.clearPage() 清理上下文。

PageHelper.startPage(1, 10);
List<DataA> listA = mapperA.queryDataA();
PageInfo<DataA> pageInfoA = new PageInfo<>(listA);
// 清理上下文
PageHelper.clearPage();PageHelper.startPage(2, 5);
List<DataB> listB = mapperB.queryDataB();
PageInfo<DataB> pageInfoB = new PageInfo<>(listB);
PageHelper.clearPage();

查询未执行导致上下文污染

  如果分页查询代码在条件分支中,而分支未被执行,分页上下文未被清理会干扰后续查询。

PageHelper.startPage(1, 10);
if (someCondition) {List<Data> list = mapper.queryData(); // 查询未执行
}
// 后续查询会被干扰

  对此,可以将分页查询代码移到条件分支内部,确保分页逻辑与查询一一对应。或者在条件分支中调用 PageHelper.clearPage() 清理上下文。

总结

  通过本文的学习,你已经掌握了 PageHelper 的核心概念、使用方法和实际应用。从它的起源到现代应用,再到具体的代码实现和最佳实践,每一个环节都进行了详细的讲解。未来,随着 MyBatis 和 PageHelper 的不断发展,分页查询的功能会越来越强大。通过正确理解和使用 PageHelper,开发者可以高效完成分页需求,同时规避潜在问题,提升系统性能与稳定性,写出更加高效、优雅的代码!

image

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

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

相关文章

springboot+vue实现在线书店(图书商城)系统

今天教大家如何设计一个图书商城 , 基于目前主流的技术&#xff1a;前端vue&#xff0c;后端springboot。 同时还带来的项目的部署教程。 视频演示 在线书城 图片演示 一. 系统概述 商城是一款比较庞大的系统&#xff0c;需要有商品中心&#xff0c;库存中心&#xff0c;订单…

OPC UA + ABP vNext 企业级实战:高可用数据采集框架指南

&#x1f680;&#x1f4ca; OPC UA ABP vNext 企业级实战&#xff1a;高可用数据采集框架指南 &#x1f680; &#x1f4d1; 目录 &#x1f680;&#x1f4ca; OPC UA ABP vNext 企业级实战&#xff1a;高可用数据采集框架指南 &#x1f680;一、前言 &#x1f3af;二、系统…

Oracle统计信息收集时的锁持有阶段

Oracle统计信息收集时的锁持有阶段 1 准备阶段&#xff08;共享模式锁&#xff09; 锁类型&#xff1a;对象级共享锁&#xff08;S锁&#xff09; 持续时间&#xff1a;通常1-5秒 主要操作&#xff1a; 验证对象存在性和权限检查统计信息首选项设置确定采样方法和并行度 监…

shell常用语法

一、shell变量 定义变量语法&#xff1a; 变量名值 # 等号两边不能有空格 示例&#xff1a; #!/bin/bash name"Alice" echo "Hello, $name!" # 使用变量使用变量-语法&#xff1a; 两种方式&#xff1a; 第一种&#xff1a;${变量名} 第二种&#x…

《教育退费那些事儿:从困境到破局》

《教育退费那些事儿&#xff1a;从困境到破局》 教育退费&#xff1a;不容忽视的热点问题 在当今社会&#xff0c;教育消费已成为家庭支出的重要组成部分。无论是 K12 阶段的学科辅导、艺术特长培训&#xff0c;还是成人的职业技能提升、学历继续教育&#xff0c;家长和学生们…

老字号焕新案例:天猫代运营如何让传统品牌年轻化破圈

老字号焕新案例&#xff1a;天猫代运营如何让传统品牌年轻化破圈 在消费升级与年轻化浪潮的冲击下&#xff0c;传统老字号品牌常面临“有历史无活力、有产品无流量”的困境。如何借助电商平台实现品牌焕新&#xff0c;成为其破局的关键。品融&#xff08;PINKROON&#xff09…

高可靠低纹波国产4644电源芯片在工业设备的应用

摘要 随着工业自动化和智能化的飞速发展&#xff0c;工业设备对于电源芯片的性能和可靠性提出了前所未有的严格要求。电源芯片作为工业设备的核心供电组件&#xff0c;其性能直接影响到整个设备的运行效率和稳定性。本文以国科安芯的ASP4644四通道降压稳压器为例&#xff0c;通…

Vue组件-霓虹灯:技术解析与实现

Vue组件-霓虹灯&#xff1a;技术解析与实现 本文将详细解析如何使用Vue 3实现一个动态炫彩霓虹灯效果。 预览 概述 此Vue组件创建了一个由7个同心圆环组成的霓虹灯效果&#xff0c;每个圆环具有彩虹中的一种颜色&#xff08;红、橙、黄、绿、蓝、靛、紫&#xff09;。这些圆…

【实战教程】从零实现DeepSeek AI多专家协作系统 - Spring Boot+React打造AI专家团队协作平台

&#x1f680; 本项目是DeepSeek大模型应用系列的V3版本&#xff0c;基于V1和V2版本的功能进行全面升级&#xff0c;引入了多智能体协作机制&#xff01; 系列教程推荐阅读顺序&#xff1a; 【V1版本】零基础搭建DeepSeek大模型聊天系统 - Spring BootReact完整开发指南【V2版本…

第8章-5 sql的执行顺序

上一篇&#xff1a;《第8章-4 查询性能优化2》&#xff0c;接着来了解查询的执行顺序&#xff0c;了解顺序对于优化会有帮助。 1&#xff0c;sql编写顺序 select distinct 查询字段 from 表名 JOIN 表名 ON 连接条件 where 查询条件 group by 分组字段 having 分组后…

设计模式学习整理

目录 UML类图 设计模式六大原则 1.单一职责原则 2.里氏替换原则 3.依赖倒置原则 4.接口隔离原则 5.迪米特法则(最少知道原则) 6.开(放封)闭原则 设计模式分类 1.创建型模式 2.结构型模式 4.行为型模式 一、工厂模式(factory——简单工厂模式和抽象工厂模式) 1.1、…

Linux干货(二)

前言 从B站黑马程序员Linux课程摘选的学习干货&#xff0c;新手友好&#xff01;若有侵权&#xff0c;会第一时间处理。 目录 前言 1.cd pwd命令 1.cd命令的作用 2.pwd命令的作用 2.相对路径绝对路径和特殊路径符 1.相对路径和绝对路径 1.绝对路径 2.相对路径 2.特殊…

ngx_http_keyval_module动态键值管理

一、模块安装与验证 检查模块是否可用 nginx -V 2>&1 | grep --color -o ngx_http_keyval_module如果看到 ngx_http_keyval_module&#xff0c;说明模块已编译进 NGINX。 若未找到&#xff0c;请联系你的 NGINX 供应商&#xff0c;获取商业版或重新编译并启用该模块&am…

upload-labs通关笔记-第4关 文件上传之.htacess绕过

目录 一、.htacess 二、代码审计 三、php ts版本安装 1、下载ts版本php 2、放入到phpstudy指定文件夹中 3、修改php配置文件 4、修改php.ini文件 5、修改httpd.conf文件 &#xff08;1&#xff09;定位文件 &#xff08;2&#xff09;修改文件 6、重启小皮 7、切换…

LeetCode 88. 合并两个有序数组 | Python 最简写法 + 实战注释

在日常刷题和面试中,「合并两个有序数组」是一个经典基础题。虽然属于简单难度,但它非常考察你的数组操作技巧和代码优化能力。本篇文章将带你从基础解法入手,进阶到最简洁的三元表达式写法,理解每一行代码背后的逻辑。 📌 题目描述 给你两个按 非递减顺序 排列的整数数组…

Kafka进阶指南:从原理到实战

目录 一、Kafka 基础回顾 二、生产者进阶 2.1 数据生产流程深度解析 2.2 关键配置参数详解 2.3 序列化与自定义序列化器 三、消费者进阶 3.1 消费方式与原理 3.2 分区分配策略 3.2.1 Range&#xff08;范围&#xff09;策略 3.2.2 Round - Robin&#xff08;轮询&…

Lightpanda开源浏览器:专为 AI 和自动化而设计的无界面浏览器

​一、软件介绍 文末提供程序和源码下载 Lightpanda开源浏览器&#xff1a;专为 AI 和自动化而设计的无界面浏览器&#xff1b; Javascript execution Javascript 执行Support of Web APIs (partial, WIP)支持 Web API&#xff08;部分、WIP&#xff09;Compatible with Pla…

团结引擎开源车模 Sample 发布:光照渲染优化 动态交互全面体验升级

光照、材质与交互效果的精细控制&#xff0c;通常意味着复杂的技术挑战&#xff0c;但借助 Shader Graph 14.1.0(已内置在团结引擎官方 1.5.0 版本中)&#xff0c;这一切都变得简单易用。通过最新团结引擎官方车模 Sample&#xff0c;开发者能切身感受到全新光照优化与编辑功能…

SpringCloud之Ribbon基础认识-服务负载均衡

0、Ribbon基本认识 Spring Cloud Ribbon 是基于 Netflix Ribbon 实现的一套客户端 负载均衡的工具。 Ribbon 主要功能是提供客户端负载均衡算法和服务调用 Ribbon 客户端组件提供一系列完善的配置项如连接超时&#xff0c;重试等。 Ribbon 会基于某种规则&#xff08;如简单…

当 DeepSeek 遇见区块链:一场颠覆式的应用革命

目录 一、DeepSeek 与区块链的初印象二、技术融合&#xff1a;创新的基石2.1 强化学习优化智能合约2.2 混合专家系统适配多链2.3 语义理解增强合规性 三、应用实践&#xff1a;重塑行业格局3.1 DeFi 协议智能化跃迁3.2 GameFi 经济深度进化3.3 供应链金融信任增强 四、面临挑战…