Mongodb-Plus 轻松上手_mongoplus
目录
前言
一、集成配置
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以上版本)
org.springframework.boot spring-boot-starter-parent 2.6+ 版本
org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-test test com.gitee.anwena mongo-plus-boot-starter 2.1.4(当前最新版本)
SpringBoot低版本,如2.1、2.2等,需要做一些额外的操作:
pom文件: SpringBoot控制了MongoDB驱动的版本,所以需要进行排除,然后重新引入
com.gitee.anwena mongo-plus-boot-starter 2.1.4 bson org.mongodb mongodb-driver-core org.mongodb org.mongodb bson 4.9.0 org.mongodb mongodb-driver-core 4.9.0
启动类:
为了适配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 { }
public class UserServiceImpl extends ServiceImpl implements UserService { }
添加测试类,进行功能测试:
@SpringBootTestpublic class SampleTest { @Autowired private UserService userService; @Test public void testSelect() { System.out.println((\"----- selectAll method test ------\")); List userList = userService.list(); userList.forEach(System.out::println); }}
无实体使用BaseMapper集合拥有所有方法
三、其他配置
3.1 配置文件
3.1.1 日志配置
log:
是否开启日志输出,默认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
。
@Componentpublic 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, MongoCollection)), // 对应的第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 效果展示
拦截器: