12、MongoDB -- 通过 SpringBoot 整合 Spring Data MongoDB 操作 MongoDB 数据库(传统的同步API编程)

目录

  • 通过 SpringBoot 整合 Spring Data MongoDB 操作 MongoDB 数据库(传统的同步API编程)
    • 演示前提:
      • 登录单机模式的 mongodb 服务器命令
      • 登录【test】数据库的 mongodb 客户端命令
      • 登录【admin】数据库的 mongodb 客户端命令
    • 代码演示同步API编程
      • 实体类
      • 配置类
      • 方法名关键字查询和@Query查询的接口
      • 自定义查询的接口
        • 自定义查询接口的实现类
          • 要求书名【name】匹配这个这个正则表达式【nameRegex】,且价格【price】大于这个【startPrice】
          • 查询价格在这个范围的文档
      • 测试方法
      • 测试结果
    • 完整代码
      • Book 实体类
      • SyncBookDao 方法名关键字查询和@Query查询接口
      • SyncCustomBookDao 自定义查询接口
      • SyncCustomBookDaoImpl 自定义查询方法的实现类
      • application.properties 配置类
      • SyncBookDaoTest 测试类方法
      • pom.xml 依赖文件

通过 SpringBoot 整合 Spring Data MongoDB 操作 MongoDB 数据库(传统的同步API编程)

演示前提:


登录单机模式的 mongodb 服务器命令

mongod.exe --config "E:\install\mongodb\mongodb-4.2.25\mongod.conf"

在这里插入图片描述


将 MongoDB 注册成 Windows 服务器

为了方便,我们可以以管理员的身份打开命令行窗口,来执行如下命令可将 MongoDB 注册成 Windows 服务器,就不用每次都用命令启动 mongodb 服务器

mongod.exe --config "E:\install\mongodb\mongodb-4.2.25\mongod.conf" --install

在这里插入图片描述


登录【test】数据库的 mongodb 客户端命令

mongo mongodb://192.168.0.107:27017/test -u LJHAAA -p 123456

在这里插入图片描述


登录【admin】数据库的 mongodb 客户端命令

mongo mongodb://192.168.0.107:27017/admin -u admin -p 123456

在这里插入图片描述


MongoDB–通过SpringBoot整合Spring Data MongoDB操作MongoDB数据库(反应式(异步)编程演示: 方法名关键字查询、@Query查询、自定义查询、样本查询)这篇文章是通过反应式异步编程来演示的。


接下来演示传统的同步API编程:

区别:

异步的DAO接口是继承这个【ReactiveCrudRepository】接口
同步的DAO接口是继承这个【CrudRepository 】接口



代码演示同步API编程


实体类

在这里插入图片描述


配置类

在这里插入图片描述


方法名关键字查询和@Query查询的接口

在这里插入图片描述


自定义查询的接口

在这里插入图片描述


自定义查询接口的实现类

要求书名【name】匹配这个这个正则表达式【nameRegex】,且价格【price】大于这个【startPrice】

在这里插入图片描述


查询价格在这个范围的文档

在这里插入图片描述
在这里插入图片描述


测试方法

具体可以参考上一篇的基于反应式的异步API

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


测试结果

全部都测试通过

在这里插入图片描述

mongodb 数据库的books集合的数据

在这里插入图片描述



完整代码


Book 实体类

package cn.ljh.mongoboot.domain;import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.index.TextIndexed;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
import org.springframework.data.mongodb.core.mapping.FieldType;
import org.springframework.data.mongodb.core.mapping.MongoId;/*** author JH  2024-03*///映射到mongodb数据库里面的【books】集合
@Document("books")
@Data
public class Book
{// id 的类型定义成String,灵活性比较大// @MongoId(FieldType.INT64)//普通的 @Id 注解更合适@Idprivate String id;//给【name】字段建立索引@Indexedprivate String name;@Indexedprivate double price;private String author;//表示 【desc】 字段映射到数据库集合中的【description】字段列@Field("description")@TextIndexed  //目前全文检索默认不支持中文private String desc;//无参构造器public Book(){}//有参构造器public Book( String name, double price, String author, String desc){this.name = name;this.price = price;this.author = author;this.desc = desc;}
}

SyncBookDao 方法名关键字查询和@Query查询接口

package cn.ljh.mongoboot.dao;import cn.ljh.mongoboot.domain.Book;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.QueryByExampleExecutor;
import java.util.List;//继承这个传统的同步API ---> CrudRepository//类型参数1:操作的实体类  ; 类型参数2:实体类的主键类型
public interface SyncBookDao extendsCrudRepository<Book, String>,QueryByExampleExecutor<Book>, //样本查询的接口SyncCustomBookDao //自定义的查询方法的接口
{//===================================================方法名关键字查询(全自动)==========================================//返回值为 Flux ,表示接收多个返回值 ;  返回值为 Mono ,表示接收单个返回值//根据【关键字】,查询【name】字段包含该关键字的文档List<Book> findByName(String name);//根据【关键字】,对【price】字段的值进行范围查询List<Book> findByPriceBetween(double startPrice, double endPrice);//根据【关键字】,通过【通配符】形式查询【author】字段包含该关键字的文档List<Book> findByAuthorLike(String authorPattern);//根据【关键字】,通过【正则表达式】方式查询【name】字段包含该关键字的文档List<Book> findByNameRegex(String name);//查询【price】字段的值大于指定参数值(关键字)的文档【有几条】Integer countByPriceGreaterThan(double startPrice);//===================================================@Query查询(半自动)==============================================//通过关键字 term 对文档进行全文检索@Query("{$text: {$search: ?0}}")List<Book> findByText(String term);//通过 【author】字段 和 【price】价格大于指定参数值 来查询文档@Query("{author: ?0 ,price:{$gt: ?1}}")List<Book> findByQuery(String author, double startPrice);}

SyncCustomBookDao 自定义查询接口

package cn.ljh.mongoboot.dao;import cn.ljh.mongoboot.domain.Book;
import reactor.core.publisher.Flux;import java.util.List;//自定义查询方法的接口public interface SyncCustomBookDao
{//要求书名【name】匹配这个这个正则表达式【nameRegex】,且价格【price】大于这个【startPrice】List<Book> findByCustomRegexAndPrice(String nameRegex , double startPrice);//查询价格在这个范围的文档List<Book> findByCustomPrice(double startPrice , double endPrice);}

SyncCustomBookDaoImpl 自定义查询方法的实现类

package cn.ljh.mongoboot.dao.impl;import cn.ljh.mongoboot.dao.SyncCustomBookDao;
import cn.ljh.mongoboot.domain.Book;
import com.mongodb.BasicDBObject;
import com.mongodb.client.MongoCursor;
import org.bson.Document;
import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import reactor.core.publisher.Flux;import java.util.ArrayList;
import java.util.List;public class SyncCustomBookDaoImpl implements SyncCustomBookDao
{@Autowiredprivate MongoTemplate mongoTemplate;@Overridepublic List<Book> findByCustomRegexAndPrice(String nameRegex, double startPrice){//Spring Data MongoDB 提供了一个 Criteria类 来构建 query 这个查询对象// where是Criteria类的一个静态方法,用于指定要查询的字段或属性// Criteria.where("name")表示对"name"字段进行查询操作,// .regex(nameRegex)表示使用正则表达式进行匹配,nameRegex是传入的名称的正则表达式// .and("price")表示在上述查询条件的基础上再加入"price"字段的查询条件// .gt(startPrice)表示查询大于给定起始价格的值Query query = Query.query(Criteria.where("name").regex(nameRegex) //查询条件1.and("price").gt(startPrice));  //查询条件2//query:代表查询条件 ; Book.class:要查询的实体对象List<Book> books = mongoTemplate.find(query, Book.class);return books;}@Overridepublic List<Book> findByCustomPrice(double startPrice, double endPrice){//.execute 方法用来执行一个MongoDB查询操作//mongoCollection,来自 MongoDB的驱动 API ,代表一个 collectionList<Book> bList = mongoTemplate.execute(Book.class, mongoCollection ->{//自定义的查询条件是这样的:{price: { $gt: startPrice , $lt:endPrice }}//这个BasicDBObject 就是代表查询条件中的一个对象BasicDBObject cond = new BasicDBObject();//给这个对象设置查询条件,就能得到这个 { $gt: startPrice , $lt:endPrice }cond.put("$gt", startPrice);cond.put("$lt", endPrice);//再创建一个对象BasicDBObject bson = new BasicDBObject();//再把查询条件设置进去,就得到这个 {price: { $gt: startPrice , $lt:endPrice }} 查询对象bson.put("price", cond);MongoCursor<Document> docs = mongoCollection.find(bson).iterator();//将 docs 里面的每个 document 转换成 Book ,并存到List之后再返回List<Book> bookList = new ArrayList<>();while (docs.hasNext()){Document document = docs.next();Book book = new Book((String) document.get("name"),(Double) document.get("price"),(String) document.get("author"),(String) document.get("description"));//因为 id 有普通的string类型,也有 objectId 类型,所以需要做判断Object id = document.get("_id");//如果 id 是 ObjectId 类型; instanceof是Java中的一个运算符,用于检查一个对象是否属于某个特定的类型或其子类型if (id instanceof ObjectId){ObjectId obId = (ObjectId) id;//toHexString是ObjectId类的一个方法,用于将ObjectId对象转换为十六进制字符串表示形式book.setId(obId.toHexString());} else{book.setId((String) id);}bookList.add(book);}return bookList;});return bList;}
}

application.properties 配置类

# 连接mongodb数据库
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=test
spring.data.mongodb.username=LJHAAA
spring.data.mongodb.password=123456# 指定 spring.data.mongodb 根据实体类Book的字段上的索引注解(@Indexed@TextIndexed )来创建索引
spring.data.mongodb.auto-index-creation=true

SyncBookDaoTest 测试类方法

package cn.ljh.mongoboot.dao;import cn.ljh.mongoboot.domain.Book;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.ValueSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.ExampleMatcher;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;import java.util.List;
import java.util.Optional;/*** author JH  2024-03*///表示不要用web环境来进行测试
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class SyncBookDaoTest
{//依赖注入@Autowiredprivate SyncBookDao bookDao;//==============================================增删改查==============================================================//添加一个文档到books集合里面,该文档的id为自己指定的@ParameterizedTest //表示这个方法是一个参数化的测试//需要多个参数进行测试,用这个注解@CsvSource({//因为 mongodb 目前不支持中文进行全文检索,所以把内容写成英文来测试"1,火影忍者,100,岸本齐史,this cartoon is very good"})public void testSaveWithId(String id, String name, double price, String author, String desc){Book b = new Book(name, price, author, desc);//自己设置idb.setId(id);Book book = bookDao.save(b);System.err.println(book);}//添加多个文档到books集合里面,该文档的id为mongodb自己指定的//表示这个方法是一个参数化的测试@ParameterizedTest//需要多个参数进行测试,用这个注解@CsvSource({"家庭教师,200,天野明,aa this cartoon is jiatingjiaoshi","七龙珠,300,鸟山明,aa this cartoon is very qilongzhu","蜡笔小新,400,臼井仪人,bb this cartoon is very labixiaoxin"})public void testSaveWithId(String name, double price, String author, String desc){Book b = new Book(name, price, author, desc);Book book = bookDao.save(b);System.err.println(book);}//根据id查询文档@ParameterizedTest//测试方法只需要一个参数用这个注解@ValueSource(strings = {"1","65eda80aec60bd4deae6f38b"})public void testFindById(String id){Optional<Book> book = bookDao.findById(id);System.err.println(book);}//对文档进行修改@Testpublic void testUpdate(){Optional<Book> b = bookDao.findById("1");//如果Optional对象中存在图书对象,则执行ifPresent中的逻辑b.ifPresent(//使用Lambda表达式的方式对查找到的图书进行操作book ->{//进行修改操作book.setName(book.getName() + "AAAAA");//使用.block()方法阻塞当前线程,直到保存操作完成。这样确保更新操作在调用block()之前完成,并且等待操作结果返回bookDao.save(book);});}//根据id查询文档@ParameterizedTest//测试方法只需要一个参数用这个注解@ValueSource(strings = {"1",})public void testDeleteById(String id){bookDao.deleteById(id);}//==============================================方法名关键字查询(全自动查询)============================================//根据名字查询文档//表示这个方法是一个参数化的测试方法@ParameterizedTest//只需要一个参数用这个注解@ValueSource(strings = {"火影忍者","七龙珠"})public void testFindByName(String name){List<Book> books = bookDao.findByName(name);books.forEach(System.err::println);}//根据价格范围查询@ParameterizedTest@CsvSource({"50,250","150,450"})public void testFindByPriceBetween(double startPrice, double endPrice){List<Book> books = bookDao.findByPriceBetween(startPrice, endPrice);books.forEach(System.err::println);}//根据【author】字段进行【通配符】查询@ParameterizedTest@ValueSource(strings = {"天*","岸*"})public void testFindByAuthorLike(String authorPattern){List<Book> books = bookDao.findByAuthorLike(authorPattern);books.forEach(System.err::println);}//通过名字来进行正则表达式查询@ParameterizedTest@ValueSource(strings = {// ^ 符号表示开头,表示必须由【火】字开头; 这个 . 这个点表示匹配任意字符;  $ 符号表示结尾"^火.+$",//^ . 表示任意符号开头,中间包含【小】,后面的.表示任意符号结尾"^.+小.+$"})public void testFindByNameRegex(String name){List<Book> books = bookDao.findByNameRegex(name);books.forEach(System.err::println);}//查询价格大于指定参数值的文档有几条@ParameterizedTest@ValueSource(doubles = {100.0,200.0})public void testCountByPriceGreaterThan(double startPrice){System.err.println("price 大于【 " + startPrice + " 】的文档有【 " + bookDao.countByPriceGreaterThan(startPrice) + " 】条");}//===================================================@Query查询(半自动)==============================================//通过关键字 term 对文档进行全文检索@ParameterizedTest@ValueSource(strings = {"good","aa"})public void testFindByText(String term){List<Book> books = bookDao.findByText(term);books.forEach(System.err::println);}//通过 作者 和 价格大于指定参数值 来查询文档@ParameterizedTest@CsvSource({"天野明,50","天野明,500"})public void testFindByQuery(String author, double startPrice){List<Book> books = bookDao.findByQuery(author, startPrice);books.forEach(System.err::println);}//==============================================自定义查询(全手动查询)=================================================//要求书名【name】匹配这个这个正则表达式【nameRegex】,且价格【price】大于这个【startPrice】@ParameterizedTest@CsvSource({//^ 表示开头 , 点 . 表示任意字符 ,$ 表示结尾 :全部就是以任意字符开头,然后中间有个【影】字,然后以任意字符结尾"^.+影.+$ , 50","^.+教.+$, 50"})public void testFindByCustomRegexAndPrice(String nameRegex, double startPrice){List<Book> books = bookDao.findByCustomRegexAndPrice(nameRegex, startPrice);books.forEach(System.err::println);}//查询价格在这个范围的文档@ParameterizedTest@CsvSource({"99,199","199,399"})public void testFindByCustomPrice(double startPrice, double endPrice){List<Book> books = bookDao.findByCustomPrice(startPrice, endPrice);books.forEach(System.err::println);}//==============================================样本查询=============================================================@ParameterizedTest@CsvSource({"火影忍者,岸本齐史","家庭教师,天野明明明"})public void testByExanple(String name, String author){//构建一个样本查询的对象Example<Book> example = Example.of(new Book(name, 0.0, author, null),ExampleMatcher.matching().withIgnoreNullValues() //忽略 null 属性.withIgnorePaths("price") //忽略 price 属性);Iterable<Book> books = bookDao.findAll(example);books.forEach(System.err::println);}}

pom.xml 依赖文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.3</version></parent><groupId>cn.ljh</groupId><artifactId>mongoboot</artifactId><version>1.0.0</version><name>mongoboot</name><properties><java.version>11</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!-- 同步的 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency><!-- 反应式 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb-reactive</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>io.projectreactor</groupId><artifactId>reactor-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>


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

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

相关文章

【海贼王的数据航海】排序——概念|直接插入排序|希尔排序

目录 1 -> 排序的概念及其运用 1.1 -> 排序的概念 1.2 -> 常见的排序算法 2 -> 插入排序 2.1 -> 基本思想 2.2 -> 直接插入排序 2.2.1 -> 代码实现 2.3 -> 希尔排序(缩小增量排序) 2.3.1 -> 代码实现 1 -> 排序的概念及其运用 1.1 -&g…

QT下跨平台库实现及移植经验分享

最近在移植公司一个QT桌面软件到android上&#xff0c;有一些公司自定义的库&#xff0c;用了很多windows的api&#xff0c;移植过程很是曲折&#xff0c;在此有一些感悟分享一下~ 一.自编写跨平台库 1.有时候为了程序给第三方用需要编译一些qt封装库&#xff0c;并可能跨平台…

学python新手如何安装pycharm;python小白如何安装pycharm

首先找到官网&#xff1a; Download PyCharm: The Python IDE for data science and web development by JetBrains 打开后选择下载&#xff0c;下图标红部分 点击exe程序&#xff0c;点击下一步&#xff01; 选择安装路径&#xff0c;下一步 弹出界面全选 选择默认 然后直接…

解锁数据潜力:OceanBase国产数据库学习不容错过的秘密!

介绍&#xff1a;OceanBase是一款由阿里巴巴和蚂蚁金服自主研发的通用分布式关系型数据库&#xff0c;它专为企业级应用而设计&#xff0c;具有金融级别的可靠性。以下是对OceanBase的详细介绍&#xff1a; 高可用性&#xff1a;OceanBase通过实现Paxos多数派协议和多副本特性&…

倒计时30,28天

1.队列Q (nowcoder.com) //1. #include<bits/stdc.h> using namespace std; #define int long long const int N2e56; const int inf0x3f3f3f3f; int dir[13]{0,31,28,31,30,31,30,31,31,30,31,30,31}; const double piacos(-1.0); int a[N],b[N]; bool cmp(int xx,int …

学点Java打小工_Day4_数组_冒泡排序

1 数组基本概念 程序算法数据结构 算法&#xff1a;解决程序的流程步骤 数据结构&#xff1a;将数据按照某种特定的结构来存储 设计良好的数据结构会导致良好的算法。 ArrayList、LinkedList 数组是最简单的数据结构。 数组&#xff1a;存放同一种类型数据的集合&#xff0c;在…

STM32基础--使用寄存器点亮流水灯

GPIO 简介 GPIO 是通用输入输出端口的简称&#xff0c;简单来说就是 STM32 可控制的引脚&#xff0c;STM32 芯片的 GPIO 引脚与外部设备连接起来&#xff0c;从而实现与外部通讯、控制以及数据采集的功能。STM32 芯片的 GPIO被分成很多组&#xff0c;每组有 16 个引脚&#xf…

Apache Paimon系列之:主键表

Apache Paimon系列之&#xff1a;主键表 一、主键表1.Bucket2.LSM Trees3.Compaction 二、数据分布1.固定Bucket2.动态Bucket3.正常动态Bucket模式4.跨分区更新插入动态存储桶模式 三、Merge Engine1.Deduplicate2.部分更新3.序列组4.聚合部分更新5.聚合6.Retract7.First Row 四…

深度强化学习(五)(蒙特卡洛与自举)

深度强化学习&#xff08;五&#xff09;&#xff08;蒙特卡洛与自举&#xff09; 一.蒙特卡洛与自举 上一节介绍了多步 TD 目标。单步 TD 目标、回报是多步 TD 目标的两种特例。如下图所示, 如果设 m 1 m1 m1, 那么多步 TD 目标变成单步 T D \mathrm{TD} TD 目标。如果设…

数据链路层_以太网

IP协议确定数据跨网络从主机A到主机B的路径&#xff0c;即IP协议解决了路径选择问题&#xff0c;但在这之前&#xff0c;必须先解决数据在一个子网内的传输的问题。跨网络的本质就是跨多个子网&#xff0c;只要一个子网内可以通信&#xff0c;那么便可以跨网络通信。 一.以太…

B端界面又丑又乱,也不会总结规范,来,我给5个规范模板,照着学

发5个别人总结的规范&#xff0c;一定会对你的B端系统改进&#xff0c;有帮助的。

地理数据 vs. 3D数据

在表示我们周围的物理世界时&#xff0c;地理空间数据和 3D 建筑数据是两个最常见的选择。 他们在各个行业和项目中发挥着至关重要的作用。 从构建数字孪生到可视化城市景观和创建沉浸式应用程序。 尽管地理空间和 3D 建筑数据有相似之处&#xff0c;但它们不可互换。 虽然地…

安装snap再安装flutter再安装localsend@Ubuntu(FreeBSD下未成功)

Localsend介绍 localsend是一个跨平台的文件传送软件&#xff0c;可以在Windows、MacOS、Linux、Android和IOS下互相传送文件&#xff0c;只要在同一个局域网即可。 localsend官网&#xff1a;LocalSend 尝试安装localsend&#xff0c;发现需要使用flutter&#xff0c; 安装f…

ubuntu 安装 infiniband 和 RoCE 驱动

下载驱动程序 驱动程序地址 https://network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/ 安装 安装参考文档 https://docs.nvidia.com/networking/display/mlnxofedv24010331/installing+mlnx_ofed#src-2571322208_InstallingMLNX_OFED-InstallationProced…

三次握手seq和ack的流程 TCP协议栈seq和ack深层理解

☆ 大家可以把想了解的问题在评论发给我?我会根据问题补充到后面 ☆ 三次握手seq和ack的流程 是的,在TCP/IP协议中,三次握手过程确实涉及到序列号(Sequence Number, 简称Seq)和确认号(Acknowledgment Number, 简称Ack)的交换。这个过程是为了建立可靠的连接,确保数据能…

多人聊天室 (epoll - Linux网络编程)

文章目录 零、效果展示一、服务器代码二、客户端代码三、知识点1.connect()2.socket()3.bind()4.send()5.recv() 四、改进方向五、跟练视频 零、效果展示 一个服务器作为中转站&#xff0c;多个客户端之间可以相互通信。至少需要启动两个客户端。 三个客户端互相通信 一、服务…

【复现】通天星CMS 安全监控云平台 SQL注入漏洞_64

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 通天星CMSV6拥有以位置服务、无线3G/4G视频传输、云存储服务为核心的研发团队&#xff0c;专注于为定位、无线视频终端产品提供平…

C#,T检验(T -Test)的算法与源代码

1 T-Test 学生t检验(英语:Students t-test)是指虚无假设成立时的任一检定统计有学生t-分布的统计假说检定,属于母数统计。学生t检验常作为检验一群来自正态分配母体的独立样本之期望值的是否为某一实数,或是二群来自正态分配母体的独立样本之期望值的差是否为某一实数。举…

突破编程_前端_JS编程实例(工具栏组件)

1 开发目标 工具栏组件旨在模拟常见的桌面软件工具栏&#xff0c;所以比较适用于 electron 的开发&#xff0c;该组件包含工具栏按钮、工具栏分割条和工具栏容器三个主要角色&#xff0c;并提供一系列接口和功能&#xff0c;以满足用户在不同场景下的需求&#xff1a; 点击工具…

初识Spring MVC

什么是Spring MVC? 官方给的解释是 Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;从⼀开始就包含在 Spring 框架中。它的 正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc)&#xff0c;但它通常被称为"Spring MVC" 注:Severlet是…