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

在SpringBoot项目中集成MongoDB

文章目录

  • 1. 准备工作
  • 2. 在SpringBoot项目中集成MongoDB
    • 2.1 引入依赖
    • 2.2 编写配置文件
    • 2.3 实体类
  • 3. 测试
  • 4. 文档操作
    • 4.1 插入操作
      • 4.1.1 单次插入
      • 4.1.2 批量插入
    • 4.2 查询操作
      • 4.2.1 根据id查询
      • 4.2.2 根据特定条件查询
      • 4.2.3 正则查询
      • 4.2.4 查询所有文档
      • 4.2.5 排序后返回
    • 4.3 删除操作
      • 4.3.1 根据id删除
      • 4.3.2 根据特定条件删除
    • 4.4 修改操作
      • 4.4.1 修改符合条件的第一条文档(updateFirst)
      • 4.4.2 修改符合条件的所有文档(updateMulti)
  • 5. 完整的测试代码

阅读本文前可以先阅读以下文章:

  • MongoDB快速入门(MongoDB简介、MongoDB的应用场景、MongoDB中的基本概念、MongoDB的数据类型、MongoDB的安装与部署、MongoDB的常用命令)
  • MongoDB的常用命令(数据库操作、集合操作、文档操作)

1. 准备工作

假设我们在做一个与自媒体相关的项目,项目引入了 MongoDB 存储与文章的评论数据

数据库名称为 article,集合名称为 comment,以下是可能用到的字段

字段名称字段含义字段类型备注
_idIDObjectId或StringMongoDB文档的唯一标识符,作为主键使用
article_id文章IDString文章的唯一标识符,用于关联评论和文章
content评论内容String用户发表的评论文本内容
user_id评论人IDString发表评论的用户唯一标识符
nickname评论人昵称String发表评论的用户昵称,用于显示在评论列表中
create_time评论的日期时间Date评论创建的时间,格式通常为ISO日期时间格式
like_number点赞数Int32评论获得的点赞数量,反映评论的受欢迎程度
reply_number回复数Int32评论下方的回复数量,反映评论的互动程度
state状态String评论的可见状态,'0’表示评论不可见,'1’表示评论可见
parent_id上级IDString评论的上级评论ID,如果为’0’或空,则表示该评论是顶级评论,没有上级评论

先创建一个名为 article 的数据库

use comment

接着运行以下 SQL,插入测试数据

/*Navicat Premium Data TransferSource Server         : localhostSource Server Type    : MongoDBSource Server Version : 80003 (8.0.3)Source Host           : localhost:27017Source Schema         : testTarget Server Type    : MongoDBTarget Server Version : 80003 (8.0.3)File Encoding         : 65001*/// ----------------------------
// Collection structure for comment
// ----------------------------
db.getCollection("comment").drop();
db.createCollection("comment");
db.getCollection("comment").createIndex({user_id: NumberInt("1")
}, {name: "user_id_1"
});// ----------------------------
// Documents of comment
// ----------------------------
db.getCollection("comment").insertOne({_id: ObjectId("6728a523d9496fae23c4c2a9"),article_id: NumberInt("100000"),content: "今天天气真好,阳光明媚",user_id: "1001",nickname: "Rose",create_time: ISODate("2024-11-04T10:42:43.056Z"),like_number: NumberInt("10"),state: null
});db.getCollection("comment").insertOne({_id: "2",article_id: "100001",content: "我夏天空腹喝凉开水,冬天喝温开水",user_id: "1005",nickname: "伊人憔悴",create_time: ISODate("2019-08-05T23:58:51.485Z"),like_number: NumberInt("2422"),state: "1"
});db.getCollection("comment").insertOne({_id: "3",article_id: "100001",content: "我一直喝凉开水,冬天夏天都喝。",user_id: "1004",nickname: "杰克船长",create_time: ISODate("2019-08-06T01:05:06.321Z"),like_number: NumberInt("667"),state: "1"
});db.getCollection("comment").insertOne({_id: "4",article_id: "100001",content: "专家说不能空腹吃饭,影响健康。",user_id: "1003",nickname: "凯撒大帝",create_time: ISODate("2019-08-06T08:18:35.288Z"),like_number: NumberInt("2000"),state: "1"
});db.getCollection("comment").insertOne({_id: "5",article_id: "100001",content: "研究表明,刚烧开的水千万不能喝,因为烫嘴。",user_id: "1003",nickname: "凯撒大帝",create_time: ISODate("2019-08-06T11:01:02.521Z"),like_number: NumberInt("3000"),state: "1"
});

2. 在SpringBoot项目中集成MongoDB

本次演示使用的环境为:JDK 17.0.7 + SpringBoot 3.0.2

2.1 引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

2.2 编写配置文件

application.yml

server:port: 11006spring:data:mongodb:database: articlehost: 127.0.0.1port: 27017
#      username:
#      password:

2.3 实体类

  • 在Spring Data MongoDB中,@Field注解用于指定文档中字段的名称,这在字段名称与MongoDB集合中存储的字段名称不一致时非常有用
  • 如果实体类的字段名称与MongoDB文档中的字段名称相同,那么不需要使用@Field注解
  • 通过 @Document 注解指定集合名称
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;import java.util.Date;/*** Comment 实体类,用于映射MongoDB中的 comment 集合。*/
@Document(collection = "comment")
public class Comment {/*** MongoDB文档的唯一标识符,作为主键使用。*/@Idprivate String id;/*** 文章的唯一标识符,用于关联评论和文章。*/@Field("article_id")private String articleId;/*** 用户发表的评论文本内容。*/private String content;/*** 发表评论的用户唯一标识符。*/@Field("user_id")private String userId;/*** 发表评论的用户昵称,用于显示在评论列表中。*/private String nickname;/*** 评论创建的时间,格式通常为ISO日期时间格式。*/@Field("create_time")private Date createTime;/*** 评论获得的点赞数量,反映评论的受欢迎程度。*/@Field("like_number")private Integer likeNumber;/*** 评论下方的回复数量,反映评论的互动程度。*/@Field("reply_number")private Integer replyNumber;/*** 评论的可见状态,'0’表示评论不可见,'1’表示评论可见。*/private String state;/*** 评论的上级评论ID,如果为’0’或空,则表示该评论是顶级评论,没有上级评论。*/@Field("parent_id")private String parentId;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getArticleId() {return articleId;}public void setArticleId(String articleId) {this.articleId = articleId;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public String getUserId() {return userId;}public void setUserId(String userId) {this.userId = userId;}public String getNickname() {return nickname;}public void setNickname(String nickname) {this.nickname = nickname;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}public Integer getLikeNumber() {return likeNumber;}public void setLikeNumber(Integer likeNumber) {this.likeNumber = likeNumber;}public Integer getReplyNumber() {return replyNumber;}public void setReplyNumber(Integer replyNumber) {this.replyNumber = replyNumber;}public String getState() {return state;}public void setState(String state) {this.state = state;}public String getParentId() {return parentId;}public void setParentId(String parentId) {this.parentId = parentId;}@Overridepublic String toString() {return "Comment{" +"id='" + id + '\'' +", articleId='" + articleId + '\'' +", content='" + content + '\'' +", userId='" + userId + '\'' +", nickname='" + nickname + '\'' +", createTime=" + createTime +", likeNumber=" + likeNumber +", replyNumber=" + replyNumber +", state='" + state + '\'' +", parentId='" + parentId + '\'' +'}';}}

3. 测试

  • 在 SpringBoot 中操作 MongoDB,可以使用 MongoRepository 对象,也可以使用 MongoTemplate 对象
  • MongoRepository是基于 Spring Data 的 Repository 抽象,它提供了一套标准的数据访问方法,使得 CRUD 操作变得非常简单
  • 如果需要进行复杂的查询或需要细粒度的控制,MongoTemplate 可能是更好的选择

我们编写一个测试类,在测试类中注入 MongoTemplate 对象(与使用 RedisTemplate 类似)

import com.mongodb.client.MongoDatabase;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;@SpringBootTest
class MongodbApplicationTests {@Autowiredprivate MongoTemplate mongoTemplate;@Testpublic void showCurrentDatabase() {MongoDatabase db = mongoTemplate.getDb();System.out.println("db.getName() = " + db.getName());}@Testpublic void showAllCollections() {mongoTemplate.getCollectionNames().forEach(System.out::println);}}

4. 文档操作

4.1 插入操作

4.1.1 单次插入

@Test
public void testInsert() {Comment comment = new Comment();comment.setArticleId("article123");comment.setContent("这是一个很好的文章!");comment.setUserId("1003");comment.setNickname("评论者A");comment.setCreateTime(new Date());comment.setLikeNumber(10);comment.setReplyNumber(2);comment.setState("1");comment.setParentId("0");mongoTemplate.insert(comment);// 拿到插入后的评论IDSystem.out.println("tempComment.getId() = " + comment.getId());
}

4.1.2 批量插入

@Test
public void testInsertAll() {List<Comment> commentList = new ArrayList<>();for (int i = 0; i < 5; i++) {Comment comment = new Comment();comment.setArticleId("article" + (i + 1));comment.setContent("这是第 " + (i + 1) + " 条评论内容");comment.setUserId(String.valueOf(1003));comment.setNickname("评论者" + (i + 1));comment.setCreateTime(new Date());comment.setLikeNumber(5 + i); // 假设点赞数从5开始递增comment.setReplyNumber(0); // 假设初始回复数为0comment.setState("1"); // 假设所有评论都是可见的comment.setParentId("0"); // 假设所有评论都是顶级评论commentList.add(comment);}// 批量插入评论mongoTemplate.insertAll(commentList);
}

4.2 查询操作

分页参数和跳过多少条文档需要通过 Query 对象指定

4.2.1 根据id查询

@Test
public void testFindById() {Comment comment = mongoTemplate.findById("2", Comment.class);System.out.println("comment = " + comment);
}

4.2.2 根据特定条件查询

@Test
public void testFindByUserIdAndCreateTime() {String userId = "1003";Query query = new Query();Criteria criteria = Criteria.where("user_id").is(userId).and("create_time").lte(new Date());query.addCriteria(criteria).skip(0).limit(5);List<Comment> commentList = mongoTemplate.find(query, Comment.class);commentList.forEach(System.out::println);
}

4.2.3 正则查询

@Test
public void testFindByRegex() {String keyword = "开水";Query query = new Query();Criteria criteria = Criteria.where("content").regex(keyword);query.addCriteria(criteria);List<Comment> commentList = mongoTemplate.find(query, Comment.class);commentList.forEach(System.out::println);
}

4.2.4 查询所有文档

@Test
public void testFindALl() {List<Comment> commentList = mongoTemplate.findAll(Comment.class);commentList.forEach(System.out::println);
}

4.2.5 排序后返回

在这里插入图片描述

@Test
public void testFindByArticleIdWithCreatedTimeAsc() {String articleId = "100001";Criteria criteria = Criteria.where("article_id").is(articleId).and("create_time").lte(new Date());Query query = new Query();query.addCriteria(criteria).with(Sort.by(Sort.Order.asc("create_time")));List<Comment> commentList = mongoTemplate.find(query, Comment.class);commentList.forEach(System.out::println);
}

4.3 删除操作

4.3.1 根据id删除

@Test
public void testDeleteById() {Criteria criteria = Criteria.where("_id").is("2");DeleteResult deleteResult = mongoTemplate.remove(new Query(criteria), Comment.class);System.out.println("deleteResult.getDeletedCount() = " + deleteResult.getDeletedCount());
}

4.3.2 根据特定条件删除

@Test
public void testDeleteByUserIdAndCreateTime() {String userId = "1003";Date date = new Date();// 删除两分钟以内发布的评论date.setTime(date.getTime() - 2 * 60 * 1000);Query query = new Query();Criteria criteria = Criteria.where("user_id").is(userId).and("create_time").gte(date).lte(new Date()).and("state").is("1");query.addCriteria(criteria);DeleteResult deleteResult = mongoTemplate.remove(query, Comment.class);System.out.println("deleteResult.getDeletedCount() = " + deleteResult.getDeletedCount());
}

4.4 修改操作

4.4.1 修改符合条件的第一条文档(updateFirst)

@Test
public void testUpdateFirst() {Comment comment = new Comment();comment.setId("6728a523d9496fae23c4c2a9");comment.setLikeNumber(102);Query query = new Query();query.addCriteria(Criteria.where("_id").is(comment.getId()));Update update = new Update();update.set("like_number", comment.getLikeNumber());UpdateResult updateResult = mongoTemplate.updateFirst(query, update, Comment.class);System.out.println("updateResult.getMatchedCount() = " + updateResult.getMatchedCount());System.out.println("updateResult.getModifiedCount() = " + updateResult.getModifiedCount());
}

4.4.2 修改符合条件的所有文档(updateMulti)

@Test
public void testUpdateMulti() {Query query = new Query();Criteria criteria = Criteria.where("article_id").is("100001").and("state").is("1");query.addCriteria(criteria);Update update = new Update();update.set("nickname", "聂可以");UpdateResult updateResult = mongoTemplate.updateMulti(query, update, Comment.class);System.out.println("updateResult.getMatchedCount() = " + updateResult.getMatchedCount());System.out.println("updateResult.getModifiedCount() = " + updateResult.getModifiedCount());
}

5. 完整的测试代码

import cn.edu.scau.pojo.Comment;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;import java.util.ArrayList;
import java.util.Date;
import java.util.List;@SpringBootTest
class MongodbApplicationTests {@Autowiredprivate MongoTemplate mongoTemplate;@Testpublic void showCurrentDatabase() {MongoDatabase db = mongoTemplate.getDb();System.out.println("db.getName() = " + db.getName());}@Testpublic void showAllCollections() {mongoTemplate.getCollectionNames().forEach(System.out::println);}@Testpublic void testInsert() {Comment comment = new Comment();comment.setArticleId("article123");comment.setContent("这是一个很好的文章!");comment.setUserId("1003");comment.setNickname("评论者A");comment.setCreateTime(new Date());comment.setLikeNumber(10);comment.setReplyNumber(2);comment.setState("1");comment.setParentId("0");mongoTemplate.insert(comment);// 拿到插入后的评论IDSystem.out.println("tempComment.getId() = " + comment.getId());}@Testpublic void testInsertAll() {List<Comment> commentList = new ArrayList<>();for (int i = 0; i < 5; i++) {Comment comment = new Comment();comment.setArticleId("article" + (i + 1));comment.setContent("这是第 " + (i + 1) + " 条评论内容");comment.setUserId(String.valueOf(1003));comment.setNickname("评论者" + (i + 1));comment.setCreateTime(new Date());comment.setLikeNumber(5 + i); // 假设点赞数从5开始递增comment.setReplyNumber(0); // 假设初始回复数为0comment.setState("1"); // 假设所有评论都是可见的comment.setParentId("0"); // 假设所有评论都是顶级评论commentList.add(comment);}// 批量插入评论mongoTemplate.insertAll(commentList);}@Testpublic void testFindById() {Comment comment = mongoTemplate.findById("2", Comment.class);System.out.println("comment = " + comment);}@Testpublic void testFindALl() {List<Comment> commentList = mongoTemplate.findAll(Comment.class);commentList.forEach(System.out::println);}@Testpublic void testFindByRegex() {String keyword = "开水";Query query = new Query();Criteria criteria = Criteria.where("content").regex(keyword);query.addCriteria(criteria);List<Comment> commentList = mongoTemplate.find(query, Comment.class);commentList.forEach(System.out::println);}@Testpublic void testFindByUserIdAndCreateTime() {String userId = "1003";Query query = new Query();Criteria criteria = Criteria.where("user_id").is(userId).and("create_time").lte(new Date());query.addCriteria(criteria).skip(0).limit(5);List<Comment> commentList = mongoTemplate.find(query, Comment.class);commentList.forEach(System.out::println);}@Testpublic void testFindByArticleIdWithCreatedTimeAsc() {String articleId = "100001";Criteria criteria = Criteria.where("article_id").is(articleId).and("create_time").lte(new Date());Query query = new Query();query.addCriteria(criteria).with(Sort.by(Sort.Order.asc("create_time")));List<Comment> commentList = mongoTemplate.find(query, Comment.class);commentList.forEach(System.out::println);}@Testpublic void testDeleteById() {Criteria criteria = Criteria.where("_id").is("672a88601f90870e2451905a");DeleteResult deleteResult = mongoTemplate.remove(new Query(criteria), Comment.class);System.out.println("deleteResult.getDeletedCount() = " + deleteResult.getDeletedCount());}@Testpublic void testDeleteByUserIdAndCreateTime() {String userId = "1003";Date date = new Date();// 删除两分钟以内发布的评论date.setTime(date.getTime() - 2 * 60 * 1000);Query query = new Query();Criteria criteria = Criteria.where("user_id").is(userId).and("create_time").gte(date).lte(new Date()).and("state").is("1");query.addCriteria(criteria);DeleteResult deleteResult = mongoTemplate.remove(query, Comment.class);System.out.println("deleteResult.getDeletedCount() = " + deleteResult.getDeletedCount());}@Testpublic void testUpdateFirst() {Comment comment = new Comment();comment.setId("6728a523d9496fae23c4c2a9");comment.setLikeNumber(102);Query query = new Query();query.addCriteria(Criteria.where("_id").is(comment.getId()));Update update = new Update();update.set("like_number", comment.getLikeNumber());UpdateResult updateResult = mongoTemplate.updateFirst(query, update, Comment.class);System.out.println("updateResult.getMatchedCount() = " + updateResult.getMatchedCount());System.out.println("updateResult.getModifiedCount() = " + updateResult.getModifiedCount());}@Testpublic void testUpdateMulti() {Query query = new Query();Criteria criteria = Criteria.where("article_id").is("100001").and("state").is("1");query.addCriteria(criteria);Update update = new Update();update.set("nickname", "聂可以");UpdateResult updateResult = mongoTemplate.updateMulti(query, update, Comment.class);System.out.println("updateResult.getMatchedCount() = " + updateResult.getMatchedCount());System.out.println("updateResult.getModifiedCount() = " + updateResult.getModifiedCount());}}

相关文章:

在SpringBoot项目中集成MongoDB

文章目录 1. 准备工作2. 在SpringBoot项目中集成MongoDB2.1 引入依赖2.2 编写配置文件2.3 实体类 3. 测试4. 文档操作4.1 插入操作4.1.1 单次插入4.1.2 批量插入 4.2 查询操作4.2.1 根据id查询4.2.2 根据特定条件查询4.2.3 正则查询4.2.4 查询所有文档4.2.5 排序后返回 4.3 删除…...

OpenJudge - 24:输出保留3位小数的浮点数

【题目来源】http://shnoip.openjudge.cn/level1/24/【题目描述】 读入一个单精度浮点数&#xff0c;保留3位小数输出这个浮点数。【输入格式】 只有一行&#xff0c;一个单精度浮点数。【输出格式】 也只有一行&#xff0c;读入的单精度浮点数。【输入样例】 12.34521【输出样…...

华为流程L1-L6业务流程深度细化到可执行

该文档主要介绍了华为业务流程的深度细化及相关内容,包括流程框架、建模方法、流程模块描述、流程图建模等,旨在帮助企业构建有效的流程体系,实现战略目标。具体内容如下: 华为业务流程的深度细化 流程层级:华为业务流程分为 L1 - L6 六个层级,L1 为流程大类,L2 为流程…...

Python中Tushare(金融数据库)入门详解

文章目录 Python中Tushare&#xff08;金融数据库&#xff09;入门详解一、引言二、安装与注册1、安装Tushare2、注册与获取Token 三、Tushare基本使用1、设置Token2、获取数据2.1、获取股票基础信息2.2、获取交易日历2.3、获取A股日线行情2.4、获取沪股通和深股通成份股2.5、获…...

Odoo中,要实现实时数据推送,SSE 与 WebSocket 该如何选择

目录 1. 技术特点对比 2. 使用场景 适合使用 SSE 的场景&#xff1a; 适合使用 WebSocket 的场景&#xff1a; 3. 优缺点总结 SSE 优点&#xff1a; SSE 缺点&#xff1a; WebSocket 优点&#xff1a; WebSocket 缺点&#xff1a; 4. 选择建议 选择 SSE 的条件&#x…...

02. Python基础知识

一、注释 在开发程序过程中&#xff0c;如果一段代码的逻辑比较复杂&#xff0c;不是特别容易理解&#xff0c;可以适当添加注释&#xff0c;以辅助自己或其他开发人员解读代码。注释是给程序员看的&#xff0c;为了让程序员方便阅读代码&#xff0c;解释器会忽略注释。在 Pyto…...

Mac 修改默认jdk版本

当前会话生效 这里演示将 Java 17 版本降低到 Java 8 查看已安装的 Java 版本&#xff1a; 在终端&#xff08;Terminal&#xff09;中运行以下命令&#xff0c;查看已安装的 Java 版本列表 /usr/libexec/java_home -V设置默认 Java 版本&#xff1a; 找到 Java 8 的安装路…...

数字赋能,气象引领 | 气象景观数字化服务平台重塑京城旅游生态

在数字化转型的浪潮中&#xff0c;旅游行业正以前所未有的速度重塑自身&#xff0c;人民群众对于高品质、个性化旅游服务需求的日益增长&#xff0c;迎着新时代的挑战与机遇&#xff0c;为开展北京地区特色气象景观预报&#xff0c;打造“生态气象旅游”新业态&#xff0c;助推…...

C语言项⽬实践-贪吃蛇

目录 1.项目要点 2.窗口设置 2.1mode命令 2.2title命令 2.3system函数 2.Win32 API 2.1 COORD 2.2 GetStdHandle 2.3 CONSOLE_CURSOR_INFO 2.4 GetConsoleCursorInfo 2.5 SetConsoleCursorInfo 2.5 SetConsoleCursorPosition 2.7 GetAsyncKeyState 3.贪吃蛇游戏设…...

springboot整合kafka

springboot整合kafka 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…...

量子计算机全面解析:技术、应用与未来

标题&#xff1a;量子计算机全面解析&#xff1a;技术、应用与未来 一、什么是量子计算机&#xff1f; 量子计算机是一种利用量子力学原理&#xff08;如叠加、纠缠和干涉&#xff09;进行计算的新型计算设备。与传统计算机基于比特&#xff08;0 和 1&#xff09;的运算方式不…...

提升软件测试报告的质量:Allure2中添加用例失败截图、日志、HTML块和视频的方法

Allure2的用途 Allure2是一个用于生成测试报告的框架&#xff0c;广泛应用于自动化测试和手动测试中。它支持多种测试框架&#xff0c;如JUnit、TestNG、MSTest等&#xff0c;通过生动的图表和详细的日志&#xff0c;使得非技术人员也能轻松地理解测试结果。许多团队选用Allur…...

Mysql启动报错:本地计算机上的mysql服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止

原因 是手动去改了mysql的配置文件my.ini的内容&#xff0c;重新启动服务启动不了。 看了很多文章最终找到了恢复数据的办法。 第一步备份 先备份mysql数据存的文件夹Data&#xff0c;如果找不到则去看配置文件那一行datadir 第二步重新安装mysql 卸载篇可以看我之前发的文…...

国际环境和背景下的云计算领域

前言 在当前国际环境和背景下&#xff0c;云计算领域呈现出复杂多变的局面&#xff0c;其发展深受技术创新、地缘政治、全球经济以及监管政策的影响。以下从技术趋势、市场竞争、地缘政治和监管环境四个方面详细解析云计算领域的现状。 一、技术趋势&#xff1a;多云与边缘计算…...

网络安全-企业环境渗透2-wordpress任意文件读FFmpeg任意文件读

一、 实验名称 企业环境渗透2 二、 实验目的 【实验描述】 操作机的操作系统是kali 进入系统后默认是命令行界面 输入startx命令即可打开图形界面。 所有需要用到的信息和工具都放在了/home/Hack 目录下。 本实验的任务是通过外网的两个主机通过代理渗透到内网的两个主机。…...

C# 超链接控件LinkLabel无法触发Alt快捷键

在C#中&#xff0c;为控件添加快捷键的方式有两种&#xff0c;其中一种就是Windows中较为常见的Alt快捷键&#xff0c;比如运行对话框&#xff0c;记事本菜单等。只需要按下 Alt 框号中带下划线的字母即可触发该控件的点击操作。如图所示 在C#开发中&#xff0c;实现类似的操作…...

一分钟学习数据安全——数据安全风险的系统化应对思路

数据是组织的重要资产&#xff0c;未经授权的数据访问可能导致数据泄露、数据篡改、隐私侵犯和合规风险等问题。企业可以通过数据访问控制来提高信息系统在数据全生命周期管理中的安全性。企业可以引入IAM系统&#xff0c;来控制身份来管理权限。通过对用户访问权限的管理和合适…...

深入了解 Spring Security 的授权核心功能

Spring Security 是一个强大且灵活的安全框架&#xff0c;能够帮助开发者为 Spring 应用程序提供认证和授权服务。在实际应用中&#xff0c;Spring Security 主要涉及用户的认证&#xff08;谁是用户&#xff09;和授权&#xff08;用户能做什么&#xff09;。本文将深入讲解 S…...

【Web前端】创建我的第一个 Web 表单

Web 开发中&#xff0c;表单是不可或缺的组成部分。无论是用户注册、登录还是反馈收集&#xff0c;表单都是与用户交互的重要方式。 什么是 Web 表单&#xff1f; Web 表单是一种用于收集用户输入数据的界面元素。它们允许用户在浏览器中输入信息并提交这些信息到服务器。Web …...

“人工智能+高职”:VR虚拟仿真实训室的发展前景

在当今科技日新月异的时代&#xff0c;人工智能&#xff08;AI&#xff09;与虚拟现实&#xff08;VR&#xff09;技术的融合正逐步改变着各行各业&#xff0c;教育领域也不例外。特别是在高等职业教育&#xff08;简称“高职”&#xff09;体系中&#xff0c;VR虚拟仿真实训室…...

状态模式之状态机

状态机的背景 在软件开发过程中&#xff0c;尤其是涉及到复杂的系统行为控制时&#xff0c;我们常常会遇到这样的情况&#xff1a;一个对象或者系统会在多种状态之间进行转换&#xff0c;并且在不同状态下对相同事件的响应是不同的。 以自动售卖机为例&#xff0c;自动售卖机…...

NUXT3学习日记四(路由中间件、导航守卫)

前言 在 Nuxt 3 中&#xff0c;中间件&#xff08;Middleware&#xff09;是用于在页面渲染之前或导航发生之前执行的函数。它们允许你在路由切换时执行逻辑&#xff0c;像是身份验证、重定向、权限控制、数据预加载等任务。中间件可以被全局使用&#xff0c;也可以只在特定页…...

基于重复控制补偿的高精度 PID 控制

1. 背景与原理 重复控制&#xff08;Repetitive Control, RC&#xff09;是一种适用于周期性信号跟踪和周期性扰动抑制的控制方法&#xff0c;通过在控制回路中引入周期补偿器来提高系统的控制精度。将 RC 与 PID 控制相结合&#xff0c;利用 PID 的快速响应特性和 RC 的周期补…...

Linux之日志

日志 在编写网络服务器, 各种软件时, 程序一定要打印一些日志信息. 1. 可以向显示器打印, 也可以向文件中写入. 2. 日志是软件在运行时记录的流水账, 用于排查服务进程挂掉的信息. 其中必须要有的是: 日志等级, 时间, 日志内容.可选的是文件名, 代码行数, 进程pid 等 日志…...

【LeetCode面试150】——202快乐数

博客昵称&#xff1a;沈小农学编程 作者简介&#xff1a;一名在读硕士&#xff0c;定期更新相关算法面试题&#xff0c;欢迎关注小弟&#xff01; PS&#xff1a;哈喽&#xff01;各位CSDN的uu们&#xff0c;我是你的小弟沈小农&#xff0c;希望我的文章能帮助到你。欢迎大家在…...

云原生之k8s服务管理

文章目录 服务管理Service服务原理ClusterIP服务 对外发布应用服务类型NodePort服务Ingress安装配置Ingress规则 Dashboard概述 认证和授权ServiceAccount用户概述创建ServiceAccount 权限管理角色与授权 服务管理 Service 服务原理 容器化带来的问题 自动调度&#xff1a;…...

【Vue】 npm install amap-js-api-loader指南

前言 项目中的地图模块突然打不开了 正文 版本太低了&#xff0c;而且Vue项目就应该正经走项目流程啊喂&#xff01; npm i amap/amap-jsapi-loader --save 官方说这样执行完&#xff0c;就这结束啦&#xff01;它结束了&#xff0c;我还没有&#xff0c;不然不可能记录这篇文…...

RocketMQ: 部署结构与存储特点

RocketMQ 是什么 它是一个队列模型的消息中间件&#xff0c;具有高性能、高可靠、高实时、分布式特点 Producer、Consumer、队列都可以分布式Producer 向一些队列轮流发送消息 队列集合称为 TopicConsumer 如果做广播消费则一个 consumer 实例消费这个 Topic 对应的所有队列如果…...

Android OpenGL ES详解——绘制圆角矩形

1、绘制矩形 代码如下&#xff1a; renderer类&#xff1a; package com.example.roundrectimport android.content.Context import android.opengl.GLES30 import android.opengl.GLSurfaceView.Renderer import com.opengllib.data.VertexArray import com.opengllib.prog…...

【大数据学习 | Spark】Spark的改变分区的算子

当分区由多变少时&#xff0c;不需要shuffle&#xff0c;也就是父RDD与子RDD之间是窄依赖。 当分区由少变多时&#xff0c;是需要shuffle的。 但极端情况下&#xff08;1000个分区变成1个分区)&#xff0c;这时如果将shuffle设置为false&#xff0c;父子RDD是窄依赖关系&…...

前端知识点---rest(javascript)

文章目录 前端知识点---rest(javascript)rest的用法基本语法特点使用场景与扩展运算符&#xff08;spread&#xff09;区别小练习 前端知识点—rest(javascript) rest出现于ES2015 function doSum(a,b, ...args) //示例中的args就是一个rest参数 //它会将后续的所有参数存储…...

Spark使用过程中的 15 个常见问题、详细解决方案

目录 问题 1&#xff1a;Spark 作业超时问题描述解决方案Python 实现 问题 2&#xff1a;内存溢出问题描述解决方案Python 实现 问题 3&#xff1a;Shuffle 性能问题问题描述解决方案Python 实现 问题 4&#xff1a;Spark 作业调度不均问题描述解决方案Python 实现 问题 5&…...

ASP.NET MVC宠物商城系统

该系统采用B/S架构&#xff0c;使用C#编程语言进行开发&#xff0c;以ASP.NET MVC框架为基础&#xff0c;以Visual Studio 2019为开发工具&#xff0c;数据库采用SQL Server进行保存数据。系统主要功能包括登录注册、宠物展示、个人中心、我的订单、购物车、用户管理、宠物类别…...

DQN系列算法详解

代码链接见文末 1. Q-learning 1.1 概述 Q-Learning是一种强化学习算法,目的是通过选择能带来最大长期收益的行为来完成任务。 做事包含瞬时奖励和记忆经验奖励: 在Q-Learning中,每个动作都会带来“瞬时奖励”,同时也会根据过去的经验记住哪些行为更有利。瞬时奖励: 这里…...

uniapp发布android上架应用商店权限

先看效果&#xff1a; 实现原理&#xff1a; 一、利用uni.addInterceptor的拦截器&#xff0c;在一些调用系统权限前拦截&#xff0c;进行弹窗展示&#xff0c;监听确定取消实现业务逻辑。 二、弹窗是原生nativeObj进行drawRect绘制的 三、权限申请调用使用的 plus.android.…...

已阻止加载“http://localhost:8086/xxx.js”的模块,它使用了不允许的 MIME 类型 (“text/plain”)。

记录今天解决的一个小bug 在终端启动8080端口号监听后&#xff0c;打开网址http://localhost:8080&#xff0c;发现不能正确加载页面&#xff0c;打开检查-控制台&#xff0c;出现如下警告&#xff1a;已阻止加载“http://localhost:8086/xxx.js”的模块&#xff0c;它使用了不…...

JavaEE之线程初阶(上)

前文我们知道计算机中的每一个程序都对应着一个进程&#xff0c;进程是CPU申请资源的最小单位&#xff0c;那么线程是什么呢&#xff0c;线程中我们又能学习到什么新的知识呢&#xff1f;&#xff1f; 我们来一探究竟 1. 认识线程&#xff08;Thread&#xff09; 线程是什么 …...

Spring Security @PreAuthorize注解

PreAuthorize 注解在 Spring Security 中提供了一种声明式的方法&#xff0c;可以在您的 Spring Boot 应用中添加方法级别的安全检查。本教程将引导您设置并有效使用 PreAuthorize&#xff0c;确保用户只能在具有特定角色或权限的情况下调用 REST API。 什么是 PreAuthorize&a…...

windows已建立威胁IP排查

在应急响应的时候&#xff0c;需要筛选出服务器建立连接的进程、PID&#xff0c;此代码可满足该需求实现共计2步 首先windos netstat-ano > all.txt&#xff0c; 上传至pycharm路径 第一步获取服务器建立连接的ip import re# 从文件读取 netstat 输出 def read_netstat_f…...

AI 大模型如何重塑软件开发流程?——技术革新与未来展望

人工智能的蓬勃发展为许多领域注入了强劲动力&#xff0c;而在软件开发这一关键技术领域&#xff0c;AI 大模型的应用正在彻底改变传统流程。从代码自动生成到智能测试&#xff0c;再到协同开发和流程优化&#xff0c;AI 正逐步成为软件开发者的得力助手&#xff0c;也推动企业…...

Admin.NET框架前端由于keep-alive设置缓存导致的onUnmount未触发问题

bug版本&#xff1a;next分支&#xff0c;基于.NET6版本&#xff1b; 问题描述&#xff1a; 1、添加keep-alive后&#xff0c;在其下运行的组件会出现onActived(被关注时)和onDeactived(取消关注时)生命周期&#xff0c;而组件原有生命周期为onMounted(被创造时)和onUnmounted(…...

Rest-assured

依赖 <--rest-assured依赖--><dependency><groupId>io.rest-assured</groupId><artifactId>rest-assured</artifactId><version>4.4.0</version><scope>test</scope> </dependency><--junit5依赖-->…...

ubuntu24挂载硬盘记录

1、显示硬盘及所属分区情况。在终端窗口中输入如下命令&#xff1a; sudo fdisk -l 找到自己硬盘的分区 我的地址/dev/sda 2、显示硬盘及所属分区情况。在终端窗口中输入如下命令&#xff0c;格式化自己硬盘&#xff1a; sudo mkfs -t ext4 /dev/sda 3、在终端窗口中输入如下…...

Dubbo集成SpringBoot实现远程服务调用

SpringBoot集成Dubbo Dubbo介绍了解 Dubbo 核心概念和架构dubbo特性dubbo运行原理图 SpringBoot集成Dubbo技术实战一、Dubbo Spring Boot 版本关系二、引入Maven依赖demo项目基础结构引入依赖创建每个模块1&#xff09;api模块2&#xff09;provider模块3&#xff09;consumer模…...

Redis最终篇分布式锁以及数据一致性

在前三篇我们几乎说完了Redis的所有的基础知识以及Redis怎么实现高可用性,那么在这一篇文章中的话我们主要就是说明如果我们使用Redis出现什么问题以及解决方案是什么,这个如果在未来的工作中也有可能会遇到,希望对看这篇博客的人有帮助,话不多说直接开干 一.Hotkey以及BigKey…...

TCP协议

报文格式 源/目的端口号&#xff1a;数据从哪个进程来&#xff0c;到哪个进程去32位序号&#xff1a;TCP传输过程中&#xff0c;在发送端出的字节流中&#xff0c;传输报文中的数据部分的每一个字节都有它的编号32位确认号&#xff1a;标识了报文接收端期望接收的字节序列4位首…...

Vue3 源码解析(十):watch 的实现原理

本篇文章笔者会讲解 Vue3 中侦听器相关的 api&#xff1a;watchEffect 和 watch 。在 Vue3 之前 watch 是 option 写法中一个很常用的选项&#xff0c;使用它可以非常方便的监听一个数据源的变化&#xff0c;而在 Vue3 中随着 Composition API 的写法推行也将 watch 独立成了一…...

2023年9月GESPC++一级真题解析

一、单选题&#xff08;每题2分&#xff0c;共30分&#xff09; 题号 123456789101112131415 答案 CDBCDBACACBBDDA 1. 我们通常说的 “ 内存 ” 属于计算机中的&#xff08;&#xff09;。 A. 输出设备 B. 输 ⼊ 设备 C. 存储设备 D. 打印设备 【答案】 C 【考纲知识点】…...

vscode 远程连接ssh 密钥方式

目录 1. powershell 生成key&#xff1a; 2. 在服务器上安装公钥 linux测试成功&#xff1a; 3).为了确保连接成功&#xff0c;输入如下指令以保证以下文件权限正确&#xff1a; 3 开启 ssh 密钥登录 vscode 远程连接配置 python连接测试ok 查看日志&#xff1a; 1. po…...

字符函数和字符串函数

字符分类函数 C语言中有⼀系列的函数是专门做字符分类的&#xff0c;也就是⼀个字符是属于什么类型的字符的。 这些函数的使用都需要包含⼀个头文件&#xff1a;ctype.h 这些函数的用法非常类似。 int islower ( int c )islower是能够判断参数部分是否是小写字母的。 通过返…...