当前位置: 首页 > article >正文

Mongodb-Plus 轻松上手

目录

前言

一、集成配置

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   #ip
      port: 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) //自动生成雪花id
    private 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 {

    @Autowired
    private UserService userService;

    @Test
    public 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: true
  format: true
  pretty: true

3.1.2 字段配置

camelToUnderline:

  • 类型:Boolean
  • 默认值:false

是否开启驼峰转下划线

ignoringNull:

  • 类型:Boolean
  • 默认值:true

是否忽略null属性

mongo-plus:
  configuration:
    field:
      camelToUnderline: true
      ignoringNull: false

3.1.3 小黑子模式

mongo-plus:
  configuration:
    ikun: true
    banner: 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 {
    @Override
    public 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个参数类型为Bson
            Bson bson = (Bson) source[0];
            BsonString userName = bson.toBsonDocument().getString("userName",new BsonString(""));
            // 如果userName == 张三
            if (userName.getValue().equals("张三")) {
                //返回新集合名为:user_zhangsan
                return "user_zhangsan";
            }
        }
        //条件不满足则返回原名称
        return namespace.getCollectionName();
    }
}

3.2.2 数据变动记录拦截器

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

@Bean
    public 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.kler.cn/a/372495.html

相关文章:

  • uniapp Native.js原生arr插件服务发送广播到uniapp页面中
  • 使用idea创建JDK8的SpringBoot项目
  • 第十四章 C++ 数字
  • 算法day_3数组中的单一元素和二进制位颠倒
  • 某集团GIF动态验证码识别
  • 24.12.23 注解
  • LSTM:解决梯度消失与长期依赖问题
  • 凌雄科技打造DaaS模式,IT设备产业链由内而外嬗变升级
  • Spring Cloud --- 引入Seata分布式事务
  • 【Java并发编程】线程池详解
  • Codeforces Round 966 (Div. 3)
  • react 框架应用+总结+参考
  • 鸿蒙网络编程系列40-TLS数字证书查看及验签示例
  • 鸿蒙生态崛起,开发者如何抓住机遇应对挑战?
  • 常见的jar包报错以及解决办法
  • 大数据分析与应用
  • QT SSDP 局域网检测支持扫描通信
  • 锂电池无线充电
  • 精准帮扶:SpringBoot扶贫管理系统
  • 如何编写一个高效的Java工具类
  • kafka消费者组分区分配实战
  • 香港金融科技赋能智能交易:全球投资新趋势
  • Docker可视化工具 Portainer 安装及配置
  • Chromium HTML5 新的 Input 类型week对应c++
  • vue自定义组件实现v-model双向数据绑定
  • 如何学习人工智能?