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

Spring5学习笔记之整合MyBatis

Springgif.gif

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉
🍎个人主页:Leo的博客
💞当前专栏: Spring专栏
✨特色专栏: MySQL学习
🥭本文内容:Spring5学习笔记之整合MyBatis
🖥️个人小站 :个人博客,欢迎大家访问
📚个人知识库: 知识库,欢迎大家访问

学习参考 :

  • 讲师:孙帅老师
  • 课程:孙哥说Spring5

1.前言

在我们之前的系列文章中,我们已经深入探讨了Spring5的两大核心组件:IOC 和 AOP,它们是Spring框架的基石。下面我们接着讨论开始讨论Spring5对于持久层框架MyBatis的整合,让我们一起开启新的的篇章吧。

2.准备工作

在开始之前,确保您已经安装了以下软件:

  • JDK 1.8或更高版本
  • Maven3.8+
  • Eclipse或IntelliJ IDEA(或您最喜欢的Java IDE)
  • MySQL8.0
  • MyBatis3.5

3.为什么要整合持久层?

Spring整合持久层的主要目的是为了简化和提高应用程序的开发和维护效率,以及提供更好的可扩展性和可测试性。以下是一些Spring整合持久层的好处:

  1. 降低开发复杂性:持久层是应用程序中一个重要的组成部分,负责数据的存储和访问。通过Spring整合持久层,可以使用Spring提供的一致的编程模型和API,简化数据库操作和事务管理的代码,减少开发人员的工作量和复杂性。
  2. 提供事务管理: 持久层通常需要处理事务,确保数据的一致性和完整性。Spring提供了强大的事务管理功能,可以通过声明式事务管理或编程式事务管理来管理事务。整合持久层后,可以轻松地配置和管理事务,而无需手动编写繁琐的事务管理代码。
  3. 支持多种持久化技术: Spring整合持久层提供了对多种持久化技术的支持,如关系型数据库(如MySQL、Oracle)、NoSQL数据库(如MongoDB、Redis)、对象关系映射(ORM)框架(如Hibernate、MyBatis)等。这使得开发人员可以根据项目需求选择合适的持久化技术,并无缝地集成到应用程序中。
  4. 提供数据访问抽象层: Spring提供了一套数据访问抽象层,即Spring Data,它简化了对数据的访问和操作。通过Spring Data,可以使用简洁的API进行常见的数据访问操作,如查询、插入、更新和删除等。Spring Data还提供了对分页、排序、缓存等功能的支持,进一步提高了开发效率。
  5. 支持依赖注入和面向切面编程: Spring的核心特性之一是依赖注入(DI)和面向切面编程(AOP)。通过整合持久层,可以将持久层组件作为Spring的bean进行管理,并通过依赖注入将其注入到其他组件中。同时,可以使用AOP功能来实现横切关注点,如日志记录、性能监控等。
  6. 企业级应用的需求:在JavaEE的开发中,数据存储和管理是不可或缺的部分,尤其当涉及到大量的用户信息、交易记录、商品数据等。为了确保数据的一致性、安全性和高效性,我们需要一种可靠的方法来访问和操作数据库,这就是持久层的职责。

综上所述,Spring整合持久层可以简化开发工作,提供事务管理、多种持久化技术的支持,提供数据访问抽象层,并支持依赖注入和面向切面编程。这些优势使得应用程序更易于开发、维护和扩展,提高了开发效率和代码质量。

4.Spring能与哪些持久层技术整合?

Spring可以与多种持久层技术进行整合,包括但不限于以下几种:

  1. JDBC: Spring提供了JdbcTemplate等工具类来简化JDBC的使用。它提供了一种更简单、更安全、更可靠的方式来执行SQL语句并处理结果集。
  2. ORM框架: Spring与多个ORM框架(对象关系映射)提供商进行了整合,包括Hibernate、MyBatis、JPA等。通过Spring的整合,可以使用ORM框架来简化数据库操作,提供对象级别的持久化。
  3. JPA(Java Persistence API): Spring提供了对JPA的支持,可以通过配置和注解的方式来定义实体类与数据库表之间的映射关系,使用JPA进行对象的持久化操作。
  4. NoSQL数据库: Spring还可以与各种NoSQL数据库进行整合,如MongoDB、Redis、Cassandra等。通过Spring Data模块,可以使用统一的API和命名约定来进行数据访问和操作。
  5. Spring Data JPA: Spring Data JPA是Spring对JPA的扩展,提供了更高级的功能和更简化的API。它结合了Spring和JPA的特性,使得使用JPA更加便捷。
  6. Spring Data JDBC: Spring Data JDBC是Spring对JDBC的扩展,提供了一种更简单的方式来进行JDBC操作。它通过注解和命名约定来进行数据库表和实体类之间的映射,简化了JDBC的使用。
  7. Hibernate (JPA): Hibernate是一个流行的ORM(对象关系映射)框架,而JPA(Java持久化API)是Java平台上的一个规范,Hibernate是JPA的一种实现。Spring为Hibernate提供了HibernateTemplate工具,它可以简化许多常见的Hibernate操作,并且为我们处理事务、会话等常见问题。使用Spring与Hibernate的整合,开发者可以轻松地将数据库记录映射到Java对象,并执行持久化操作。
  8. MyBatis: MyBatis是另一个流行的持久层框架,它允许开发者直接编写SQL,同时提供了灵活的结果映射功能。Spring为MyBatis提供了一系列工具,如SqlSessionFactoryBean和MapperScannerConfigurer,这些工具旨在简化MyBatis配置和使用过程。通过整合,开发者可以在Spring应用中方便地使用MyBatis的特性,同时享受Spring提供的事务管理、依赖注入等功能。

总之,Spring可以与多种持久层技术进行整合,通过提供统一的API和工具类,简化了数据访问和持久化操作的开发工作。无论是关系型数据库还是NoSQL数据库,都可以方便地与Spring整合使用。

5.Spring与MyBatis整合步骤

5.1 MyBatis步骤回顾

MyBatis原生的开发一共有如下几个步骤

1.实体
2.实体别名
3.数据表
4.创建DAO接口
5.实现Mapper文件
6.注册Mapper文件
7.MyBatisAPI的调用

5.2 整合步骤

1.创建Maven项目

首先,我们需要创建一个Maven项目。打开IDEA,选择自己的工作目录,点击确定即可:

image-20231019211823353

创建一个名为Leo-spring-mybatis的新Maven项目。

2.添加依赖项

打开pom.xml文件,并添加以下依赖项:

<dependencies><!-- Spring dependencies --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.9</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.9</version></dependency><!-- MyBatis dependencies --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.7</version></dependency><!-- Database driver --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.26</version></dependency>
</dependencies>

这些依赖项将添加所需的Spring和MyBatis库以及MySQL数据库驱动程序。

3.配置配置文件

src/main/resources目录下创建一个名为mybatis-config.xml的新文件,并添加以下内容:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><typeAliases><typeAlias type="org.javatop.pojo.User" alias="User"/></typeAliases><environments default="default"><environment id="default"><transactionManager type="JDBC" /><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver" /><property name="url" value="jdbc:mysql://localhost:3306/teach-spring5?useSSL=false"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><!--<package name=""--><mapper resource="UserMapper.xml"/></mappers></configuration>

在这个文件中,我们配置了一个dataSource bean,它使用MySQL数据库的连接信息。然后,我们配置了一个sqlSessionFactory bean,它使用dataSource bean并指定了MyBatis映射文件的位置。最后,我们配置了一个sqlSession bean,它使用sqlSessionFactory bean。

4.创建数据库表以及实体类

SQL语句

CREATE TABLE `user` (`id` int NOT NULL AUTO_INCREMENT COMMENT '编号',`name` varchar(255) DEFAULT NULL COMMENT '名称',`email` varchar(255) DEFAULT NULL COMMENT '邮箱',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1003 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

src/main/java/com/integration目录下创建一个名为User.java的新Java类,并添加以下内容:

package org.javatop.integration;/*** @author : Leo* @version 1.0* @date 2023-10-19 21:37* @description : User实体类*/
public class User {private Integer id;private String name;private String email;public User() {}public User(Integer id, String name, String email) {this.id = id;this.name = name;this.email = email;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", email='" + email + '\'' +'}';}
}

这是一个简单的User类,它包含id、name和email字段,并提供了相应的getter和setter方法以及toString方法。

5.创建数据访问对象(mapper)

src/main/java/com/integration目录下创建一个名为UserDao.java的新Java接口,并添加以下内容:

package org.javatop.integration.mappper;
import org.javatop.integration.pojo.User;
import java.util.List;/*** @author : Leo* @version 1.0* @date 2023-10-19 21:43* @description : UserMapper*/
public interface UserMapper {/*** 通过用户ID查询用户* @param id 用户ID* @return 用户信息*/User getUserById(int id);/*** 查询所有用户* @return 全部用户信息*/List<User> getAllUsers();/*** 添加用户* @param user 用户*/void insertUser(User user);/*** 更新用户* @param user 用户*/void updateUser(User user);/*** 删除用户* @param id 用户id*/void deleteUser(int id);
}

这个接口定义了一些用于操作User对象的方法。

6.创建MyBatis映射文件

src/main/resources/org/javatop/integration/mapper目录下创建一个名为UserMapper.xml的新文件,并添加以下内容:

<mapper namespace="com.integration.mappers.UserMapper"><select id="getUserById" resultType="com.integration.User">SELECT * FROM users WHERE id = #{id}</select><select id="getAllUsers" resultType="com.integration.User">SELECT * FROM users</select><insert id="insertUser" parameterType="com.integration.User">INSERT INTO users (name, email) VALUES (#{name}, #{email})</insert><update id="updateUser" parameterType="com.integration.User">UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}</update><delete id="deleteUser" parameterType="int">DELETE FROM users WHERE id = #{id}</delete>
</mapper>

这个文件定义了一些SQL语句,用于查询、插入、更新和删除用户数据。

7.测试应用程序

test/org/javatop/目录下创建TestMyBatis测试类编写测试方法

/*** 用于测试: 查询所有用户*/@Testpublic void test01() throws IOException {InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);List<User> userList = userMapper.getAllUsers();for (User user : userList) {System.out.println("user = " + user);}}

控制台打印结果:

image-20231019221207683

5.3 结论

我们详细介绍了如何使用Spring 5整合MyBatis框架来构建一个完整的Java应用程序。我们学习了如何配置Spring和MyBatis,创建数据模型,实现数据访问对象和服务层,以及创建控制器来处理HTTP请求。最后,我们测试了应用程序的不同功能。希望这篇博客对您有所帮助!

5.4 原生MyBatis存在的问题配置繁琐:

  1. 实体别名注册: 在MyBatis中,为每个实体类定义别名可以使XML映射文件中的代码更加简洁。但当有大量实体类时,手动为每一个实体类设置别名会非常繁琐。
  2. Mapper文件注册: 在配置MyBatis时,我们需要为每个Mapper XML文件进行注册,这使得配置文件变得冗长,难以管理。
    包扫描:虽然现代版本的MyBatis提供了package属性来自动扫描别名,但在之前的版本中这是不支持的,增加了使用的复杂性。
    代码冗余:
  3. API调用: 在使用MyBatis API进行数据库操作时,我们往往需要执行多个步骤,包括获取SqlSession、执行操作、处理异常和关闭SqlSession等。这些操作在每次数据库访问时都需要重复,导致代码冗余。
  4. 资源管理: 虽然MyBatis为我们提供了资源的自动管理,但在某些情况下,开发者仍需要手动管理数据库连接、会话等资源,这增加了开发的复杂性。
  5. 异常处理: 在使用MyBatis进行数据库操作时,可能会抛出多种异常。处理这些异常需要额外的代码,使得主逻辑变得不那么清晰。

6.总结

以上便是本文的全部内容,本人才疏学浅,文章有什么错误的地方,欢迎大佬们批评指正!我是Leo,一个在互联网行业的小白,立志成为更好的自己。

如果你想了解更多关于Leo,可以关注公众号-程序员Leo,后面文章会首先同步至公众号。

相关文章:

Spring5学习笔记之整合MyBatis

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Spring专栏 ✨特色专栏&#xff1a; M…...

GO 语言的方法??

GO 中的方法是什么&#xff1f; 前面我们有分享到 GO 语言的函数&#xff0c;他是一等公民&#xff0c;那么 GO 语言中的方法和函数有什么区别呢&#xff1f; GO 语言中的方法实际上和函数是类似的&#xff0c;只不过在函数的基础上多了一个参数&#xff0c;这个参数在 GO 语…...

【JavaEE】 多线程-初阶

多线程-初阶 1. 认识线程 1.1 概念 1) 线程是什么 多个线程组成了一个进程&#xff0c;线程好比是一跟光纤中的一个玻璃丝&#xff0c;进程是整根光纤。 一个进程中的线程共享这个进程中的资源&#xff08;内存、硬盘&#xff09; 2) 为什么需要线程 单核CPU发展出现瓶颈…...

小程序OCR身份证识别

使用两种OCR识别&#xff1a;小程序和腾讯云 1.基于微信小程序OCR插件实现身份证拍照、上传并OCR识别的示例&#xff1a; 首先&#xff0c;在小程序中添加身份证拍照的功能&#xff0c;可以使用wx.chooseImage()选择照片并使用wx.uploadFile()上传&#xff0c;代码如下&#…...

【算法学习】归并算法Merge Sort总结

归并排序思路简单&#xff0c;速度仅次于快速排序&#xff0c;为稳定排序算法&#xff0c;一般用于对总体无序&#xff0c;但是各子项相对有序的数列。 1. 基本思想 归并排序使用分治思想&#xff0c;分治模式下每一层递归有三个步骤&#xff1a; 分解&#xff08;divide)&a…...

Swager如何使用

Swager是一个API文档自动生成工具&#xff0c;可以用于生成API接口文档&#xff0c;供开发者和用户查看和使用。它可以通过描述API接口的规范&#xff0c;自动生成API文档&#xff0c;使得API接口的发布和使用变得更加简单和规范。 下面是使用Swagger的步骤&#xff1a; 首先…...

DHorse v1.4.2 发布,基于 k8s 的发布平台

版本说明 优化特性 在集群列表增加集群版本&#xff1b;修改Jvm的GC指标名&#xff1b; 解决问题 解决shell脚本换行符的问题&#xff1b;解决部署历史列表页&#xff0c;环境名展示错误的问题&#xff1b;解决指标收集功能的异常&#xff1b; 升级指南 升级指南 DHorse…...

Java使用JJWT令牌

最近在B站大学学习Java开发&#xff0c;刚好学到登入验证&#xff0c;在使用JJWT令牌时踩了一些坑&#xff0c;在这里把代码和依赖给出&#xff0c;希望后来者得以借鉴。 依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api&l…...

“第四十四天”

这道题也不是难&#xff0c;但可能会忽略一种情况&#xff0c;当最大小出现在首位的时候&#xff0c;那个时候如果进行交换的话&#xff0c;大小值可能出现覆盖的情况&#xff0c;最终导致丢失最大值或者最小值&#xff0c;比如最大值 10 在第一位&#xff0c;最小值 0 随意&am…...

Unity Mono和.Net平台浮点算法的区别

static void TestFloat(){{//float speed2.0f/20;float speed 0.1f;float distance 2.0f;long needTime (long)(distance / speed);Log.Debug($"needTime{needTime}"); #if UNITY_EDITORif (needTime ! 19) #elseif (needTime ! 20)//.Net服务器和安卓手机 #endif…...

【SA8295P 源码分析 (二)】64 - QNX 与 Android GVM 显示 Dump 图片方法汇总

【SA8295P 源码分析】64 - QNX 与 Android GVM 显示 Dump 图片方法汇总 一、QNX侧1.1 surfacedump 功能1.2 screenshot 功能二、Android GVM 侧2.1 screencap -p 导出 PNG 图片2.2 screencap 不加 -p 参数,导出 RGB32 图片2.3 dumpsys SurfaceFlinger --display-id 方法系列文…...

shell命令以及运行原理和lLinux权限

shell命令以及运行原理 什么是shell shell是操作系统的外壳程序统称&#xff0c;我们是通过shell去和操作系统沟通的。 从技术角度&#xff0c;shell最简单的定义就是命令行解释器&#xff0c;主要包含两个功能&#xff1a; 将使用者的命令翻译给核心处理 将核心的处理结果…...

斯坦福JSKarel编程机器人使用介绍

斯坦福JSKarel编程机器人使用介绍 为了避免被编程语言固有的复杂性所困扰&#xff0c;有一个被称为卡雷尔&#xff08;Karel&#xff09;机器人的微型世界&#xff08;microworld&#xff09;的简化环境&#xff0c;可以让编程初学者从中学习理解编程的基本概念&#xff0c;而…...

SpringBoot中pom.xml不引入依赖, 怎么使用parent父项目的依赖

在Spring Boot项目中&#xff0c;如果你想使用父项目的依赖&#xff0c;而不想在pom.xml中显式引入依赖&#xff0c;你可以使用Maven的继承机制。 首先&#xff0c;确保你的Spring Boot项目是一个子项目&#xff0c;即它继承自一个父项目。要实现这一点&#xff0c;在pom.xml文…...

基于vue3+ts5+vue-router4+pinia2的PC端项目搭建教程

导语&#xff1a;在日常开发中&#xff0c;有时候会在项目中引入 ts 来解决一些 js 的问题&#xff0c;下面就简单介绍一下如何使用 vue3tsrouterpinia 来搭建一个项目。 目录 简介创建安装配置实战 简介 vue3 目前是常用的 vue 版本&#xff0c;提供了组合式 API 以及一些新…...

6个无版权、免费、高清图片素材库

找免费无版权图片素材&#xff0c;就上这6个网站&#xff0c;超高质量&#xff0c;可商用&#xff0c;赶紧收藏&#xff01; 1、菜鸟图库 https://www.sucai999.com/pic.html?vNTYwNDUx 网站主要为新手设计师提供免费素材&#xff0c;这些素材的质量都很高&#xff0c;类别也…...

什么是响应式设计?响应式设计的基本原理是什么?如何兼容低版本的 IE?

什么是响应式设计: 响应式设计&#xff08;Responsive Design&#xff09;是一种Web设计和开发方法&#xff0c;旨在使网站在不同设备和屏幕尺寸上都能提供一致的用户体验。响应式设计的目标是适应多种终端&#xff0c;包括桌面计算机、笔记本电脑、平板电脑和移动设备&#x…...

LeetCode 2906. 构造乘积矩阵【前后缀分解,数组】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

vue3+koa+axios实现前后端通信

vue3koaaxios实现前后端通信 写了一个小demo来实现前后端通信,涉及跨域问题&#xff0c;非常简单可以给大家平时开发的时候参考 服务端&#xff1a; 目录结构如下&#xff1a; router index.js // router的入口文件 // 引入路由 const Router require("koa-router&quo…...

Required MultipartFile parameter ‘file‘ is not present

出现这个原因我们首先想到的是加一个RequestParam("file")&#xff0c;但是还有可能的原因是因为我们的名字有错误 <span class"input-group-addon must">模板上传 </span> <input id"uploadFileUpdate" name"importFileU…...

vue3后台管理系统之layout组件的搭建

1.1静态布局 <template><div class"layout_container"><!-- 左侧导航 --><div class"layout_slider"></div><!-- 顶部导航 --><div class"layout_tabbar"></div><!-- 内容展示区 --><…...

Minio 文件上传(后端处理同文件判断,同一文件秒传)

记录minio 文件上传 MinIO提供多个语言版本SDK的支持&#xff0c;下边找到java版本的文档&#xff1a; 地址&#xff1a;https://docs.min.io/docs/java-client-quickstart-guide.html maven依赖如下&#xff1a; XML <dependency><groupId>io.minio</groupId…...

模拟IIC通讯协议(stm32)(硬件iic后面在补)

一、IIC基础知识总结。 1、IIC通讯需要两条线就可以&#xff0c;SCL、SDA。 2、IIC的数据传输的速率&#xff0c;不同的ic是不同的&#xff0c;根据电平维持的延时函数的时间来确定IIC数据传输的速率. 3、IIC的延时函数可以使用延时函数&#xff0c;延时函数一般使用系统滴答时…...

使用注解读取properties配置文件

文章目录 1、背景2、注解方式2.1 PropertySource 、 ConfigurationProperties2.2 读取properties中全部字段值ConfigurationProperties2.3 读取properties中部分字段值&#xff1a;value("${自定义key}") 1、背景 服务中使用到了redis&#xff0c;需要配置redis连接…...

Python---练习:求世界杯小组赛的总成绩(涉及:布尔类型转换为整型)

案例 世界杯案例 需求&#xff1a; 世界杯案例&#xff0c;世界杯小组赛的比赛规则是我们的球队与其他三支球队进行比赛&#xff0c;然后根据总成绩(积分)确定出线资格。小组赛球队实力已知(提示用户输入各球队实力&#xff09;&#xff0c;我们通过一个数字表示。如果我们赢…...

vue3学习源码笔记(小白入门系列)------KeepAlive 原理

目录 说明组件是如何被缓存的&#xff0c;什么时候被激活对于KeepAlive 中组件 如何完成激活的对于KeepAlive 中组件 如何完成休眠的 总结 说明 Vue 内置了 KeepAlive 组件&#xff0c;实现缓存多个组件实例切换时&#xff0c;完成对卸载组件实例的缓存&#xff0c;从而使得组…...

边写代码边学习之mlflow

1. 简介 MLflow 是一个多功能、可扩展的开源平台&#xff0c;用于管理整个机器学习生命周期的工作流程和工件。 它与许多流行的 ML 库内置集成&#xff0c;但可以与任何库、算法或部署工具一起使用。 它被设计为可扩展的&#xff0c;因此您可以编写插件来支持新的工作流程、库和…...

基于吉萨金字塔建造优化的BP神经网络(分类应用) - 附代码

基于吉萨金字塔建造优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于吉萨金字塔建造优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.吉萨金字塔建造优化BP神经网络3.1 BP神经网络参数设置3.2 吉萨金字…...

axios的post请求所有传参方式

Axios支持多种方式来传递参数给POST请求。以下是一些常见的方式&#xff1a; 作为请求体&#xff1a; 你可以将参数作为请求体的一部分&#xff0c;通常用于发送表单数据或JSON数据。例如&#xff1a; const data { key1: value1, key2: value2 }; axios.post(/api/endpoint, …...

【c++】向webrtc学比较2: IsNewerSequenceNumber 用于NackTracker及测试

LatestSequenceNumber inline uint16_t LatestSequenceNumber(uint16_t sequence_number1,uint16_t sequence_number2) {return IsNewerSequenceNumber(sequence_number1, sequence_number2)? sequence_number1: sequen...