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: 27017
      host: 127.0.0.1
      database: 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;

    @Autowired
    MhxysyTests(MongoTemplate mongoTemplate) {
        this.mongoTemplate = mongoTemplate;
    }

    @Test
    void 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;

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每天五分钟计算机视觉:基于KNN算法完成图片分类任务

本文重点 在数字化和智能化的时代,图片分类作为计算机视觉领域的重要任务之一,已经广泛应用于各种场景,如安防监控、医疗诊断、智能推荐等。传统的图片分类方法往往需要复杂的手工特征提取和繁琐的分类器设计,而机器学习算法的引入为图片分类带来了不同的思路。 KNN算法概…

无人机航迹规划:人工原生动物优化器(Artificial Protozoa Optimizer ,APO)求解无人机路径规划,提供MATLAB代码

一、无人机模型介绍 单个无人机三维路径规划问题及其建模_无人机路径规划场景建模-CSDN博客 参考文献&#xff1a; [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120 二、人工原生动物优化算法APO求解无人机路径规…

什么台灯对眼睛好?一文给你分享具体什么台灯对眼睛好!

什么台灯对眼睛好&#xff1f;随着学生们最近陆续返校&#xff0c;家长们和孩子们都忙于开学初的准备工作&#xff0c;而眼睛的健康自然也是他们考虑的一部分。这也是护眼台灯在近年来变得非常普及的原因之一。我自己一直是一个近视的人&#xff0c;而且日常用眼时间也相当长。…

神经网络与深度学习——第15章 序列生成模型

本文讨论的内容参考自《神经网络与深度学习》https://nndl.github.io/ 第15章 序列生成模型&#xff0c;习题还没做先存在这里。 序列生成模型 序列概率模型 序列生成 N元统计模型 深度序列模型 模型结构 嵌入层 特征层 输出层 参数学习 评价方法 困惑度 BLEU算法 ROUGE算法 序…

「网络编程」基于 UDP 协议实现回显服务器

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;计网 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 实现回显服务器 &#x1f349;socket api&#x1f349;回显服务器&#x1f34c;实现&#x1f95d;服务器&#x1f95d;客户端 &#x1f3…

插入mysql报错:Incorrect string value: ‘\xF0\xAC\x8C\x97\xE5\x9E...‘

原因分析 这个错误通常发生在使用MySQL数据库时&#xff0c;尝试将包含四字节UTF-8字符&#xff08;通常表示为Unicode码点大于UFFFF的字符&#xff09;插入到一个不支持这种字符的字符集列中。一般在插入睡眠emoji表情时容易遇到 解决 -- 设置数据库编码utf8mb4 ALTER DAT…

伦敦金当前行情你真的看懂了吗?

5月中旬&#xff0c;伦敦金价将历史新高再次改写至2450美元/盎司&#xff0c;虽然随后两周出现了反复回落的走势&#xff0c;但整体的升浪仍然受到50天指数移动平均线的支撑。有分析机构预计&#xff0c;随着美联储美联储开始放缓缩表和开启降息周期&#xff0c;来年的伦敦金价…

Spring Boot自动配置原理和应用

我们知道&#xff0c;基于Spring Boot&#xff0c;我们只需要在类路径中引入一组第三方框架的starter组件&#xff0c;就能在Spring容器中使用这些框架所提供的各项功能。这在当下的开发过程中已经习以为常&#xff0c;但在Spring Boot还没有诞生之前却是不可想象的。如果我们使…

【Text2SQL 论文】QDecomp:探索 CoT-style 的 prompt 来解决 Text2SQL

论文&#xff1a;Exploring Chain of Thought Style Prompting for Text-to-SQL ⭐⭐⭐⭐ EMNLP 2023, arXiv:2305.14215 一、论文速读 本文通过对 LLM 使用 CoT-style 的 prompting 方法来解决 Text2SQL 问题&#xff0c;试图回答下面两个问题&#xff1a; 哪种 prompting s…

英伟达GPU架构加速狂飙

NVIDIA首席执行官黄仁勋在台湾大学体育馆发表主题演讲&#xff0c;展示了新一代Rubin架构&#xff0c;这是NVIDIA加速推出新架构的最新成果。 在讨论NVIDIA下一代架构时&#xff0c;黄仁勋提到了Blackwell Ultra GPU&#xff0c;并表示它可能会继续升级。然后他透露&#xff0c…

Zoom | saas企业分销裂变的典范

提到视频通讯&#xff0c;相信大家不会陌生&#xff0c;国外有Skype、Google meeting、Facetime&#xff0c;国内有腾讯会议、钉钉&#xff0c;为什么在如此众多竞争对手的情况下&#xff0c;Zoom能够一马当先&#xff0c;成为行业先锋&#xff1f; 一、公司简介 Zoom是集视频…

【电路笔记】-Sallen-Key滤波器

Sallen-Key滤波器 Sallen-Key 滤波器拓扑用作实现高阶有源滤波器的构建块。 1、概述 Sallen-Key 滤波器设计是一种二阶有源滤波器拓扑,我们可以将其用作实现高阶滤波器电路的基本构建块,例如低通 (LPF)、高通 (HPF) 和带通 ( BPF)滤波器电路。 正如我们在本滤波器部分中…

反激电源的类型与特点

主要分为 1 固定频率&#xff08;CCMDCM&#xff09; 2 可变频率控制&#xff08;CRM电流临界模式&#xff09; 这三种模式是很好辨别的&#xff0c;首先我们看左边的连续模式&#xff0c;Vds能看到他有一些尖峰毛刺&#xff0c;这是场效应管关闭的时候&#xff0c;LRC谐振导…

揭秘FL Studio21.2.8中文版一键解锁音乐创作新境界!

在音乐制作的广阔天地里&#xff0c;随着技术的不断进步和数字音频工作站&#xff08;DAW&#xff09;软件的普及&#xff0c;越来越多的音乐爱好者和专业制作人开始涉足音乐创作的奇妙旅程。其中&#xff0c;FL Studio以其强大的功能、直观的操作界面和丰富的音色资源&#xf…

用户管理的小demo--登录校检

目录 在user里面 装session 1、 LoginServlet.java 2、LoginFilter.java 3、配置路径 结果&#xff1a; 在user里面 装session 1、 LoginServlet.java package com.by.servlet;import com.by.pojo.User; import com.by.service.UserService; import com.by.service.impl…

云原生环境下GPU算力调度发展分析

云原生环境下GPU算力调度深度分析 概述&#xff1a; 云原生时代&#xff0c;GPU算力调度与管理备受瞩目&#xff0c;成为企业和云服务提供商关注的焦点&#xff0c;助力AI、深度学习、高性能计算等领域&#xff0c;满足对GPU资源的迫切需求。 容器化与编排&#xff1a; Kube…

LLM的基础模型4:初识Embeddings

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…

2024.5.30

思维导图 代码 #include <iostream>using namespace std; class Rect { private:int width;int height; public:void init(int w,int h){width w;height h;}void set_w(int w){width w;}void set_h(int h){height h;}void show(){int zhou (width height) * 2;int…

vue-router 源码分析——2. router-link 组件是如何实现导航的

这是对vue-router 3 版本的源码分析。 本次分析会按以下方法进行&#xff1a; 按官网的使用文档顺序&#xff0c;围绕着某一功能点进行分析。这样不仅能学习优秀的项目源码&#xff0c;更能加深对项目的某个功能是如何实现的理解。这个对自己的技能提升&#xff0c;甚至面试时…

使用raise语句抛出异常

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 如果某个函数或方法可能会产生异常&#xff0c;但不想在当前函数或方法中处理这个异常&#xff0c;则可以使用raise语句在函数或方法中抛出异常。rai…