Mongodb-Plus 轻松上手

打印 上一主题 下一主题

主题 1014|帖子 1014|积分 3042

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目录
前言
一、集成设置
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以上版本)
  1. <parent>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-parent</artifactId>
  4.     <version>2.6+ 版本</version>
  5.     <relativePath/>
  6. </parent>
复制代码
  1. <dependencies>
  2.     <dependency>
  3.         <groupId>org.springframework.boot</groupId>
  4.         <artifactId>spring-boot-starter</artifactId>
  5.     </dependency>
  6.     <dependency>
  7.         <groupId>org.springframework.boot</groupId>
  8.         <artifactId>spring-boot-starter-test</artifactId>
  9.         <scope>test</scope>
  10.     </dependency>
  11.     <dependency>
  12.         <groupId>com.gitee.anwena</groupId>
  13.         <artifactId>mongo-plus-boot-starter</artifactId>
  14.         <version>2.1.4(当前最新版本)</version>
  15.     </dependency>
  16. </dependencies>
复制代码
  SpringBoot低版本,如2.1、2.2等,需要做一些额外的操作:
  pom文件: SpringBoot控制了MongoDB驱动的版本,所以需要进行排除,然后重新引入
  1. <dependency>
  2.     <groupId>com.gitee.anwena</groupId>
  3.     <artifactId>mongo-plus-boot-starter</artifactId>
  4.     <version>2.1.4</version>
  5.     <exclusions>
  6.         <exclusion>
  7.             <artifactId>bson</artifactId>
  8.             <groupId>org.mongodb</groupId>
  9.         </exclusion>
  10.         <exclusion>
  11.             <artifactId>mongodb-driver-core</artifactId>
  12.             <groupId>org.mongodb</groupId>
  13.         </exclusion>
  14.     </exclusions>
  15. </dependency>
  16. <dependency>
  17.     <groupId>org.mongodb</groupId>
  18.     <artifactId>bson</artifactId>
  19.     <version>4.9.0</version>
  20. </dependency>
  21. <dependency>
  22.     <groupId>org.mongodb</groupId>
  23.     <artifactId>mongodb-driver-core</artifactId>
  24.     <version>4.9.0</version>
  25. </dependency>
复制代码
启动类:
          为了适配MongoTemplate,OverrideMongoConfiguration做了一些设置,但是和低版本的并不兼容,所以只需将OverrideMongoConfiguration排除即可
  1. //排除OverrideMongoConfiguration配置类
  2. @SpringBootApplication(exclude = OverrideMongoConfiguration.class)
  3. // 如报错相关类为:MongoPropertyConfiguration.class,则需要将MongoPropertyConfiguration也一并排除
  4. //@SpringBootApplication(exclude = {OverrideMongoConfiguration.class, MongoPropertyConfiguration.class})
  5. public class MongoPlusDemoApplication {
  6.     public static void main(String[] args) {
  7.         SpringApplication.run(MongoPlusDemoApplication.class, args);
  8.     }
  9. }
复制代码
1.2 设置

在 application.yml 设置文件中添加 MongoPlus 相关设置:
  1. mongo-plus:
  2.   data:
  3.     mongodb:
  4.       host: 127.0.0.1   #ip
  5.       port: 27017   #端口
  6.       database: test    #数据库名
  7.       username: test    #用户名,没有可不填(若账号中出现@,!等等符号,不需要再进行转码!!!)
  8.       password: test    #密码,同上(若密码中出现@,!等等符号,不需要再进行转码!!!)
  9.       authenticationDatabase: admin     #验证数据库
  10.       connectTimeoutMS: 50000   #在超时之前等待连接打开的最长时间(以毫秒为单位)
复制代码

二、编码示例

编写实体类:
  1. package cn.hiii.cloud.module.mongodb.entity;
  2. import com.anwen.mongo.annotation.ID;
  3. import com.anwen.mongo.annotation.collection.CollectionLogic;
  4. import com.anwen.mongo.annotation.collection.CollectionName;
  5. import com.anwen.mongo.enums.IdTypeEnum;
  6. import io.swagger.v3.oas.annotations.media.Schema;
  7. import lombok.AllArgsConstructor;
  8. import lombok.Data;
  9. import lombok.NoArgsConstructor;
  10. import lombok.experimental.Accessors;
  11. import java.io.Serializable;
  12. @Data
  13. @AllArgsConstructor
  14. @NoArgsConstructor
  15. @Accessors(chain = true)
  16. @CollectionName("persons") //标识实体类对应的集合
  17. public class User implements Serializable {
  18.     @ID(type = IdTypeEnum.ASSIGN_ID) //自动生成雪花id
  19.     private String id;
  20.     private String userName;
  21.     private Integer userStatus;
  22.     private Integer age;
  23. }
复制代码
编写Service下的UserService和实现类UserServiceImpl,像MyBatisPlus一样
  1. public interface UserService extends IService<User> {
  2.         
  3. }
复制代码
  1. public class UserServiceImpl extends ServiceImpl<User> implements UserService {
  2.    
  3. }
复制代码

添加测试类,进行功能测试:
  1. @SpringBootTest
  2. public class SampleTest {
  3.     @Autowired
  4.     private UserService userService;
  5.     @Test
  6.     public void testSelect() {
  7.         System.out.println(("----- selectAll method test ------"));
  8.         List<User> userList = userService.list();
  9.         userList.forEach(System.out::println);
  10.     }
  11. }
复制代码
  无实体使用BaseMapper聚集拥有所有方法
  
三、其他设置

3.1 设置文件

3.1.1 日志设置

log:


  • 类型:Boolean
  • 默认值:false
是否开启日志输出,默认false
logOrder:


  • 类型:Integer
  • 默认值:0
用来指定log拦截器,在拦截器链中的order
format:


  • 类型:Boolean
  • 默认值:false
是否开启格式化日志
pretty:


  • 类型: Boolean
  • 默认值: false
是否将打印的命令转为MongoDB可执行的语句
  1. mongo-plus:
  2.   log: true
  3.   format: true
  4.   pretty: true
复制代码

3.1.2 字段设置

camelToUnderline:


  • 类型:Boolean
  • 默认值:false
是否开启驼峰转下划线
ignoringNull:


  • 类型:Boolean
  • 默认值:true
是否忽略null属性
  1. mongo-plus:
  2.   configuration:
  3.     field:
  4.       camelToUnderline: true
  5.       ignoringNull: false
复制代码

3.1.3 小黑子模式

  1. mongo-plus:
  2.   configuration:
  3.     ikun: true
  4.     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
标志为全局逻辑未删除
  1. mongo-plus:
  2.   configuration:
  3.     logic:
  4.       open: true                    # 开启逻辑删除功能
  5.       auto-fill: true               # 开启拦截器自动填充逻辑删除字段,开启逻辑删除功能前提下生效
  6.       logic-delete-field: logicDel  # 全局逻辑删除字段(string 类型)
  7.       logic-delete-value: 1         # 标记逻辑删除值
  8.       logic-not-delete-value: 0     # 标记逻辑未删除值
复制代码

3.2 拦截器

3.2.1 数据变动记录拦截器

        在数据库应用程序开发中,我们偶尔需要根据不同的条件查询不同的聚集。Mongo-Plus 提供了一个动态聚集处理惩罚器 CollectionNameHandler,它允许我们在运行时动态地改变 MongoDB 语句中的聚集名,这对于处理惩罚分表逻辑非常有用。
示例:
实现 CollectionNameHandler 接口,创建一个动态聚集处理惩罚器,并且注册为Bean。在这个例子中,我们判断,假如查询参数中包含userName参数,并且userName参数值为张三,则将聚集名称修改为user_zhangsan。
  1. @Component
  2. public class CustomCollectionNameHandler implements CollectionNameHandler {
  3.     @Override
  4.     public String dynamicCollectionName(ExecuteMethodEnum executeMethodEnum, Object[] source, MongoNamespace namespace) {
  5.         if (executeMethodEnum == ExecuteMethodEnum.QUERY){
  6.             // 具体类型参数转换参考com.anwen.mongo.execute.Execute接口,
  7.             // 比如查询(executeQuery(Bson, BasicDBObject, BasicDBObject, Class<T>, MongoCollection<Document>)),
  8.             // 对应的第0个参数类型为Bson
  9.             Bson bson = (Bson) source[0];
  10.             BsonString userName = bson.toBsonDocument().getString("userName",new BsonString(""));
  11.             // 如果userName == 张三
  12.             if (userName.getValue().equals("张三")) {
  13.                 //返回新集合名为:user_zhangsan
  14.                 return "user_zhangsan";
  15.             }
  16.         }
  17.         //条件不满足则返回原名称
  18.         return namespace.getCollectionName();
  19.     }
  20. }
复制代码

3.2.2 数据变动记录拦截器

        在数据库操作中,记录数据变动和控制操作的安全性是非常紧张的。Mongo-Plus 提供了一个数据变动记录拦截器 DataChangeRecorderInnerInterceptor,它不仅可以或许自动记录操作日志、添加到数据库,还支持安全阈值控制,比方限定批量更新或插入的数量
  1. @Bean
  2.     public DataChangeRecorderInnerInterceptor dataChangeRecorderInnerInterceptor(BaseMapper baseMapper){
  3.         DataChangeRecorderInnerInterceptor dataChangeRecorderInnerInterceptor = new DataChangeRecorderInnerInterceptor();
  4.         // 批量更新条数上限
  5.         dataChangeRecorderInnerInterceptor.setBatchUpdateLimit(100);
  6.         // 设置超出阈值提示信息
  7.         dataChangeRecorderInnerInterceptor.setExceptionMessage("操作条数超出阈值");
  8.         // 忽略的表
  9.         dataChangeRecorderInnerInterceptor.setIgnoredColumnList(new ArrayList<>());
  10.         // 是否显示完整数据,开启后,changedData字段数据量可能会很大
  11.         dataChangeRecorderInnerInterceptor.setDisplayCompleteData(true);
  12.         // 开启将记录信息保存到数据库
  13.         dataChangeRecorderInnerInterceptor.enableSaveDatabase(baseMapper);
  14.         // 使用主数据源保存信息
  15.         dataChangeRecorderInnerInterceptor.isMasterDatasource(true);
  16.         return dataChangeRecorderInnerInterceptor;
  17.     }
复制代码

3.3 效果展示



拦截器:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天津储鑫盛钢材现货供应商

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表