引言
springboot2.x已經集成了Mongodb了物舒,我們可以很方便的使用mongoTemplate獲取MongoDB中的數(shù)據(jù),但有時候光是MongoTemplate還不夠便捷贞言,我們完全可以根據(jù)需要做一些簡單的接口來簡化日常開發(fā)操作
引入jar
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
配置自定義的template
package com.wcf.mongo.config;
import com.mongodb.MongoClient;
import org.springframework.context.annotation.*;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
/**
* @author wangcanfeng
* @description 配置mongoDB的屬性
* @Date Created in 11:13-2019/3/19
*/
@Configuration
public class WcfMongoAutoConfiguration {
/**
* 功能描述: 根據(jù)自己創(chuàng)建的工廠初始化一個template
*
* @param
* @return:org.springframework.data.mongodb.core.MongoTemplate
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/21 14:23
*/
@Bean
@Primary
public MongoTemplate template() {
return new MongoTemplate(factory());
}
/**
* 功能描述: 創(chuàng)建數(shù)據(jù)庫名稱對應的工廠,數(shù)據(jù)庫名稱可以通過配置文件導入
*
* @param
* @return:org.springframework.data.mongodb.MongoDbFactory
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/21 14:22
*/
@Bean("mongoDbFactory")
public MongoDbFactory factory() {
return new SimpleMongoDbFactory(client(), "test");
}
/**
* 功能描述: 配置client阀蒂,client中傳入的ip和端口可以通過配置文件讀入
*
* @param
* @return:com.mongodb.MongoClient
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/21 14:23
*/
@Bean("mongoClient")
public MongoClient client() {
return new MongoClient("10.19.131.65", 7000);
}
}
設置基礎的做一些簡單的業(yè)務過渡接口
package com.wcf.mongo.service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.mongodb.client.ListIndexesIterable;
import com.mongodb.client.model.IndexOptions;
import com.mongodb.client.model.Indexes;
import com.wcf.mongo.entity.MongoBaseInfo;
import org.bson.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @author wangcanfeng
* @description 簡單的mongodb使用接口
* @Date Created in 17:24-2019/3/20
*/
@Service
public class SimpleMongoServiceImpl<T extends MongoBaseInfo> implements SimpleMongoService<T> {
/**
* 注入template该窗,減少重復代碼
*/
@Autowired
private MongoTemplate mongoTemplate;
/**
* 功能描述: 創(chuàng)建一個集合
* 同一個集合中可以存入多個不同類型的對象,我們?yōu)榱朔奖憔S護和提升性能脂新,
* 后續(xù)將限制一個集合中存入的對象類型挪捕,即一個集合只能存放一個類型的數(shù)據(jù)
*
* @param name 集合名稱,相當于傳統(tǒng)數(shù)據(jù)庫的表名
* @return:void
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/20 17:27
*/
@Override
public void createCollection(String name) {
mongoTemplate.createCollection(name);
}
/**
* 功能描述: 創(chuàng)建索引
* 索引是順序排列争便,且唯一的索引
*
* @param collectionName 集合名稱级零,相當于關系型數(shù)據(jù)庫中的表名
* @param filedName 對象中的某個屬性名
* @return:java.lang.String
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/20 16:13
*/
@Override
public String createIndex(String collectionName, String filedName) {
//配置索引選項
IndexOptions options = new IndexOptions();
// 設置為唯一
options.unique(true);
//創(chuàng)建按filedName升序排的索引
return mongoTemplate.getCollection(collectionName).createIndex(Indexes.ascending(filedName), options);
}
/**
* 功能描述: 獲取當前集合對應的所有索引的名稱
*
* @param collectionName
* @return:java.util.List<java.lang.String>
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/20 16:46
*/
@Override
public List<String> getAllIndexes(String collectionName) {
ListIndexesIterable<Document> list = mongoTemplate.getCollection(collectionName).listIndexes();
//上面的list不能直接獲取size,因此初始化arrayList就不設置初始化大小了
List<String> indexes = new ArrayList<>();
for (Document document : list) {
document.entrySet().forEach((key) -> {
//提取出索引的名稱
if (key.getKey().equals("name")) {
indexes.add(key.getValue().toString());
}
});
}
return indexes;
}
/**
* 功能描述: 往對應的集合中插入一條數(shù)據(jù)
*
* @param info 存儲對象
* @param collectionName 集合名稱
* @return:void
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/20 16:46
*/
@Override
public void insert(T info, String collectionName) {
mongoTemplate.insert(info, collectionName);
}
/**
* 功能描述: 往對應的集合中批量插入數(shù)據(jù)滞乙,注意批量的數(shù)據(jù)中不要包含重復的id
*
* @param infos 對象列表
* @return:void
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/20 16:47
*/
@Override
public void insertMulti(List<T> infos, String collectionName) {
mongoTemplate.insert(infos, collectionName);
}
/**
* 功能描述: 使用索引信息精確更改某條數(shù)據(jù)
*
* @param id 唯一鍵
* @param collectionName 集合名稱
* @param info 待更新的內容
* @return:void
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/20 18:42
*/
@Override
public void updateById(String id, String collectionName, T info) {
Query query = new Query(Criteria.where("id").is(id));
Update update = new Update();
String str = JSON.toJSONString(info);
JSONObject jQuery = JSON.parseObject(str);
jQuery.forEach((key, value) -> {
//因為id相當于傳統(tǒng)數(shù)據(jù)庫中的主鍵奏纪,這里使用時就不支持更新,所以需要剔除掉
if (!key.equals("id")) {
update.set(key, value);
}
});
mongoTemplate.updateMulti(query, update, info.getClass(), collectionName);
}
/**
* 功能描述: 根據(jù)id刪除集合中的內容
*
* @param id 序列id
* @param collectionName 集合名稱
* @param clazz 集合中對象的類型
* @return:void
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/20 16:47
*/
@Override
public void deleteById(String id, Class<T> clazz, String collectionName) {
// 設置查詢條件斩启,當id=#{id}
Query query = new Query(Criteria.where("id").is(id));
// mongodb在刪除對象的時候會判斷對象類型序调,如果你不傳入對象類型,只傳入了集合名稱兔簇,它是找不到的
// 上面我們?yōu)榱朔奖愎芾砗吞嵘罄m(xù)處理的性能发绢,將一個集合限制了一個對象類型,所以需要自行管理一下對象類型
// 在接口傳入時需要同時傳入對象類型
mongoTemplate.remove(query, clazz, collectionName);
}
/**
* 功能描述: 根據(jù)id查詢信息
*
* @param id 注解
* @param clazz 類型
* @param collectionName 集合名稱
* @return:java.util.List<T>
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/20 16:47
*/
@Override
public T selectById(String id, Class<T> clazz, String collectionName) {
// 查詢對象的時候垄琐,不僅需要傳入id這個唯一鍵边酒,還需要傳入對象的類型,以及集合的名稱
return mongoTemplate.findById(id, clazz, collectionName);
}
/**
* 功能描述: 查詢列表信息
* 將集合中符合對象類型的數(shù)據(jù)全部查詢出來
*
* @param collectName 集合名稱
* @param clazz 類型
* @return:java.util.List<T>
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/21 10:38
*/
@Override
public List<T> selectList(String collectName, Class<T> clazz) {
return selectList(collectName, clazz, null, null);
}
/**
* 功能描述: 分頁查詢列表信息
*
* @param collectName 集合名稱
* @param clazz 對象類型
* @param currentPage 當前頁碼
* @param pageSize 分頁大小
* @return:java.util.List<T>
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/21 10:38
*/
@Override
public List<T> selectList(String collectName, Class<T> clazz, Integer currentPage, Integer pageSize) {
//設置分頁參數(shù)
Query query = new Query();
//設置分頁信息
if (!ObjectUtils.isEmpty(currentPage) && ObjectUtils.isEmpty(pageSize)) {
query.limit(pageSize);
query.skip(pageSize * (currentPage - 1));
}
return mongoTemplate.find(query, clazz, collectName);
}
/**
* 功能描述: 根據(jù)條件查詢集合
*
* @param collectName 集合名稱
* @param conditions 查詢條件狸窘,目前查詢條件處理的比較簡單墩朦,僅僅做了相等匹配,沒有做模糊查詢等復雜匹配
* @param clazz 對象類型
* @param currentPage 當前頁碼
* @param pageSize 分頁大小
* @return:java.util.List<T>
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/21 10:48
*/
@Override
public List<T> selectByCondition(String collectName, Map<String, String> conditions, Class<T> clazz, Integer currentPage, Integer pageSize) {
if (ObjectUtils.isEmpty(conditions)) {
return selectList(collectName, clazz, currentPage, pageSize);
} else {
//設置分頁參數(shù)
Query query = new Query();
query.limit(pageSize);
query.skip(currentPage);
// 往query中注入查詢條件
conditions.forEach((key, value) -> query.addCriteria(Criteria.where(key).is(value)));
return mongoTemplate.find(query, clazz, collectName);
}
}
}
是不是很簡單的呢翻擒,如果有時間甚至可以封裝更好的業(yè)務接口
原創(chuàng)文章轉載請標明出處
更多文章請查看
http://www.canfeng.xyz