Spring使用mongoDB步骤

news2024/11/18 23:42:45

1. 在Linux系统使用docker安装mongoDB

1.1. 安装

在docker运行的情况下,执行下述命令。

docker run \
-itd \
--name mongoDB \
-v mongoDB_db:/data/db \
-p 27017:27017 \
mongo:4.4 \
--auth

执行docker ps后,出现下列行,即表示mongoDB安装成功。(注意自行打开服务器防火墙和安全组)
在这里插入图片描述

1.2. 创建用户

登录mongo容器,并进入到【admin】数据库

 docker exec -it mongo mongo admin

创建一个用户,mongo 默认没有用户

db.createUser({ user:'root',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},'readWriteAnyDatabase']});

【user: 'root’ 】:设置用户名为root
【pwd: ‘123456’】:设置密码为123456
【role: ‘userAdminAnyDatabase’】:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
【db:‘admin’】:可操作的数据库
【 ‘readWriteAnyDatabase’】:赋予用户读写权限

dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile

1.3. 连接、测试

1.3.1. 使用docker连接mongo数据库(这里 admin不能换成其他数据库)

docker exec -it mongoDB mongo admin -u "root" -p "123456"

或者

docker exec -it mongoDB mongo admin

进入mongoDB后再输入:

db.auth('root', '123456')

1.3.2. 测试数据库,插入一条语句

 db.user.insert({"name":"zhangsan","age":18})

1.3.3. 测试数据库,查询刚才插入的语句

 db.user.find()

在这里插入图片描述

2. Mongodb Compass-图形化界面客户端

2.1. 下载

https://www.mongodb.com/try/download/compass
在这里插入图片描述
安装过程:
MongoDB Compass的安装及使用图文说明(非常详细)

2.2. 使用

在这里插入图片描述

这里也可以看见我们刚才插入的数据。
在这里插入图片描述

3. Spring整合mongoDB

3.1. 创建工程

在这里插入图片描述

3.2. 测试项目目录结构

在这里插入图片描述

3.3. 引入依赖以及配置

pom.xml

	<parent>
	        <groupId>org.springframework.boot</groupId>
	        <artifactId>spring-boot-starter-parent</artifactId>
	        <version>2.3.9.RELEASE</version>
	        <relativePath/> <!-- lookup parent from repository -->
	</parent>
	
	<dependencies>
<!--        测试-->
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
<!--        mongodb-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
<!--        lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
            <!--            <optional>true</optional>-->
        </dependency>
    </dependencies>

application.yml

spring: #数据源配置
  data:
    mongodb: # 主机地址
      uri: mongodb://root:123456@IP:27017/articledb?authSource=admin&authMechanism=SCRAM-SHA-1

3.4. 业务代码

CommentRepository

import cn.ljwwd_cst.entity.Comment;
import org.springframework.data.mongodb.repository.MongoRepository;

//评论的持久层接口
public interface CommentRepository extends MongoRepository<Comment,String> {

}

Comment

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
/**
 * 文章评论实体类 
 */
//把一个java类声明为mongodb的文档,可以通过collection参数指定这个类对应的文档。
// @Document(collection="mongodb 对应 collection 名")
// 若未加 @Document ,该 bean save 到 mongo 的 comment collection
// 若添加 @Document ,则 save 到 comment collection
@Document(collection="comment")// 可以省略,如果省略,则默认使用类名小写映射集合
// 复合索引   相当于mysql中的覆盖索引
// @CompoundIndex( def = "{'userid': 1, 'nickname': -1}")
@Data
public class Comment implements Serializable {
    //主键标识,该属性的值会自动对应mongodb的主键字段"_id",如果该属性名就叫“id”,则该注解可以省略,否则必须写
    @Id
    private String id;//主键
    // 该属性对应mongodb的字段的名字,如果一致,则无需该注解
    @Field("content")
    private String content;//吐槽内容
    private Date publishtime;//发布日期
    // 添加了一个单字段的索引  userid
    @Indexed
    private String userid;//发布人ID
    private String nickname;//昵称
    private LocalDateTime createdatetime;//评论的日期时间
    private Integer likenum;//点赞数
    private Integer replynum;//回复数
    private String state;//状态
    private String parentid;//上级ID
    private String articleid;//文章id
}

CommentServiceImpl

import cn.ljwwd_cst.dao.CommentRepository;
import cn.ljwwd_cst.entity.Comment;
import cn.ljwwd_cst.service.CommentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
public class CommentServiceImpl implements CommentService {
    //注入dao
    @Autowired
    private CommentRepository commentRepository;

    /**
     * 保存一个评论
     * @param comment 评论对象
     */
    @Override
    public void saveComment(Comment comment){
        //如果需要自定义主键,可以在这里指定主键;如果不指定主键,MongoDB会自动生成主键
        // 设置一些默认初始值。。。
        // 调用dao
        commentRepository.save(comment);
    }

    /**
     * 更新评论
     * @param comment 评论对象
     */
    @Override
    public void updateComment(Comment comment){
        //调用dao
        commentRepository.save(comment);
    }

    /**
     * 根据id删除评论
     * @param id 评论id
     */
    @Override
    public void deleteCommentById(String id){
        //调用dao
        commentRepository.deleteById(id);
    }

    /**
     * 查询所有评论
     * @return List<Comment>
     */
    @Override
    public List<Comment> findCommentList(){
        //调用dao
        return commentRepository.findAll();
    }

    /***
     * 根据id查询评论
     * @param id  评论id
     * @return  Comment
     */
    @Override
    public Comment findCommentById(String id){
        //调用dao
        final Optional<Comment> byId = commentRepository.findById(id);
        if (byId.isEmpty()){
            return new Comment();
        }
        return byId.get();
    }
}

CommentService

import cn.ljwwd_cst.entity.Comment;
import java.util.List;

public interface CommentService {

    /**
     * 保存一个评论
     * @param comment 评论对象
     */
    public void saveComment(Comment comment);

    /**
     * 更新评论
     * @param comment 评论对象
     */
    public void updateComment(Comment comment);

    /**
     * 根据id删除评论
     * @param id 评论id
     */
    public void deleteCommentById(String id);

    /**
     * 查询所有评论
     * @return List<Comment>
     */
    public List<Comment> findCommentList();

    /***
     * 根据id查询评论
     * @param id  评论id
     * @return  Comment
     */
    public Comment findCommentById(String id);
}

Main

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}

CommentServiceTests

import cn.ljwwd_cst.Main;
import cn.ljwwd_cst.entity.Comment;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.time.LocalDateTime;

//测试评论的业务层
//SpringBoot的Junit集成测试
@RunWith(SpringRunner.class)
//SpringBoot的测试环境初始化,参数:启动类
@SpringBootTest(classes = Main.class)
public class CommentServiceTests {
    //注入Service
    @Autowired
    private CommentService commentService;

    final Comment comment = new Comment();

    /**
     * 测试
     * 保存一个评论
     */
    @Test
    public void testSaveComment(){
        comment.setArticleid("100000");
        comment.setContent("测试添加的数据");
        comment.setCreatedatetime(LocalDateTime.now());
        comment.setUserid("1001");
        comment.setNickname("test");
        comment.setState("1");
        comment.setLikenum(0);
        comment.setReplynum(0);
        System.out.println(comment.getId());
        commentService.saveComment(comment);
        System.out.println(comment.getId());
    }

    /**
     * 测试
     * 更新评论
     */
    @Test
    public void updateComment(){
        comment.setUserid("1000");
        commentService.updateComment(comment);
    }

    /**
     * 根据id删除评论
     */
    @Test
    public void deleteCommentById(){
        commentService.deleteCommentById("63f8e4506edd972c92b7f7dd");
    }

    /**
     * 查询所有评论
     */
    @Test
    public void findCommentList(){
        System.out.println(commentService.findCommentList());
    }

    /***
     * 根据id查询评论
     */
    @Test
    public void findCommentById(){
        final Comment commentById = commentService.findCommentById("63f8e4506edd972c92b7f7dd");
        System.out.println(commentById);
    }
}

测试成功如下。(注意测试代码需自行修改)
在这里插入图片描述

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

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

相关文章

【项目精选】网络考试系统的设计与实现(源码+视频+论文)

点击下载源码 网络考试系统主要用于实现高校在线考试&#xff0c;基本功能包括&#xff1a;自动组卷、试卷发布、试卷批阅、试卷成绩统计等。本系统结构如下&#xff1a; &#xff08;1&#xff09;学生端&#xff1a; 登录模块&#xff1a;登录功能&#xff1b; 网络考试模块…

gdb openocd jlink arm-a9调试

连接关系是这样的&#xff1a;gdb —> openocd —>&#xff08;这里需要两个xx.cfg配置文件&#xff09; jlink —> arm-a9板子 具体流程是这样的&#xff1a; 给jlink&#xff08;硬件调试器&#xff09;安装驱动&#xff0c;用USB Driver Tool这个软件&#xff0c;…

02.24:图片的风格转换

Github网址&#xff1a;https://github.com/lengstrom/fast-style-transfer 在anaconda prompt中切换环境命令&#xff1a;activate 环境名 列出所有环境名&#xff1a;conda info --envs 安装环境&#xff1a;conda create -n 环境名 pythonx.x.x 删除某环境&#xff1a;co…

Spring Cloud Nacos源码讲解(八)- Nacos客户端服务订阅的事件机制剖析

Nacos客户端服务订阅的事件机制剖析 ​ 上次我们已经分析了Nacos客户端订阅的核心流程&#xff1a;Nacos客户端通过一个定时任务&#xff0c;每6秒从注册中心获取实例列表&#xff0c;当发现实例发生变化时&#xff0c;发布变更事件&#xff0c;订阅者进行业务处理&#xff0c…

WAF渗透攻防实践(16)

预备知识 WAF&#xff1a;WEB攻击一直是黑客攻击的主流手段&#xff0c;WAF作为网站安全基础设施的标配。Web Application Firewall&#xff0c;Web应用防火墙&#xff0c;通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的产品。 Nginx&#xff1a;Nginx 是…

京东10年经验测试工程师,整理出来的自动化测试学习路线,写给还在迷茫的你们

1、学习python基本语法。 2、上w3school这个网站&#xff08;2019年4月6日补充&#xff1a;网址是http://www.w3schools.com。但是现在这个网站被墙&#xff0c;而且出现众多山寨站点。。。这个网站的特点是你可以在网页上做一些练习&#xff0c;比如他教html的时候会让读者直…

Word的多级列表及自定义带级联编号有序列表的方法

1.多级列表的应用 输入列表时&#xff0c;列表项目符号或编号不应手动输入。可在输入文字后将光标放在文字所在段落&#xff0c;点击开始面板段落工具组的编号命令或者多级列表命令来生成编号。由于多级列表命令完全可以覆盖编号命令&#xff0c;且格式调整功能更强大&#xf…

ES数据迁移_snapshot(不需要安装其他软件)

参考文章&#xff1a; 三种常用的 Elasticsearch 数据迁移方案ES基于Snapshot&#xff08;快照&#xff09;的数据备份和还原CDH修改ElasticSearch配置文件不生效问题 目录1、更改老ES和新ES的config/elasticsearch.yml2、重启老ES&#xff0c;在老ES执行Postman中创建备份目录…

第45届世界技能大赛“网络安全”赛项浙江省选拔赛竞赛任务书

第45届世界技能大赛浙江省选拔赛竞赛任务书 一、竞赛时间 8:00-17:00&#xff0c;共计9小时。 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 模块A 任务1 数据库安全加固 8:00-10:00 50 任务2 文件MD5校验 50 任务3 Linux系统服务渗透测试及安全加…

洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk

最后水一篇水题题解&#xff08;实在太水了&#xff09; # [USACO1.3]混合牛奶 Mixing Milk ## 题目描述 由于乳制品产业利润很低&#xff0c;所以降低原材料&#xff08;牛奶&#xff09;价格就变得十分重要。帮助 Marry 乳业找到最优的牛奶采购方案。 Marry 乳业从一些奶农手…

【RabbitMQ笔记03】消息队列RabbitMQ七种模式之WorkQueues工作队列模式

这篇文章&#xff0c;主要介绍消息队列RabbitMQ七种模式之WorkQueues工作队列模式。 目录 一、工作队列模式 1.1、什么是Work Queues模式 1.2、工作队列模式的使用 &#xff08;1&#xff09;引入依赖 &#xff08;2&#xff09;编写生产者 &#xff08;3&#xff09;编写…

如何提高您的网站速度更好的符合SEO规范

如果觉得文章对你有用请点赞与关注&#xff0c;每一份支持都是我坚持更新更优质内容的动力&#xff01;&#xff01;&#xff01;慢速网站会受到用户和搜索引擎的惩罚。用户跳出&#xff0c;搜索引擎可以降低您的排名。为了针对搜索引擎和用户优化您的网站&#xff0c;您的网站…

Golang学习Day3

&#x1f60b; 大家好&#xff0c;我是YAy_17&#xff0c;是一枚爱好网安的小白。 本人水平有限&#xff0c;欢迎各位师傅指点&#xff0c;欢迎关注 &#x1f601;&#xff0c;一起学习 &#x1f497; &#xff0c;一起进步 ⭐ 。 ⭐ 此后如竟没有炬火&#xff0c;我便是唯一的…

Mybatis中的动态SQL

Mybatis中的动态SQL 当存在多条件查询的SQL时&#xff0c;当用户某个条件的属性没有写时&#xff0c;就会存在问题&#xff0c;在test中则不能很好的运行 所以Mybatis提出了动态SQL。 即判断用户是否输入了某个属性 动态SQL中的一些问题 方法一 这个里的and是为了确保if条…

三天吃透MySQL八股文(2023最新整理)

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…

口红品牌管理APP

伴随着科技的发展&#xff0c;多条产业和产品已经走上了智能化的道路&#xff0c;口红也是如此&#xff0c;口红的品牌众多&#xff0c;格式&#xff0c;色号更是令人难以区分&#xff0c;为了便于顾客选购和产品的科技化整理销售&#xff0c;利用课程所学知识&#xff0c;基于…

服务搭建篇(六) Kafka + Zookeeper集群搭建

一.Zookeeper 1.什么是Zookeeper ZooKeeper 是一个开源的分布式协调框架&#xff0c;是Apache Hadoop 的一个子项目&#xff0c;主要 用来解决分布式集群中应用系统的一致性问题。Zookeeper 的设计目标是将那些复杂且容 易出错的分布式一致性服务封装起来&#xff0c;构成一个…

linux pybind11 python c++ 混合编程(包括具体版本匹配的设置)

pybind11的处理过程 我首先安装了pybind&#xff0c;参考了许多教程&#xff0c;但很多教程的貌似都来自微软导出pyd的方法&#xff0c;但是实际上linux下导出so文件而非pyd文件&#xff0c;后续运行的实例来自https://github.com/tdegeus/pybind11_examples&#xff08;代码就…

设计模式(十一)----结构型模式之装饰者模式

1、概述 我们先来看一个快餐店的例子。 快餐店有炒面、炒饭这些快餐&#xff0c;可以额外附加鸡蛋、火腿、培根这些配菜&#xff0c;当然加配菜需要额外加钱&#xff0c;每个配菜的价钱通常不太一样&#xff0c;那么计算总价就会显得比较麻烦。 使用继承的方式存在的问题&…

为多态基类声明virtual析构函数

我们知道&#xff0c;有时会让一个基类指针指向用 new 运算符动态生成的派生类对象&#xff08;类似接口的作用&#xff09;&#xff1b;同时&#xff0c;用 new 运算符动态生成的对象都是通过 delete 指向它的指针来释放的。如果一个基类指针指向用 new 运算符动态生成的派生类…