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类

使用Navicat连接MongoDB


一、安装MongoDB

通过以下网盘链接下载MongoDB

链接:https://pan.baidu.com/s/19W4k3QURjw9YzVAqbPoQ2A?pwd=m4lh

提取码:m4lh

复制这段内容后打开百度网盘手机App,操作更方便哦

第一步:开始安装流程

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

第二步:勾选接受条款

第三步:选择安装路径

第四步:安装为本地服务

第五步:不安装Compass

最后一步:点击安装

二、springboot整合MongoDB

第一步:添加MongoDB的依赖

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

XML 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

第二步:配置数据库信息

XML 复制代码
spring:
  data:
    mongodb:
      port: 27017
      host: 127.0.0.1
      database: mhxysy

第三步:使用MongoTemplate

springboot测试类

java 复制代码
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接口

java 复制代码
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实体类

java 复制代码
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类

java 复制代码
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是自己定义的配置类的映射类

java 复制代码
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()方法

java 复制代码
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()方法指定将当前数据保存在哪个集合。

java 复制代码
@Document(collection = MongoDBCollectionKeys.KEY_mhxysy)

使用Navicat连接MongoDB

推荐一款非常简单实用的数据库连接工具Navicat Premiumhttps://blog.csdn.net/heyl163_/article/details/132111378

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

springboot整合mongodb案例项目https://gitee.com/muyu-chengfeng/springboot-mongodb.git

相关推荐
Albert Edison6 小时前
【最新版】IntelliJ IDEA 2025 创建 SpringBoot 项目
java·spring boot·intellij-idea
Piper蛋窝6 小时前
深入 Go 语言垃圾回收:从原理到内建类型 Slice、Map 的陷阱以及为何需要 strings.Builder
后端·go
六毛的毛9 小时前
Springboot开发常见注解一览
java·spring boot·后端
AntBlack9 小时前
拖了五个月 ,不当韭菜体验版算是正式发布了
前端·后端·python
31535669139 小时前
一个简单的脚本,让pdf开启夜间模式
前端·后端
uzong9 小时前
curl案例讲解
后端
开开心心就好10 小时前
免费PDF处理软件,支持多种操作
运维·服务器·前端·spring boot·智能手机·pdf·电脑
一只叫煤球的猫10 小时前
真实事故复盘:Redis分布式锁居然失效了?公司十年老程序员踩的坑
java·redis·后端
猴哥源码10 小时前
基于Java+SpringBoot的农事管理系统
java·spring boot
大鸡腿同学11 小时前
身弱武修法:玄之又玄,奇妙之门
后端