引言
springboot2.x已經內建了Mongodb了,我們可以很友善的使用mongoTemplate擷取MongoDB中的資料,但有時候光是MongoTemplate還不夠便捷,我們完全可以根據需要做一些簡單的接口來簡化日常開發操作
引入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 {
/**
* 功能描述: 根據自己建立的工廠初始化一個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());
}
/**
* 功能描述: 建立資料庫名稱對應的工廠,資料庫名稱可以通過配置檔案導入
*
* @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);
}
}
複制
設定基礎的做一些簡單的業務過渡接口
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;
/**
* 功能描述: 建立一個集合
* 同一個集合中可以存入多個不同類型的對象,我們為了友善維護和提升性能,
* 後續将限制一個集合中存入的對象類型,即一個集合隻能存放一個類型的資料
*
* @param name 集合名稱,相當于傳統資料庫的表名
* @return:void
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/20 17:27
*/
@Override
public void createCollection(String name) {
mongoTemplate.createCollection(name);
}
/**
* 功能描述: 建立索引
* 索引是順序排列,且唯一的索引
*
* @param collectionName 集合名稱,相當于關系型資料庫中的表名
* @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);
//建立按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;
}
/**
* 功能描述: 往對應的集合中插入一條資料
*
* @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);
}
/**
* 功能描述: 往對應的集合中批量插入資料,注意批量的資料中不要包含重複的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);
}
/**
* 功能描述: 使用索引資訊精确更改某條資料
*
* @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相當于傳統資料庫中的主鍵,這裡使用時就不支援更新,是以需要剔除掉
if (!key.equals("id")) {
update.set(key, value);
}
});
mongoTemplate.updateMulti(query, update, info.getClass(), collectionName);
}
/**
* 功能描述: 根據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在删除對象的時候會判斷對象類型,如果你不傳入對象類型,隻傳入了集合名稱,它是找不到的
// 上面我們為了友善管理和提升後續處理的性能,将一個集合限制了一個對象類型,是以需要自行管理一下對象類型
// 在接口傳入時需要同時傳入對象類型
mongoTemplate.remove(query, clazz, collectionName);
}
/**
* 功能描述: 根據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);
}
/**
* 功能描述: 查詢清單資訊
* 将集合中符合對象類型的資料全部查詢出來
*
* @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) {
//設定分頁參數
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);
}
/**
* 功能描述: 根據條件查詢集合
*
* @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 {
//設定分頁參數
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);
}
}
}
複制
是不是很簡單的呢,如果有時間甚至可以封裝更好的業務接口