整合代码教程
pom文件里添加mongodb依赖
<!-- mongodb -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
application.yml配置文件 添加mongodb 配置
写法一:
spring:
data:
mongodb:
host: 127.0.0.1
username: process
password: 123456
port: 27017
database: tarzan
写法二:
data:
mongodb:
database:tarzan
uri: mongodb://process:123456@127.0.0.1:27017
推荐使用第二种写法,因为第一种必须给每个mongodb的数据库设置用户密码,第二种,只需要给服务器的mongo设置用户密码,所有的数据库都可通用
mongodb操作工具类
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.poi.ss.formula.functions.T;
import org.bson.Document;
import org.springblade.core.tool.utils.SpringUtil;
import org.springblade.core.tool.utils.StringUtil;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.mongodb.core.CollectionOptions;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.*;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import com.alibaba.fastjson.JSONObject;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
/**
* Mongo db工具类
*
* @author tarzan
* @version 1.0
* @company 北斗天地股份有限公司
* @copyright (c) 2020 Niubility Tiger Co.LTD.All rights reserved.
* @date 2022年03月08日 10:44:18
* @since JDK1.8
*/
@Lazy
@Component
public class MongoUtil {
/** 无条件查询 */
public static final Query EMPTY_QUERY = new BasicQuery("{}");
public static MongoTemplate template;
static {
MongoUtil.template = SpringUtil.getBean(MongoTemplate.class);
}
/**
* 方法描述: query-by-id
*
* @param id
* @Return {@link Query}
* @throws
* @author tarzan
* @date 2022年03月08日 11:20:20
*/
private static Query idQuery(String id) {
Criteria criteria = Criteria.where("id").is(id);
return Query.query(criteria);
}
/**
* 方法描述: multi-key-eq-val-query
*
* @param data
* @Return {@link Query}
* @throws
* @author tarzan
* @date 2022年03月08日 11:20:45
*/
public static Query eqQuery(Map<String, Object> data) {
if (CollectionUtils.isEmpty(data)) {
return EMPTY_QUERY;
}
Criteria criteria = new Criteria();
for (Map.Entry<String, Object> entry : data.entrySet()) {
criteria.and(entry.getKey()).is(entry.getValue());
}
return Query.query(criteria);
}
/**
* 方法描述: single-key-eq-val-query
*
* @param field
* @param val
* @Return {@link Query}
* @throws
* @author tarzan
* @date 2022年03月08日 11:21:13
*/
public static Query eqQuery(String field, Object val) {
assert !StringUtils.isEmpty(field);
Criteria criteria = Criteria.where(field).is(val);
return Query.query(criteria);
}
/**
* 方法描述: collection-name exists
*
* @param collectionName
* @Return {@link boolean}
* @throws
* @author tarzan
* @date 2022年03月08日 11:22:00
*/
public static boolean collectionExists(String collectionName) {
return template.collectionExists(collectionName);
}
/**
* 方法描述: clazz exists
*
* @param clazz
* @throws
* @Return {@link boolean}
* @author tarzan
* @date 2019年12月05日 16:29:34
*/
public static boolean collectionExists(Class<?> clazz) {
return template.collectionExists(clazz);
}
/**
* 方法描述: find by id
*
* @param id
* @param clazz
* @Return {@link K}
* @throws
* @author tarzan
* @date 2022年03月08日 11:24:28
*/
public static <K> K findById(String id, Class<K> clazz) {
return template.findOne(idQuery(id), clazz);
}
/**
* 方法描述: get mongo collection by tableName
*
* @param tableName
* @Return {@link MongoCollection< Document>}
* @throws
* @author tarzan
* @date 2022年03月08日 11:25:17
*/
public static MongoCollection<Document> getCollection(String tableName) {
assert !StringUtils.isEmpty(tableName);
return template.getCollection(tableName);
}
/**
* 方法描述: create mongo collection by tableName
*
* @param tableName
* @Return {@link MongoCollection< Document>}
* @throws
* @author tarzan
* @date 2022年03月08日 11:25:32
*/
public static MongoCollection<Document> createCollection(String tableName) {
assert !StringUtils.isEmpty(tableName);
if (collectionExists(tableName)) {
return getCollection(tableName);
}
return template.createCollection(tableName);
}
/**
* 方法描述: create mongo collection by tableName and collection-options
*
* @param tableName
* @param options
* @Return
* @throws
* @author tarzan
* @date 2022年03月08日 11:27:20
*/
public static void createCollection(String tableName, CollectionOptions options) {
assert !StringUtils.isEmpty(tableName);
if (collectionExists(tableName)) {
return;
}
template.createCollection(tableName, options);
}
/**
* 方法描述: create mongo collection by clazz
*
* @param clazz
* @Return
* @throws
* @author tarzan
* @date 2022年03月08日 11:29:03
*/
public static void createCollection(Class<?> clazz) {
assert clazz != null;
if (collectionExists(clazz)) {
return;
}
template.createCollection(clazz);
}
/**
* 方法描述: drop collection
*
* @param tableName
* @Return
* @throws
* @author tarzan
* @date 2022年03月08日 11:29:18
*/
public static void dropCollection(String tableName) {
assert !StringUtils.isEmpty(tableName);
template.dropCollection(tableName);
}
/**
* 方法描述: insert
*
* @param t
* @Return
* @throws
* @author tarzan
* @date 2022年03月08日 11:29:28
*/
public static void insert(Object t) {
assert t != null;
template.insert(t);
}
/**
* 方法描述: batch insert in specified table
*
* @param coll
* @param tableName
* @Return
* @throws
* @author tarzan
* @date 2022年03月08日 11:29:41
*/
public static <K> void insertBatch(Collection<K> coll, String tableName) {
assert !StringUtils.isEmpty(tableName) && !CollectionUtils.isEmpty(coll);
template.insert(coll, tableName);
}
/**
* 方法描述: batch insert (support multi tables)
*
* @param coll
* @Return {@link boolean}
* @throws
* @author tarzan
* @date 2022年03月08日 11:30:34
*/
public static <K> boolean insertAll(Collection<K> coll) {
assert !CollectionUtils.isEmpty(coll);
template.insertAll(coll);
return true;
}
/**
* 方法描述: insert or update
*
* @param t
* @Return
* @throws
* @author tarzan
* @date 2022年03月08日 11:31:03
*/
public static <K> void save(K t) {
assert t != null;
template.save(t);
}
/**
* 方法描述: update first
*
* @param t
* @param collectionName
* @Return
* @throws
* @author tarzan
* @date 2022年03月08日 11:31:40
*/
public static <K> void save(K t, String collectionName) {
assert t != null && !StringUtils.isEmpty(collectionName);
template.save(t, collectionName);
}
/**
* 方法描述: update first
*
* @param query
* @param update
* @param tableName
* @Return {@link boolean}
* @throws
* @author tarzan
* @date 2022年03月08日 11:31:50
*/
public static boolean updateFirst(Query query, Update update, String tableName) {
assert update != null && !StringUtil.isEmpty(tableName);
UpdateResult wr = template.updateFirst(query, update, tableName);
return wr.getModifiedCount() == 1;
}
/**
* 方法描述: update by id
*
* @param id
* @param obj
* @param clazz
* @Return {@link boolean}
* @throws
* @author tarzan
* @date 2022年03月08日 11:32:03
*/
public static <K> boolean updateById(String id, JSONObject obj, Class<?> clazz) {
DBObject update = new BasicDBObject();
obj.put("update_time", new Date());
update.put("$set", obj);
UpdateResult result = template.updateFirst(idQuery(id), new BasicUpdate(update.toString()), clazz);
return result.getModifiedCount() == 1;
}
/**
* 方法描述: auto-inc specified filed by id
*
* @param id
* @param field
* @param type
* @Return
* @throws
* @author tarzan
* @date 2022年03月08日 11:32:22
*/
public static <K> void updateIncById(String id, String field, Class<K> type) {
Query query = idQuery(id);
Update inc = new Update().inc(field, 1);
template.updateFirst(query, inc, type);
}
/**
* 方法描述: auto-inc specified field by id
*
* @param id
* @param field
* @param collectionName
* @Return
* @throws
* @author tarzan
* @date 2022年03月08日 11:32:47
*/
public static void updateIncById(String id, String field, String collectionName) {
Query query = idQuery(id);
Update inc = new Update().inc(field, 1);
template.updateFirst(query, inc, collectionName);
}
/**
* 方法描述: auto-inc specified field specified step by id
*
* @param id
* @param field
* @param step
* @param type
* @Return
* @throws
* @author tarzan
* @date 2022年03月08日 11:33:10
*/
public static <K> void updateIncById(String id, String field, Integer step, Class<K> type) {
if (step == 0) {
return;
}
Query query = idQuery(id);
Update inc = new Update().inc(field, step);
template.updateFirst(query, inc, type);
}
/**
* 方法描述: auto-inc specified field specified step by id
*
* @param id
* @param field
* @param num
* @param collectionName
* @Return
* @throws
* @author tarzan
* @date 2022年03月08日 11:33:10
*/
public static void updateIncById(String id, String field, Integer num, String collectionName) {
if (num == 0) {
return;
}
Query query = idQuery(id);
Update inc = new Update().inc(field, num);
template.updateFirst(query, inc, collectionName);
}
/**
* 方法描述: multi update in specified table
*
* @param query
* @param update
* @param tableName
* @Return
* @throws
* @author tarzan
* @date 2022年03月08日 11:34:20
*/
public static void updateMulti(Query query, Update update, String tableName) {
template.updateMulti(query, update, tableName);
}
/**
* 方法描述: 条件统计
*
* @param query
* @param collectionName
* @throws
* @Return {@link long}
* @author tarzan
* @date 2019年12月05日 16:16:19
*/
public static long count(Query query, String collectionName) {
return template.count(query, collectionName);
}
/**
* 方法描述: search
*
* @param query
* @param clazz
* @Return {@link List<K>}
* @throws
* @author tarzan
* @date 2022年03月08日 11:34:52
*/
public static <K> List<K> find(Query query, Class<K> clazz) {
return template.find(query, clazz);
}
/**
* 方法描述: delete by id
*
* @param id
* @param collectionName
* @Return {@link boolean}
* @throws
* @author tarzan
* @date 2022年03月08日 11:35:05
*/
public static boolean deleteById(String id, String collectionName) {
DeleteResult result = template.remove(idQuery(id), collectionName);
return result.getDeletedCount() == 1;
}
/**
* 方法描述: delete by id
*
* @param id
* @param clazz
* @Return
* @throws
* @author tarzan
* @date 2022年03月08日 11:35:17
*/
public static void deleteById(String id, Class<?> clazz) {
template.remove(idQuery(id), clazz);
}
/**
* 方法描述: batch delete
*
* @param query
* @param collectionName
* @Return
* @throws
* @author tarzan
* @date 2022年03月08日 11:35:29
*/
public static void deleteBatch(Query query, String collectionName) {
template.remove(query, collectionName);
}
/**
* 方法描述: count
*
* @param query
* @param clazz
* @Return {@link long}
* @throws
* @author tarzan
* @date 2022年03月08日 11:34:41
*/
public static long count(Query query, Class<T> clazz) {
return template.count(query, clazz);
}
/**
* 方法描述: count by id ( determinte the record exists )
*
* @param id
* @param collectionName
* @Return {@link long}
* @throws
* @author tarzan
* @date 2022年03月08日 11:35:40
*/
public static long countById(String id, String collectionName) {
if (StringUtils.isEmpty(id) || StringUtils.isEmpty(collectionName)) {
return 0L;
}
return template.count(idQuery(id), collectionName);
}
public static void resolve(T t) {
}
}
分页实现代码demo
@Override
public Page<UnifyDownholeDrill> getPage(int current,int size) {
Query mongoQuery = new Query();
long count = mongoTemplate.count(mongoQuery, UnifyDownholeDrill.class);
Pageable pageable = PageRequest.of((current - 1) * size, size);
List<UnifyDownholeDrill> pageList = mongoTemplate.find(mongoQuery.with(pageable), UnifyDownholeDrill.class);
Page<UnifyDownholeDrill> page = new PageImpl<UnifyDownholeDrill>(pageList, pageable, count);
return page;
}
MongoDB 保存数据出现_class 如何去掉
添加mongodb配置转换类
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.core.convert.*;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
/**
* @author tarzan
*/
@Configuration
public class MongoConfig {
@Bean
public MappingMongoConverter mappingMongoConverter(MongoDatabaseFactory factory, MongoMappingContext context, BeanFactory beanFactory) {
DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);
MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context);
try {
mappingConverter.setCustomConversions(beanFactory.getBean(CustomConversions.class));
}
catch (NoSuchBeanDefinitionException ignore) {}
// Don't save _class to mongo
mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null));
return mappingConverter;
}
}
相关知识点
MongoDB
MongoDB是一种开源的、面向文档的NoSQL数据库管理系统,它使用了由键值对组成的BSON(Binary JSON)格式来存储数据。MongoDB以其灵活性、可伸缩性和容错特性而闻名于世。
1. 数据模型: MongoDB采用文档数据库模型,即将数据存储在一个称为文档的结构化记录中。文档可以是JSON、BSON等格式,不需要遵循固定的模式,这使得MongoDB非常适合处理半结构化和多变的数据。文档的字段可以包含子文档、数组和其他复杂类型。
2. 查询语言和索引: MongoDB提供了强大的查询语言,支持各种操作符和函数,可以进行复杂的查询和聚合操作。同时,MongoDB内置了多种类型的索引(例如B树索引、地理空间索引等),以加快查询速度并优化性能。
3. 可扩展性和分布式架构: MongoDB具有良好的可扩展性,可以轻松地通过添加更多的节点来实现集群化,并自动分布数据到各个节点上。通过在多个节点上进行数据复制,还可以提高系统的可靠性和容错性。
4. 高性能: MongoDB支持以写入驱动和读取驱动的方式进行数据访问,可以根据应用程序的需求选择合适的读写策略。在写入方面,MongoDB支持快速的批量写操作,可以将大量的文档一次性插入或更新到数据库中。在读取方面,MongoDB的查询引擎使用了各种优化技术(如索引和查询计划优化),以提供高效的查询性能。
5. 安全性: MongoDB提供了多种安全机制来保护数据库的数据和访问权限。可以通过身份验证、访问控制、加密传输等方式来确保数据的机密性和完整性。此外,MongoDB还支持审计功能,记录所有与数据库相关的操作和事件。
6. 社区和生态系统: MongoDB拥有一个活跃的开源社区,提供了丰富的工具和第三方库,以及大量的文档和教程。这使得开发人员能够更轻松地学¥和使用MongoDB,并解决遇到的问题。
总结起来,MongoDB是一款适用于处理半结构化和多变的数据的强大数据库管理系统。它具有灵活性、可伸缩性、强大的查询语言和索引、高性能、安全性以及活跃的社区支持等特点,广泛应用于Web应用程序、大数据分析、实时分析等场景中。
spring-boot-starter-data-mongodb
spring-boot-starter-data-mongodb
是Spring Boot提供的用于集成MongoDB数据库的起步依赖。它简化了在Spring Boot应用程序中使用MongoDB的配置和操作,提供了一系列预配置的类和方法,使得开发人员可以更轻松地进行MongoDB的数据访问和操作。以下是关于spring-boot-starter-data-mongodb
的详细解释:
- 配置简化:
spring-boot-starter-data-mongodb
通过自动配置功能,减少了手动配置的工作量。只需在application.properties或application.yml文件中添加相应的配置属性,即可完成与MongoDB的连接。 - MongoDB模板(MongoTemplate):该起步依赖提供了MongoTemplate类,用于执行各种MongoDB操作,如插入文档、更新文档、查询文档等。MongoTemplate封装了MongoDB原生驱动的操作,使得操作更加简洁和方便。
- Repository支持:
spring-boot-starter-data-mongodb
还集成了Spring Data MongoDB,可以通过接口方式定义Repository,并自动生成对应的实现类。这样,开发人员只需编写Repository接口,无需编写实现逻辑即可完成基本的CRUD操作。 - 实体映射:支持使用注解将Java实体类映射到MongoDB中的文档(Document),简化了实体与文档之间的转换和操作过程。
- 插件扩展:
spring-boot-starter-data-mongodb
为MongoDB提供了丰富的插件扩展机制,可以根据需要添加和使用各种插件,如查询注解、聚合操作等。 - 数据验证和转换:该起步依赖支持数据验证和转换功能,可以通过注解方式定义字段级别的验证规则,并提供了一系列内置的数据转换器,用于在文档和实体之间进行数据转换。
总结:
spring-boot-starter-data-mongodb
是Spring Boot提供的用于集成MongoDB数据库的起步依赖。它使得在Spring Boot应用程序中使用MongoDB变得更加简单和高效,提供了预配置的类和方法,简化了MongoDB的数据访问和操作。通过学习和掌握spring-boot-starter-data-mongodb
的特性和用法,开发人员可以更好地利用Spring Boot和MongoDB构建强大的应用程序。然而,深入理解和熟练应用spring-boot-starter-data-mongodb
还需要进一步的学习和实践,请根据实际需求和情况不断探索和扩展您对其的认识和应用能力。