windows上安装MongoDB,springboot整合MongoDB
上一篇文章已经通过在Ubuntu上安装MongoDB详细介绍了MongoDB的各种命令用法。
Ubuntu上安装、使用MongoDB详细教程
https://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案例项目
https://gitee.com/muyu-chengfeng/springboot-mongodb.git
相关文章:
windows上安装MongoDB,springboot整合MongoDB
上一篇文章已经通过在Ubuntu上安装MongoDB详细介绍了MongoDB的各种命令用法。 Ubuntu上安装、使用MongoDB详细教程https://blog.csdn.net/heyl163_/article/details/133781878 这篇文章介绍一下在windows上安装MongoDB,并通过在springboot项目中使用MongoDB记录用户…...
python_04
37、列表推导式 # 作用:快速生成列表 # 列表变量名 [x for x in range(开始值,结束值,步长) if 条件] # 注意:左闭右开 list1 [i for i in range(0,100)] print(list1) # list1 [i for i in range(0,100)] # print(list1)list…...
音视频视频点播
视频点播是集音视频采集,编辑,上传,自动化转码处理,媒体资源管理,高效云剪辑处理,分发加速,视频播放于一体的一站式音视频点播解决方案 阿里云视频点播基于阿里云强大的基础设施服务,…...
Git常用命令1
1、设置用户签名 ①基本语法: git config --global user.name 用户名 git config --global user.email 邮箱 ②实际操作 ③查询是否设置成功 cat ~/.gitconfig 注:签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交…...
Nextjs使用教程
一.手动创建项目 建议看这个中文网站文档,这个里面的案例配置都是手动的,也可以往下看我这个博客一步步操作 1.在目录下执行下面命令,初始化package.json文件 npm init -y2.安装react相关包以及next包 yarn add next react react-dom // 或者 npm install --save next react…...
mysql的增删查改(进阶)
目录 一. 更复杂的新增 二. 查询 2.1 聚合查询 COUNT SUM AVG MAX MIN 2.1.2 分组查询 group by 子句 2.1.3 HAVING 2.2 联合查询/多表查询 2.2.1 内连接 2.2.2 外连接 2.2.3 全外连接 2.2.4 自连接 2.2.5 子查询 2.2.6 合并查询 一. 更复杂的新增 将从表名查询到…...
九、从0开始卷出一个新项目之瑞萨RZN2L生产烧录固件(jflash擦写读外挂flash)
目录 七、生产烧录固件(jflash擦/写/读外挂flash) 7.1 flash母片读写 7.2 jflash擦/写/读外挂flash 九、从0开始卷出一个新项目之瑞萨RZN2L 七、生产烧录固件(jflash擦写读外挂flash) 七、生产烧录固件(jflash擦/写/读外挂flash) 7.1 flash母片读写 略 7.2 jflash擦/写/读…...
安徽某高校数据挖掘作业4-5 (与一些碎碎念)
1. 编写程序求函数、、的极限。 解答: import sympy as sp# 定义符号变量 x x sp.symbols(x)# 定义函数 f1 sp.sin(20 * x) / x f2 (1 4 * x)**(2 / x) f3 (1 4 / x)**(2 * x)# 计算极限 limit1 sp.limit(f1, x, 0) limit2 sp.limit(f2, x, 0) limit3 sp…...
基于ES安装IK分词插件
前言 IK分词器插件是为Elasticsearch设计的中文分词插件,由Elasticsearch的官方团队之外的开发者medcl开发。它主要针对中文文本的分词需求,提供了较为准确的中文分词能力。以下是IK分词器插件的一些特点: 智能分词:IK分词器采用基…...
php项目加密源码
软件简介 压缩包里有多少个php就会被加密多少个PHP、php无需安装任何插件。源码全开源 如果上传的压缩包里有子文件夹(子文件夹里的php文件也会被加密),加密后的压缩包需要先修复一下,步骤:打开压缩包 》 工具 》 修…...
测绘GIS和遥感领域比较好的公众号有哪些
测绘GIS和遥感领域,微信公众号作为信息传播和知识分享的重要渠道,为从业者提供了一个快速获取行业动态、技术进展和职业发展机会的平台。分享一些在测绘GIS和遥感领域表现突出的公众号推荐: 1. 慧天地:慧天地是一个知名的测绘公众…...
【技术实操】银河高级服务器操作系统实例分享,达梦数据库服务器 oom 问题分析
1. 服务器环境以及配置 【 机型】 处理器: HUAWEIKunpeng 920 5220 内存: 400518528 kB 主板型号: Chaoqiang K620 series 整机类型/架构: ARM BIOS 版本: KL4.41.028.TF.220224.R 固件版本: KL4.41…...
通过ffmpeg 将wav格式转为mp3格式.
通过ffmpeg实现将wav转为mp3格式.需要下载一个ffmpeg放到执行文件所在目录. 我ffmpeg的下载地址为:ffmpeg.exe下载-ffmpeg.exe32&64位下载免费版-旋风软件园 use ShellAPI; {$R *.dfm}procedure ConvertWavToMp3(const InputFile, OutputFile: string); varExecu…...
快速上手RabbitMQ,直接上开发!
一 直接使用Rabbit MQ 在Java项目中使用Rabbit MQ可以通过引入Rabbit MQ的客户端Maven依赖,和Rabbit MQ建立连接进行通信。这种就属于是直接使用Rabbit MQ。 基本使用 创建连接后,使用channel向交换机发送消息 public class Producer {private final s…...
如何实现单例模式及不同实现方法分析-设计模式
这是 一道面试常考题:(经常会在面试中让手写一下) 什么是单例模式 【问什么是单例模式时,不要答非所问,给出单例模式有两种类型之类的回答,要围绕单例模式的定义去展开。】 单例模式是指在内存中只会创建…...
wampserver安装与汉化
wampserver安装与汉化 文章目录 wampserver安装与汉化一、安装二、汉化1.升级软件并安装补丁 介绍: WampServer是一款由法国人开发的Apache Web服务器、PHP解释器以及MySQL数据库的整合软件包。免去了开发人员将时间花费在繁琐的配置环境过程,从而腾出更…...
解决MyBatis的N+1问题
解决MyBatis的N1问题 N1问题通常出现在一对多关联查询中。当我们查询主表数据(如订单)并希望获取关联的从表数据(如订单的商品)时,如果每获取一条主表记录都要执行一次从表查询,就会产生N1次查询的问题。假…...
12-学生们参加各科测试的次数(高频 SQL 50 题基础版)
12-学生们参加各科测试的次数 -- 学生表中,id是唯一的,将他作为主表 -- CROSS JOIN产生了一个结果集,该结果集是两个关联表的行的乘积 -- 2行表,与3行表使用cross join,得到2*36行数据 select st.student_id, st.student_name,su.subject_na…...
2024网络与信息安全管理员职工职业技能竞赛re0220164094
main部分,就是要逆这部分shellcode,程序把data段里面的东西复制到bss段去执行,期间包含解码操作。 v19 0;puts("Please input your flag: ");__isoc99_scanf("%s", s);if ( strlen(s) ! 38 ){puts("Wrong length!&…...
Elasticsearch--easy-ES框架使用,轻松操作查询Elasticsearch,简化开发
Easy-Es(简称EE)是一款基于ElasticSearch(简称Es)官方提供的RestHighLevelClient打造的ORM开发框架,在 RestHighLevelClient 的基础上,只做增强不做改变,为简化开发、提高效率而生,您如果有用过Mybatis-Plus(简称MP),那么您基本可…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...
【java】【服务器】线程上下文丢失 是指什么
目录 ■前言 ■正文开始 线程上下文的核心组成部分 为什么会出现上下文丢失? 直观示例说明 为什么上下文如此重要? 解决上下文丢失的关键 总结 ■如果我想在servlet中使用线程,代码应该如何实现 推荐方案:使用 ManagedE…...
