在SpringBoot项目中集成MongoDB

news2024/11/24 1:17:10

文章目录

  • 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 Transfer

 Source Server         : localhost
 Source Server Type    : MongoDB
 Source Server Version : 80003 (8.0.3)
 Source Host           : localhost:27017
 Source Schema         : test

 Target Server Type    : MongoDB
 Target 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: 11006

spring:
  data:
    mongodb:
      database: article
      host: 127.0.0.1
      port: 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文档的唯一标识符,作为主键使用。
     */
    @Id
    private 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;
    }

    @Override
    public 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 {

    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    public void showCurrentDatabase() {
        MongoDatabase db = mongoTemplate.getDb();
        System.out.println("db.getName() = " + db.getName());
    }

    @Test
    public 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);
    // 拿到插入后的评论ID
    System.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); // 假设初始回复数为0
        comment.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 {

    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    public void showCurrentDatabase() {
        MongoDatabase db = mongoTemplate.getDb();
        System.out.println("db.getName() = " + db.getName());
    }

    @Test
    public void showAllCollections() {
        mongoTemplate.getCollectionNames().forEach(System.out::println);
    }

    @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);
        // 拿到插入后的评论ID
        System.out.println("tempComment.getId() = " + comment.getId());
    }

    @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); // 假设初始回复数为0
            comment.setState("1"); // 假设所有评论都是可见的
            comment.setParentId("0"); // 假设所有评论都是顶级评论

            commentList.add(comment);
        }

        // 批量插入评论
        mongoTemplate.insertAll(commentList);
    }


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

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

    @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);
    }

    @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);
    }

    @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);
    }

    @Test
    public 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());
    }

    @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());
    }

    @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());
    }

    @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());
    }

}

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

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

相关文章

美团-Leaf ID算法集成到SpringBoot项目

提前准备 下载源码 GitHub地址&#xff1a;https://github.com/Meituan-Dianping/Leaf 下载下来 然后 maven install 安装到本地仓库 再需要用到该ID算法的项目中引入 以下内容 <!-- 本地仓库中的Leaf --> <dependency><artifactId>leaf-boot-starte…

AI+若依框架项目

基础应用篇 1.若依搭建 技术选型 RuoYi-Vue版本&#xff0c;采用了前后端分离的单体架构设计&#xff1a; 软件环境&#xff1a;JDK、MySQL 、Redis 、Maven、Node 技术选型&#xff1a;Spring Boot、Spring Security、MyBatis、Jwt、V 官方推荐 课程版本 JDK > 1.8 …

RabbitMQ高可用延迟消息惰性队列

目录 生产者确认 消息持久化 消费者确认 TTL延迟队列 TTL延迟消息 惰性队列 生产者确认 生产者确认就是&#xff1a;发送消息的人&#xff0c;要确保消息发送给了消息队列&#xff0c;分别是确保到了交换机&#xff0c;确保到了消息队列这两步。 1、在发送消息服务的ap…

将django+vue项目发布部署到服务器

1.部署django后端服务 部署架构 1.1 下载依赖插件 pip3.8 freeze > requirements.txt1.2 安装依赖插件 pip3 install -r requirements.txt1.3 安装mysql数据库 apt install mysql-server初始化数据库 CREATE USER admin% IDENTIFIED WITH mysql_native_password BY 123…

论文阅读:SIMBA: single-cell embedding along with features

Chen, H., Ryu, J., Vinyard, M.E. et al. SIMBA: single-cell embedding along with features. Nat Methods 21, 1003–1013 (2024). 论文地址&#xff1a;https://doi.org/10.1038/s41592-023-01899-8 代码地址&#xff1a;https://github.com/pinellolab/simba. 摘要 大多…

商业物联网:拥抱生产力的未来

在现代商业格局中&#xff0c;数据占据至高无上的地位。物联网&#xff08;IoT&#xff09;站在这场数字革命的前沿&#xff0c;将以往模糊不清的不确定因素转变为可衡量、可付诸行动的深刻见解。物联网技术为日常物品配备传感器与连接功能&#xff0c;使其能够实时收集并传输数…

【FRP 内网穿透 从0到1 那些注意事项】

【摘要】 最近跟第三方团队调试问题&#xff0c;遇到一个比较烦的操作。就是&#xff0c;你必须要发个版到公网环境&#xff0c;他们才能链接到你的接口地址&#xff0c;才能进行调试。按理说&#xff0c;也没啥&#xff0c;就是费点时间。但是&#xff0c;在调试的时候&#…

最新Kali安装详细版教程(附安装包,傻瓜式安装教程)

本文主要详细介绍 kali 的安装过程&#xff0c;以及安装完成后的基本设置&#xff0c;比如安装增强工具&#xff0c;安装中文输入法以及更新升级等操作。 文章目录 实验环境准备工作步骤说明安装虚拟机安装 Kali安装增强工具安装中文输入法更新升级 实验环境 VMware &#x…

【山大909算法题】2014-T1

文章目录 1.原题2.算法思想3.关键代码4.完整代码5.运行结果 1.原题 为带表头的单链表类Chain编写一个成员函数Reverse&#xff0c;该函数对链表进行逆序操作&#xff08;将链表中的结点按与原序相反的顺序连接&#xff09;&#xff0c;要求逆序操作就地进行&#xff0c;不分配…

论文浅尝 | MindMap:知识图谱提示激发大型语言模型中的思维图(ACL2024)

笔记整理&#xff1a;和东顺&#xff0c;天津大学硕士&#xff0c;研究方向为软件缺陷分析 论文链接&#xff1a;https://aclanthology.org/2024.acl-long.558/ 发表会议&#xff1a;ACL 2024 1. 动机 虽然大语言模型&#xff08;LLMs&#xff09;已经在自然语言理解和生成任务…

Win11 22H2/23H2系统11月可选更新KB5046732发布!

系统之家11月22日报道&#xff0c;微软针对Win11 22H2/23H2版本推送了2024年11月最新可选更新补丁KB5046732&#xff0c;更新后&#xff0c;系统版本号升至22621.4541和22631.4541。本次更新后系统托盘能够显示缩短的日期和时间&#xff0c;文件资源管理器窗口很小时搜索框被切…

SpringSecurity创建一个简单的自定义表单的认证应用

1、SpringSecurity 自定义表单 在 Spring Security 中创建自定义表单认证应用是一个常见的需求&#xff0c;特别是在需要自定义登录页面、认证逻辑或添加额外的表单字段时。以下是一个详细的步骤指南&#xff0c;帮助你创建一个自定义表单认证应用。 2、基于 SpringSecurity 的…

Cloud Native 云原生后端的开发注意事项

在云原生后端开发里&#xff0c;数据管理和存储这块得好好弄。数据库选型得综合考虑&#xff0c;像关系型数据有复杂查询需求就选 MySQL、PostgreSQL&#xff0c;海量非结构化数据就可以考虑 MongoDB、Cassandra 这些。设计数据库得遵循规范化原则&#xff0c;像设计电商订单表…

通达OA前台submenu.php存在SQL注入漏洞(CVE-2024-10600)

通达OA前台submenu.php存在SQL注入漏洞(CVE-2024-10600) pda/appcenter/submenu.php 未包含inc/auth.inc.php且 $appid 参数未用’包裹导致前台SQL注入 影响范围 v2017-v11.6 fofa app"TDXK-通达OA" && icon_hash"-759108386"poc http://url…

TCP连接(三次握手)(四次挥手)

建立TCP连接&#xff08;三次握手&#xff09; 以下是简单阐述 在确定目标服务器 IP 地址后&#xff0c;则经历三次握手建立TCP 连接 三次握手 代表客户端和服务端 之间的传递信息有三次 A说&#xff1a;我想和你聊天 &#xff0c;你能听到我说话吗 B说&#xff1a;我可以听到…

【MySQL实战45讲笔记】基础篇——事务隔离

系列文章 基础篇——MySQL 的基础架构 基础篇——redo log 和 binlog 目录 系列文章1. 事务隔离1.1 隔离性与隔离级别1.2 如何实现事务隔离1.3 事务的启动方式1.4 思考&#xff1a; 使用什么方案来避免长事务 1. 事务隔离 简单来说&#xff0c;事务就是要保证一组数据库操作&…

upload-labs-master第12关详细教程

成功了别忘了回来留下你的评论哦&#xff0c;嘻嘻 目录 环境配置闯关 环境配置 需要的东西 phpstudy-2018 链接&#xff1a; https://pan.baidu.com/s/1D9l13XTQw7o6A8CSJ2ff9Q 提取码&#xff1a;0278 32位 vc9和11运行库 链接&#xff1a; https://pan.baidu.com/s/1pBV3W…

Mac 修改默认jdk版本

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

uniapp奇怪bug汇总

H5端请求api文件夹接口报错 踩坑指数&#xff1a;5星 小程序、APP之前都是用api文件夹的接口引用调用&#xff0c;在h5端启动时报错&#xff0c;研究半天&#xff0c;发现把api文件夹名字改成apis就能调用&#xff0c;就像是关键字一样无法使用。 import authApi from /api/…

交换机配置从IP(Switch Configuration from IP)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…