说明
最近工作接触到的项目用到了 MongoDB;之前没有学习过;这次一边用一边学习;将配置流程以及一些基础的用法总结下来。若以后深入学习再进行更新。
1. MongoDB的配置
1.1 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
1.2 配置
spring.data.mongodb.database =
spring.data.mongodb.host =
spring.data.mongodb.password =
spring.data.mongodb.port =
spring.data.mongodb.username =
2. 基本使用
2.1 Bean层
@Document:表示该类交给MongoDB 维护该表
@Id:用在列明上;表示由MongoDB自动生成主键;效率会比自己设置的更高;不过考虑到业务需求使用;自己要另外设置一个业务Id。
@Field:代表一个字段,可以不加,不加的话默认以参数名为列名。例如类名中字段命名为 “Name”,在数据库中映射成“name”。
@Indexed:声明该字段需要加索引,加索引后以该字段为条件检索速度会提高。
@Document(collection = "xxx")
public class xxx {
@Id
private String id;
@Field("name")
private String Name;
1.2.2 Dao层
在持久层;写一些数据库操作相关的方法。在这里我们使用原生的MongoTemplate。
@Autowired
protected MongoTemplate mongoTemplate;
该模板类中提供了很多方法(如下图):
可以根据自己的实际需求封装或直接注入使用。
BaseDao 模板
/**
* 封装公共数据库操作方法
*
* @author
* @since
*/
@Slf4j
public class BaseDao<T> {
protected Class<T> entityClass;
protected String idKey;
public BaseDao() {
//获取Class
Type type = getClass().getGenericSuperclass();
Type trueType = ((ParameterizedType) type).getActualTypeArguments()[0];
this.entityClass = (Class<T>) trueType;
//获取ID字段
Field[] fields = entityClass.getDeclaredFields();
for (Field field : fields) {
Annotation annotation = field.getAnnotation(Id.class);
if (annotation != null) {
idKey = field.getName();
break;
}
}
if (StringUtils.isEmpty(idKey)) {
idKey = "_id";
}
}
@Autowired
protected MongoTemplate mongoTemplate;
public void save(T obj) {
mongoTemplate.save(obj);
}
// public void save(Collection<T> objs) {
// mongoTemplate.insert(objs);
// }
public T getById(Object id) {
return mongoTemplate.findById(id, entityClass);
}
public List<T> getByIds(Collection<?> ids) {
Query query = new Query();
query.addCriteria(Criteria.where(idKey).in(ids));
return mongoTemplate.find(query, entityClass);
}
public List<T> findByField(String field, Object value) {
if (StringUtils.isEmpty(field) || value == null) {
return Collections.emptyList();
}
Query query = new Query();
query.addCriteria(Criteria.where(field).is(value));
return mongoTemplate.find(query, entityClass);
}
public T findOneByField(String field, Object value) {
if (StringUtils.isEmpty(field) || value == null) {
return null;
}
Query query = new Query();
query.addCriteria(Criteria.where(field).is(value));
return mongoTemplate.findOne(query, entityClass);
}
public void updateById(String id, String field, Object value) {
Query query = new Query();
query.addCriteria(Criteria.where(idKey).is(id));
Update update = new Update();
update.set(field, value);
log.info(query.toString());
mongoTemplate.updateFirst(query, update, entityClass);
}
public void updateMultiFieldById(String id, Map<String, Object> fieldValues) {
Query query = new Query();
query.addCriteria(Criteria.where(idKey).is(id));
Update update = new Update();
for (Map.Entry<String, Object> entry : fieldValues.entrySet()) {
update.set(entry.getKey(), entry.getValue());
}
log.info(query.toString());
mongoTemplate.updateFirst(query, update, entityClass);
}
public void deleteById(String id) {
if (StringUtils.isEmpty(id)) {
return;
}
Query query = new Query();
query.addCriteria(Criteria.where(idKey).is(id));
mongoTemplate.remove(query, entityClass);
}
public PageResultInfo<T> getPageResult(Integer pageNum, Integer pageSize) {
return getPageResult(new Query(), pageNum, pageSize);
}
public PageResultInfo<T> getPageResult(Query query, Integer pageNum, Integer pageSize) {
if (query == null) {
query = new Query();
}
Long count = mongoTemplate.count(query, entityClass);
query.skip(pageNum * pageSize);
query.limit(pageSize);
List<T> items = mongoTemplate.find(query, entityClass);
return new PageResultInfo<T>(count, pageNum, pageSize, items);
}
public List<T> findAll() {
return mongoTemplate.findAll(entityClass);
}
}