此篇梳理了一下SpringCloud 整合 MongoDB 的简易流程。
版本
- Spring Cloud : Greenwich.RC2
- openfeign : 2.0.1.RELEASE
- MongoDB :4.08
- 可视化工具 : adminMongo ( 或者使用 TreeDMS 都不错 )
- 假设MongoDB 已经安装完成 ,且已添加User
( 快速安装 参考以下链接 易百教程)
数据结构:
1 Maven 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
属性配置
//application 中加入配置
spring.data.mongodb.uri=mongodb://admin:123456@localhost:27017/antcache
//账户 : admin
//密码 : 123456
2 工具类
package com.antsystem.servercache.servercache.utils;
import com.alibaba.fastjson.JSONObject;
import com.mongodb.DBObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @author 10169
* @Description TODO
* @Date 2019/4/6 14:02
* @Version 1.0
**/
@Component
public class MongodbUtil {
Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
MongoTemplate mongoTemplate;
/**
* 插入JSON字符串
*
* @param json
*/
public void InsertJSON(String table, String json) {
logger.info("table is :{}--json is :{}", table, json);
mongoTemplate.insert(json, table);
}
/**
* 删除指定表的JSON字符串
*/
public void deleteJSON(String table, String key) {
mongoTemplate.remove(new Query(Criteria.where("id").is(key)), table);
}
/**
* <p>修改指定表的JSON字符串</p>
* <p>这里进行更细微化的操作</>
*
* @param table
*/
public void deleteJSON(String table, String key, String c) {
Query query = new Query(Criteria.where("id").is(key));
Update update = new Update().addToSet(key, mongoTemplate);
mongoTemplate.updateFirst(query, update, table);
}
/**
* 查询指定表的字符串
*/
public List<JSONObject> getJSONById(String table, String key) {
return mongoTemplate.find(new Query(Criteria.where("id").is(key)), JSONObject.class, table);
}
/**
* 查询指定表的所有数据
*/
public List<JSONObject> getJSONList(String table) {
return mongoTemplate.find(new Query(), JSONObject.class, table);
}
/**
* 查询指定表的所有数据
*
* @Return List<JSONObject>
*/
public List<JSONObject> getJSONListByFilter(String table, Map<String, Object> filterMap) {
List<Criteria> list = new ArrayList<Criteria>();
filterMap.keySet().forEach(key -> {
logger.info("key is :{}--value is:{}", key, filterMap.get(key));
list.add(Criteria.where(key).is(filterMap.get(key)));
});
// 查看源码可知 andOperator 可接受一个不限长度的
return mongoTemplate.find(new Query(new Criteria().andOperator(list.toArray(new Criteria[0]))), JSONObject.class, table);
}
/**
* 查询指定表的字符串
*
* @Return List<DBObject>
*/
public List<DBObject> getJSONByIdDBO(String table, String key) {
return mongoTemplate.find(new Query(Criteria.where("id").is(key)), DBObject.class, table);
}
/**
* 查询指定表的所有数据
*
* @Return List<DBObject>
*/
public List<DBObject> getJSONListDBO(String table) {
return mongoTemplate.find(new Query(), DBObject.class, table);
}
/**
* 查询指定表的所有数据
*
* @Return List<DBObject>
*/
public List<DBObject> getJSONListByFilterDBO(String table, Map<String, Object> filterMap) {
List<Criteria> list = new ArrayList<Criteria>();
filterMap.keySet().forEach(key -> {
logger.info("key is :{}--value is:{}", key, filterMap.get(key));
list.add(Criteria.where(key).is(filterMap.get(key)));
});
// 查看源码可知 andOperator 可接受一个不限长度的
return mongoTemplate.find(new Query(new Criteria().andOperator(list.toArray(new Criteria[0]))), DBObject.class, table);
}
/**
* DBObject To JSONObject
*/
// public List<JSONObject> dbToJson(String table) {
// return mongoTemplate.find(new Query(), DBObject.class, table);
// }
}
3 装换器
转换器在结构上可有可无 ,目的在于MongoDB 作为一个微服务应用的时候 ,对于返回的数据以何种方式返回
Utils 中有两种方式 ,一种查询出来为JOSNObject , 一种为DBObject , JOSNObject 在某种程度上和框架耦合 ,使用其他的JSON 框架时可能会比较麻烦 。 所以 在这里加入了转换器的概念 ,用于装换为统一的数据 。
public abstract class CacheResponse {
Logger logger = LoggerFactory.getLogger(getClass());
public List<Object> cacheBack(List<DBObject> list) {
List<Object> backList = new LinkedList<>();
for (Object db : list) {
logger.info("db is :{}", JSONObject.toJSONString(db));
backList.add(JSONObject.toJSON(db));
}
return backList;
}
}
// controller 继承 public class OrderController extends CacheResponse
4 接收
feign 接收数据 , 这里直接是使用String 类型接收 ,没有问题
@FeignClient(value = "server-cache",fallback = ServerCacheFailBack.class)
public interface ServerCacheMapper {
@GetMapping("getOrderList")
public List<String> getOrderList(@RequestParam("type") String type);
}
我这边是直接使用JSONObject 将其转换为VO对象
public List<LogisticsOrderVO> findAllByCache() {
logger.info("查询订单 cache 缓存:>>>>>>");
List<String> wrapper = cacheMapper.getOrderList("ALL");
logger.info("查询订单 cache 缓存结果:{}", wrapper);
List<LogisticsOrderVO> list = new LinkedList<>();
for (String sjosn : wrapper) {
list.add(JSONObject.parseObject(sjosn).toJavaObject(LogisticsOrderVO.class));
}
return list;
}
5 展示效果
6 小结
MongoDB 是基于文档形式的存储数据库 , 不同于Redis ,我们可以将JSON 数据进行非常直观的存储 ,而又拥有高效的性能,可用于 查看订单信息等这类无需对订单进行操作的场景 。