Mongodb-Plus 轻松上手

ops/2024/10/31 1:33:43/

目录

前言

一、集成配置

1.1 添加依赖

1.2 配置

二、编码示例

三、其他配置

3.1 配置文件

3.1.1 日志配置

3.1.2 字段配置

3.1.3 小黑子模式

3.1.4 逻辑删除配置

logic-not-delete-value​

3.2 拦截器

3.2.1 数据变动记录拦截器

3.2.2 数据变动记录拦截器

3.3 效果展示


前言

        该篇需要有MyBatisPlus的基础,MyBatisPlus就是可以不用像MyBatis一样写过多的sql语句,Mongo-Plus也一样。

一、集成配置

Mongo-Plus(简称 MP)是一个 MongoDB 的操作工具,可和现有mongoDB框架结合使用,为简化开发、提高效率而生。

1.1 添加依赖

引入 Spring Boot Starter 父工程:(需要2.6以上版本)

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6+ 版本</version><relativePath/>
</parent>
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.gitee.anwena</groupId><artifactId>mongo-plus-boot-starter</artifactId><version>2.1.4(当前最新版本)</version></dependency>
</dependencies>

SpringBoot低版本,如2.1、2.2等,需要做一些额外的操作:

pom文件: SpringBoot控制了MongoDB驱动的版本,所以需要进行排除,然后重新引入

<dependency><groupId>com.gitee.anwena</groupId><artifactId>mongo-plus-boot-starter</artifactId><version>2.1.4</version><exclusions><exclusion><artifactId>bson</artifactId><groupId>org.mongodb</groupId></exclusion><exclusion><artifactId>mongodb-driver-core</artifactId><groupId>org.mongodb</groupId></exclusion></exclusions>
</dependency>
<dependency><groupId>org.mongodb</groupId><artifactId>bson</artifactId><version>4.9.0</version>
</dependency>
<dependency><groupId>org.mongodb</groupId><artifactId>mongodb-driver-core</artifactId><version>4.9.0</version>
</dependency>

启动类:

        为了适配MongoTemplate,OverrideMongoConfiguration做了一些配置,但是和低版本的并不兼容,所以只需将OverrideMongoConfiguration排除即可

//排除OverrideMongoConfiguration配置类
@SpringBootApplication(exclude = OverrideMongoConfiguration.class)
// 如报错相关类为:MongoPropertyConfiguration.class,则需要将MongoPropertyConfiguration也一并排除
//@SpringBootApplication(exclude = {OverrideMongoConfiguration.class, MongoPropertyConfiguration.class})
public class MongoPlusDemoApplication {public static void main(String[] args) {SpringApplication.run(MongoPlusDemoApplication.class, args);}}

1.2 配置

在 application.yml 配置文件中添加 MongoPlus 相关配置:

mongo-plus:data:mongodb:host: 127.0.0.1   #ipport: 27017   #端口database: test    #数据库名username: test    #用户名,没有可不填(若账号中出现@,!等等符号,不需要再进行转码!!!)password: test    #密码,同上(若密码中出现@,!等等符号,不需要再进行转码!!!)authenticationDatabase: admin     #验证数据库connectTimeoutMS: 50000   #在超时之前等待连接打开的最长时间(以毫秒为单位)

二、编码示例

编写实体类:

package cn.hiii.cloud.module.mongodb.entity;import com.anwen.mongo.annotation.ID;
import com.anwen.mongo.annotation.collection.CollectionLogic;
import com.anwen.mongo.annotation.collection.CollectionName;
import com.anwen.mongo.enums.IdTypeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;import java.io.Serializable;@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
@CollectionName("persons") //标识实体类对应的集合
public class User implements Serializable {@ID(type = IdTypeEnum.ASSIGN_ID) //自动生成雪花idprivate String id;private String userName;private Integer userStatus;private Integer age;
}

编写Service下的UserService和实现类UserServiceImpl,像MyBatisPlus一样

public interface UserService extends IService<User> {}

public class UserServiceImpl extends ServiceImpl<User> implements UserService {}

添加测试类,进行功能测试:

@SpringBootTest
public class SampleTest {@Autowiredprivate UserService userService;@Testpublic void testSelect() {System.out.println(("----- selectAll method test ------"));List<User> userList = userService.list();userList.forEach(System.out::println);}}

无实体使用BaseMapper集合拥有所有方法

三、其他配置

3.1 配置文件

3.1.1 日志配置

log:

  • 类型:Boolean
  • 默认值:false

是否开启日志输出,默认false

logOrder:

  • 类型:Integer
  • 默认值:0

用来指定log拦截器,在拦截器链中的order

format:

  • 类型:Boolean
  • 默认值:false

是否开启格式化日志

pretty:

  • 类型: Boolean
  • 默认值: false

是否将打印的命令转为MongoDB可执行的语句

mongo-plus:log: trueformat: truepretty: true

3.1.2 字段配置

camelToUnderline:

  • 类型:Boolean
  • 默认值:false

是否开启驼峰转下划线

ignoringNull:

  • 类型:Boolean
  • 默认值:true

是否忽略null属性

mongo-plus:configuration:field:camelToUnderline: trueignoringNull: false

3.1.3 小黑子模式

mongo-plus:configuration:ikun: truebanner: true #banner打印

3.1.4 逻辑删除配置

open:

  • 类型:boolean
  • 默认值:false

是否开启逻辑删除功能

auto-fill:

  • 类型:boolean
  • 默认值:false

是否开启逻辑字段默认填充功能

logic-delete-field:

  • 类型:String
  • 默认值:null

全局逻辑删除字段(对应 mongodb 文档字段,开启逻辑删除必要值)

logic-delete-value:

  • 类型:String

  • 默认值:1

标志为全局逻辑删除

logic-not-delete-value:

  • 类型:String

  • 默认值:0

标志为全局逻辑未删除

mongo-plus:configuration:logic:open: true                    # 开启逻辑删除功能auto-fill: true               # 开启拦截器自动填充逻辑删除字段,开启逻辑删除功能前提下生效logic-delete-field: logicDel  # 全局逻辑删除字段(string 类型)logic-delete-value: 1         # 标记逻辑删除值logic-not-delete-value: 0     # 标记逻辑未删除值

3.2 拦截器

3.2.1 数据变动记录拦截器

        在数据库应用程序开发中,我们有时需要根据不同的条件查询不同的集合。Mongo-Plus 提供了一个动态集合处理器 CollectionNameHandler,它允许我们在运行时动态地改变 MongoDB 语句中的集合名,这对于处理分表逻辑非常有用。

示例:

实现 CollectionNameHandler 接口,创建一个动态集合处理器,并且注册为Bean。在这个例子中,我们判断,如果查询参数中包含userName参数,并且userName参数值为张三,则将集合名称修改为user_zhangsan

@Component
public class CustomCollectionNameHandler implements CollectionNameHandler {@Overridepublic String dynamicCollectionName(ExecuteMethodEnum executeMethodEnum, Object[] source, MongoNamespace namespace) {if (executeMethodEnum == ExecuteMethodEnum.QUERY){// 具体类型参数转换参考com.anwen.mongo.execute.Execute接口,// 比如查询(executeQuery(Bson, BasicDBObject, BasicDBObject, Class<T>, MongoCollection<Document>)),// 对应的第0个参数类型为BsonBson bson = (Bson) source[0];BsonString userName = bson.toBsonDocument().getString("userName",new BsonString(""));// 如果userName == 张三if (userName.getValue().equals("张三")) {//返回新集合名为:user_zhangsanreturn "user_zhangsan";}}//条件不满足则返回原名称return namespace.getCollectionName();}
}

3.2.2 数据变动记录拦截器

        在数据库操作中,记录数据变动和控制操作的安全性是非常重要的。Mongo-Plus 提供了一个数据变动记录拦截器 DataChangeRecorderInnerInterceptor,它不仅能够自动记录操作日志、添加到数据库,还支持安全阈值控制,例如限制批量更新或插入的数量

@Beanpublic DataChangeRecorderInnerInterceptor dataChangeRecorderInnerInterceptor(BaseMapper baseMapper){DataChangeRecorderInnerInterceptor dataChangeRecorderInnerInterceptor = new DataChangeRecorderInnerInterceptor();// 批量更新条数上限dataChangeRecorderInnerInterceptor.setBatchUpdateLimit(100);// 设置超出阈值提示信息dataChangeRecorderInnerInterceptor.setExceptionMessage("操作条数超出阈值");// 忽略的表dataChangeRecorderInnerInterceptor.setIgnoredColumnList(new ArrayList<>());// 是否显示完整数据,开启后,changedData字段数据量可能会很大dataChangeRecorderInnerInterceptor.setDisplayCompleteData(true);// 开启将记录信息保存到数据库dataChangeRecorderInnerInterceptor.enableSaveDatabase(baseMapper);// 使用主数据源保存信息dataChangeRecorderInnerInterceptor.isMasterDatasource(true);return dataChangeRecorderInnerInterceptor;}

3.3 效果展示

拦截器:


http://www.ppmy.cn/ops/129746.html

相关文章

CTF-PWN: 什么是_IO_FILE?

重要概念:fopen()返回的是一个结构体的指针 _IO_FILE 结构体在什么时候被创建&#xff1f; _IO_FILE 结构体的实例是在程序使用标准 I/O 函数&#xff08;如 fopen、fclose、fread、fwrite 等&#xff09;时创建和管理的。这个结构体实际上是 GNU C Library (glibc) 用于处理…

基于java SSM医药住院管理系统设计和实现

基于java SSM医药住院管理系统设计和实现 &#x1f345; 作者主页 网顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &#x1f4d…

uniapp使用easyinput文本框显示输入的字数和限制的字数

uniapp使用easyinput文本框显示输入的字数和限制的字数 先上效果图&#xff1a; 整体代码如下&#xff1a; <template><view class"nameInfoContent"><uni-easyinput class"uni-mt-5" suffixIcon"checkmarkempty" v-model&quo…

AnaTraf | IT 运维的 “得力助手”:全流量回溯分析系统与网络故障排除之道

AnaTraf 网络性能监控系统NPM | 全流量回溯分析 | 网络故障排除工具AnaTraf网络流量分析仪是一款基于全流量&#xff0c;能够实时监控网络流量和历史流量回溯分析的网络性能监控与诊断系统&#xff08;NPMD&#xff09;。通过对网络各个关键节点的监测&#xff0c;收集网络性能…

Spring Cloud微服务:构建现代应用的新基石

Spring Cloud微服务&#xff1a;构建现代应用的新基石 在当今的数字化时代&#xff0c;微服务架构已成为构建大型、复杂应用系统的主流方式。而在微服务领域&#xff0c;Spring Cloud凭借其强大的功能和灵活的架构&#xff0c;成为了一颗璀璨的明星。本文将深入探讨Spring Cl…

Rust命令行,实现自动反编译Android APK包工具

Rust-CLI实现自动反编译APK Rust提供了比较好的CLI接口,可以快速的编写命令行应用, 用于日常的工具类使用。 分享一个用Rust命令行实现自动反编译Android APK包工具&#xff0c;是之前学习Rust写的一个练手小工具&#xff0c;可以快速反编译APK&#xff0c;同时也学习下用Rust…

《网络是怎样连接的》学习总结-第二章下

目录 2. 第二章 用电信号传输TCP/IP数据——探索协议栈和网卡 2.5 IP与以太网的收发操作 2.5.1 包的基本知识 2.5.2 包收发操作概览 2.5.3 生成包含接收方IP地址的IP头部 2.5.4 生成以太网用的MAC头部 2.5.5 通过ARP查询目标路由器的MAC地址 2.5.6 以太网的基本知识 2…

【计算机网络】单播帧和广播帧在一个局域网内部的传播过程

我们引入这样的一个模型。 路由器可以连接多个网络&#xff0c;在路由器的这一端&#xff0c;我们用交换机集线器连接了很多节点。 这些节点共同组成了一个局域网。 而路由器的另外两个端口又分别连接了其他的网络。MAC地址这个概念是数据链路层才拥有的东西&#xff0c;物理…