windows上安装MongoDB,springboot整合MongoDB

上一篇文章已经通过在Ubuntu上安装MongoDB详细介绍了MongoDB的各种命令用法。

Ubuntu上安装、使用MongoDB详细教程icon-default.png?t=N7T8https://blog.csdn.net/heyl163_/article/details/133781878

这篇文章介绍一下在windows上安装MongoDB,并通过在springboot项目中使用MongoDB记录用户操作的日志~
 


目录

一、安装MongoDB

第一步:开始安装流程

第二步:勾选接受条款

第三步:选择安装路径

第四步:安装为本地服务

第五步:不安装Compass

最后一步:点击安装​编辑

二、springboot整合MongoDB

第一步:添加MongoDB的依赖

第二步:配置数据库信息

第三步:使用MongoTemplate

三、MongoDB实战

第一步:创建MongoDB实体类

第二步:创建AOP类


一、安装MongoDB

通过以下网盘链接下载MongoDB

链接:https://pan.baidu.com/s/19W4k3QURjw9YzVAqbPoQ2A?pwd=m4lh
提取码:m4lh
复制这段内容后打开百度网盘手机App,操作更方便哦

第一步:开始安装流程

双击下载下来的安装包,开始拉起安装流程

第二步:勾选接受条款

第三步:选择安装路径

第四步:安装为本地服务

第五步:不安装Compass

最后一步:点击安装

二、springboot整合MongoDB

第一步:添加MongoDB的依赖

springboot有整合了MongoDB的依赖,直接在项目的pom.xml中引入,版本和springboot版本一致

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

第二步:配置数据库信息

spring:data:mongodb:port: 27017host: 127.0.0.1database: mhxysy

第三步:使用MongoTemplate

springboot测试类

package cn.edu.sgu.www.mhxysy;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;import java.util.List;/*** springboot测试类* @author heyunlin* @version 1.0*/
@SpringBootTest
class MhxysyTests {private final MongoTemplate mongoTemplate;@AutowiredMhxysyTests(MongoTemplate mongoTemplate) {this.mongoTemplate = mongoTemplate;}@Testvoid contextLoads() {boolean exists = mongoTemplate.collectionExists(MongoDBCollectionKeys.KEY_mhxysy);if (!exists) {mongoTemplate.createCollection(MongoDBCollectionKeys.KEY_mhxysy);} else {List<Object> list = mongoTemplate.findAll(Object.class);System.out.println(list);}}}

MongoDBCollectionKeys接口

package cn.edu.sgu.www.mhxysy.consts;/*** MongoDB集合名称常量接口* @author heyunlin* @version 1.0*/
public interface MongoDBCollectionKeys {/*** 集合后缀*/String suffix = "_operateLogs";/*** mhxysy服务的MongoDB集合名称*/String KEY_mhxysy = "mhxysy" + suffix;/*** authority服务的MongoDB集合名称*/String KEY_authority = "authority" + suffix;
}

三、MongoDB实战

使用AOP的环绕通知,把系统的访问日志保存到MongoDB中。

第一步:创建MongoDB实体类

package cn.edu.sgu.www.mhxysy.aop;import cn.edu.sgu.www.mhxysy.consts.MongoDBCollectionKeys;
import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document;import java.io.Serializable;/*** @author heyunlin* @version 1.0*/
@Data
@Document(collection = MongoDBCollectionKeys.KEY_mhxysy)
public class OperateLog implements Serializable {private static final long serialVersionUID = 18L;/*** 编号*/private String id;/*** 访问用户编号*/private String userId;/*** 访问用户名称*/private String username;/*** IP地址*/private String ip;/*** 操作url*/private String operateUrl;/*** 操作名称*/private String operateName;/*** 浏览器类型*/private String browserType;/*** 请求参数*/private String requestParams;/*** 操作时间*/private String operateTime;
}

第二步:创建AOP类

package cn.edu.sgu.www.mhxysy.aop;import cn.edu.sgu.www.mhxysy.config.property.SystemSettingsProperties;
import cn.edu.sgu.www.mhxysy.consts.IdentifierPrefixes;
import cn.edu.sgu.www.mhxysy.redis.RedisUtils;
import cn.edu.sgu.www.mhxysy.util.*;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;/*** @author heyunlin* @version 1.0*/
@Slf4j
@Aspect
@Component
public class LogAop {private final RedisUtils redisUtils;private final MongoTemplate mongoTemplate;private final SystemSettingsProperties systemSettingsProperties;@Autowiredpublic LogAop(RedisUtils redisUtils, MongoTemplate mongoTemplate, SystemSettingsProperties systemSettingsProperties) {this.redisUtils = redisUtils;this.mongoTemplate = mongoTemplate;this.systemSettingsProperties = systemSettingsProperties;}@Pointcut("execution(public * cn.edu.sgu.www.mhxysy.controller..*.*(..))")public void logAop() { }@Around("logAop()")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {HttpServletRequest request = HttpUtils.getRequest();String requestURI = request.getRequestURI();// 开启日志才保存if (systemSettingsProperties.isEnableLog()) {Object[] args = joinPoint.getArgs();String requestArgs = null;if (args != null && args.length > 0) {requestArgs = Arrays.toString(joinPoint.getArgs());log.debug("操作资源参数:{} => {}", requestURI, requestArgs);}// 获取方法签名MethodSignature signature = (MethodSignature) joinPoint.getSignature();// 获取方法上的@ApiOperation注解ApiOperation annotation = signature.getMethod().getDeclaredAnnotation(ApiOperation.class);/** 保存日志到MongoDB*/OperateLog operateLog = new OperateLog();operateLog.setId(uuid());boolean isLogin = UserUtils.getSubject().isAuthenticated();if (isLogin) {operateLog.setUserId(UserUtils.getUserId());operateLog.setUsername(UserUtils.getLoginUsername());}operateLog.setIp(IpUtils.getIp());operateLog.setBrowserType(IpUtils.getBrowserType());operateLog.setOperateUrl(requestURI);operateLog.setRequestParams(requestArgs);operateLog.setOperateTime(StringUtils.toTimeString(TimeUtils.now()));operateLog.setOperateName(annotation.value());mongoTemplate.save(operateLog);//mongoTemplate.save(operateLog, MongoDBCollectionKeys.KEY_mhxysy);}return joinPoint.proceed();}private String uuid() {return IdentifierPrefixes.PREFIX_OPERATE_LOG + redisUtils.uuid();}}

SystemSettingsProperties是自己定义的配置类的映射类

package cn.edu.sgu.www.mhxysy.config.property;import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;/*** @author heyunlin* @version 1.0*/
@Data
@ApiModel
@Component
@ConfigurationProperties(prefix = "system.settings")
public class SystemSettingsProperties {/*** 百度地图的应用AK*/@ApiModelProperty(value = "应用AK")private String ak;/*** 百度地图sn校验的SK*/@ApiModelProperty(value = "校验SK")private String sk;/*** 时区ID*/@ApiModelProperty(value = "时区ID")private String zoneId;/*** 是否开启日志*/@ApiModelProperty(value = "是否开启日志")private boolean enableLog;/*** session过期时间*/@ApiModelProperty(value = "session过期时间")private Long sessionTimeout;/*** 是否使用真实地理位置*/@ApiModelProperty(value = "是否使用真实地理位置")private boolean useRealLocation;/*** 是否开启鉴权*/@ApiModelProperty(value = "是否开启鉴权")private boolean enableAuthorization;/*** 是否自动创建表*/@ApiModelProperty(value = "是否自动创建表")private boolean enableTableAutoCreation;/*** 是否开启actuator端点的鉴权*/@ApiModelProperty(value = "是否开启actuator端点的鉴权")private boolean enableActuatorAuthorization;
}

MongoTemplate有两个重载的save()方法

public class MongoTemplate implements MongoOperations, ApplicationContextAware, IndexOperationsProvider {@Overridepublic <T> T save(T objectToSave) {Assert.notNull(objectToSave, "Object to save must not be null!");return save(objectToSave, getCollectionName(ClassUtils.getUserClass(objectToSave)));}@Override@SuppressWarnings("unchecked")public <T> T save(T objectToSave, String collectionName) {Assert.notNull(objectToSave, "Object to save must not be null!");Assert.hasText(collectionName, "Collection name must not be null or empty!");AdaptibleEntity<T> source = operations.forEntity(objectToSave, mongoConverter.getConversionService());return source.isVersionedEntity() //? doSaveVersioned(source, collectionName) //: (T) doSave(collectionName, objectToSave, this.mongoConverter);}}

当MongoDB的实体类上通过@Document的collection属性指定了集合名称时,使用第一个单参数save()方法即可。

如果没有指定collection属性,则使用第二个save()方法指定将当前数据保存在哪个集合。

@Document(collection = MongoDBCollectionKeys.KEY_mhxysy)

好了,文章就分享到这里了,看完不要忘了点赞+收藏哦~

springboot整合mongodb案例项目icon-default.png?t=N7T8https://gitee.com/muyu-chengfeng/springboot-mongodb.git

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

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

相关文章

SpaceX: 太空火箭自主精准着陆

本文是根据Lars Blackmore在16年的一篇公开论文翻译而来&#xff0c;虽然有些早而且是科普文章&#xff0c;但是可以初见一些SpaceX火箭着陆的细节&#xff0c;后面我会对spaceX landing control 技术主管MIT博士期间研究火箭控制算法的论文进行讲解&#xff0c;敬请期待。 Lar…

【php实战项目训练】——thinkPhP的登录与退出功能的实现,让登录退出畅通无阻

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

C/C++ 进阶(5)二叉平衡搜索树(AVL树)

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;C 目录 一、概念 二、平衡因子 三、操作 插入 旋转 左单旋 右单旋 左右双旋 右左双旋 一、概念 二叉平衡搜索树又称AVL树&#xff0c;是一种特殊的二叉搜索树。一般的二叉搜索树在遇到数据有序时&…

SOLIDWORKS修改零件时出现错误怎么办?

我们在使用SOLIDWOKRS进行零件建模过程中往往避免不了修改&#xff0c;但在修改后又常常会出现零件报错的情况&#xff0c;设计树中会出现一堆的错误和警告&#xff0c;我们如何快速处理这些问题呢&#xff1f; 我们都知道SOLIDWOKRS零件通常包含两大类的对象&#xff0c;分别…

Docker 入门版

目录 1. 关于Docker 2. Dockr run命令中常见参数解读 3. Docker常见命令 4. Docker 数据卷 5. Docker本地目录挂载 6. 自定义镜像 Dockerfile 语法 自定义镜像模板 Demo 7. Docker网络 1. 关于Docker 在docker里面下载东西&#xff0c;就是相当于绿色面安装板&#x…

python之生成器表达式

背景 生成器表达式&#xff0c;整个表达式都是另一个函数的唯一入参&#xff0c;则不需要带括号&#xff1b;若他只是其中一个参数&#xff0c;则需要圆括号包裹。 演示

响应式流和reactor框架进阶

响应式流和reactor框架进阶 响应式流创建、转换、处理 本文档主要介绍在响应式编程中如何从流中获取数据并处理。 前提条件 假设您已经能掌握Java基础、Maven使用、Lamda表达式、响应式编程等基础。 如何获取流中数据 &#x1f30f; 说明 1、不要试图从流中获取数据出来&a…

MMUNet:形态学特征增强网络在结肠癌病理图像分割中的应用

MMUNet: Morphological feature enhancement network for colon cancer segmentation in pathological images. 发表在&#xff1a;Biomedical Signal Processing and Control2024--影响因子&#xff1a;3.137 南华大学的论文 论文地址&#xff1a;main.pdf (sciencedirecta…

地理信息科学中的大数据挑战

在信息化爆炸的时代&#xff0c;地理信息科学&#xff08;GIScience&#xff09;正经历着前所未有的变革&#xff0c;其中&#xff0c;地理空间大数据的涌现为科学研究与应用带来了前所未有的机遇与挑战。作为地理信息与遥感领域的探索者&#xff0c;本文旨在深入剖析地理空间大…

找不到steam_api64.dll,无法继续执行的原因及解决方法

电脑已经成为我们生活中不可或缺的一部分。然而&#xff0c;在使用电脑的过程中&#xff0c;我们经常会遇到一些常见的问题&#xff0c;其中之一就是找不到某个特定的动态链接库文件&#xff0c;比如steamapi64.dll。这个问题可能会导致某些应用程序无法正常运行&#xff0c;给…

音视频开发—音频相关概念:数模转换、PCM数据与WAV文件详解

文章目录 前言1.模拟数字转换&#xff08;ADC&#xff09;1.1ADC的关键步骤&#xff1a; 2.数字模拟转换&#xff08;DAC&#xff09;2.1DAC 的基本流程包括&#xff1a; 3.PCM数据3.1PCM 数据的关键要素包括&#xff1a; 4.WAV文件4.1 WAV的构成4.2WAV文件的标准块结构4.3WAV的…

kettle从入门到精通 第六十五课 ETL之kettle 执行动态SQL语句,轻松实现全量增量数据同步

本次课程的逻辑是同步t1表数据到t2表&#xff0c;t1和t2表的表机构相同&#xff0c;都有id&#xff0c;name,createtime三个字段。 CREATE TABLE t1 (id bigint NOT NULL AUTO_INCREMENT,name varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,cr…

View->Bitmap缩放到自定义ViewGroup的任意区域(Matrix方式绘制Bitmap)

Bitmap缩放和平移 加载一张Bitmap可能为宽高相同的正方形&#xff0c;也可能为宽高不同的矩形缩放方向可以为中心缩放&#xff0c;左上角缩放&#xff0c;右上角缩放&#xff0c;左下角缩放&#xff0c;右下角缩放Bitmap中心缩放&#xff0c;包含了缩放和平移两个操作&#xf…

数据整理操作及众所周知【数据分析】

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…

Opencv 色彩空间

一 核心知识 色彩空间变换&#xff1b; 像素访问&#xff1b; 矩阵的、-、*、、&#xff1b; 基本图形的绘制 二 颜色空间 RGB&#xff1a;人眼的色彩空间&#xff1b; OpenCV默认使用BGR&#xff1b; HSV/HSB/HSL; YUV(视频); 1 RGB 2 BGR 图像的多种属性 1 访问图像(Ma…

Pytorch 笔记

执行下面这段代码后&#xff0c;为什么返回的是 2 &#xff1f; vector torch.tensor([7, 7]) vector.shape为什么返回的是 torch.Size([2])&#xff1f; 当你创建一个PyTorch张量时&#xff0c;它会记住张量中元素的数量和每个维度的大小。在你的代码中&#xff0c;torch.t…

Redis 线程模型

Redis 线程模型 背景简介Redis 单线程客户端发起 Redis 请求命令的工作原理单线程面临的挑战及问题 Redis 多线程Redis v4.0 多线程命令Redis v6.0 多线程网络模型 总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术…

LangChain学习之 Question And Answer的操作

1. 学习背景 在LangChain for LLM应用程序开发中课程中&#xff0c;学习了LangChain框架扩展应用程序开发中语言模型的用例和功能的基本技能&#xff0c;遂做整理为后面的应用做准备。视频地址&#xff1a;基于LangChain的大语言模型应用开发构建和评估。 2. Q&A的作用 …

了解VS安全编译选项GS

缓冲区溢出攻击的基本原理就是溢出时覆盖了函数返回地址&#xff0c;之后就会去执行攻击者自己的函数&#xff1b; 针对缓冲区溢出时覆盖函数返回地址这一特征&#xff0c;微软在编译程序时使用了安全编译选项-GS&#xff1b; 目前版本的Visual Studio中默认启用了这个编译选项…

Java-----String类

1.String类的重要性 经过了C语言的学习&#xff0c;我们认识了字符串&#xff0c;但在C语言中&#xff0c;我们表示字符串进行操作的话需要通过字符指针或者字符数组&#xff0c;可以使用标准库中提供的一系列方法对字符串的内容进行操作&#xff0c;但这种表达和操作数据的方…