#1.回顾
SpringBoot整合MongoDB数据库方式(一)
上一篇文章写的接口继承的接口,而继承的接口也继承着上级接口,一级一级继承上去,但最终由SpringBoot的容器框架帮助我们实现接口的具体实现,框架是如何实现的我们这里暂时不做说明.有兴趣的可以自己去研究一下.
即接口之间的继承–>注入–>使用
#2.MongoTemplate.class
#2.1体系结构
#2.2实现接口
#.2.3注入对象
#2.4相关方法
save相关方法
insert相关方法
update相关方法
get相关方法:
upsert相关方法:
remove相关方法:
就不一一赘述了,里面这个MongoTemplate类里面3000多行代码,几十上百个方法,几乎涵盖了操作MongoDB数据库的所有方式.就目前来说不会出现你想用而他没有的方法,更多的情况是这个方法已经存在,而你并不知道他的存在.
#2.5当然,这也是框架给我们提供好的,那么如何扩展自己特定的方法呢.
#3.扩展
#3.1编写接口
#3.2自己实现自己的接口(达到定制化)
#3.3 复杂实现
上面这个接口开起来很简单,当然我们还有复杂一点的实现方式,比如下面的具体实现:
/**
* 复制数据
*
* @param tenantId 企业id
* @param dataId 数据id
* @param formId 表单id
* @param copySource 数据复制源
* @return 复制的结果
* @author ???
*/
@Override
public BaseVO<TableDataVO> copyData(Long tenantId, Long dataId, Long formId, String copySource) {
List<CopySource> copySources = new ArrayList<>();
JSONArray jsonArray = JSON.parseArray(copySource);
for (Object o : jsonArray) {
JSONObject jsonObject = (JSONObject) o;
CopySource source = JSON.parseObject(JSON.toJSONString(jsonObject), CopySource.class);
source.setRowId(jsonObject.getLong("row_id"));
List<TableRow> tableRowlist = new ArrayList<>();
JSONArray rowsJson = jsonObject.getJSONArray("table_rows");
for (Object obj : rowsJson) {
JSONObject json = (JSONObject) obj;
TableRow tableRow = new TableRow();
tableRow.setValue(jsonTransfer.transData(json.getJSONObject(Const.VALUE)));
tableRowlist.add(tableRow);
}
source.setTableRows(tableRowlist);
copySources.add(source);
}
List<Long> copyIds = new ArrayList<>();
List<TableRow> copyResultRows = new ArrayList<>();
for (CopySource source : copySources) {
List<TableRow> tableRows = source.getTableRows();
for (TableRow tableRow : tableRows) {
tableRow.setId(snowflakeClient.uniqueId());
tableRow.setCopySourceId(source.getRowId());
tableRow.setStatus(DataState.ENABLE);
}
copyIds.add(source.getRowId());
copyResultRows.addAll(source.getTableRows());
}
Map.Entry<String, DataBase> sourceDataEntry = null;
//查询数据库中需要被拆分的数据
Query query = new Query();
query.addCriteria(Criteria.where("_id").is(dataId).and("form_id").is(formId).and("tenant_id").is(tenantId));
FormData formData = mongoTemplate.findOne(query, FormData.class);
for (Map.Entry<String, DataBase> entry : formData.getData().entrySet()) {
if (Const.LIST.equals(entry.getValue().getType())) {
TableData tableData = (TableData) entry.getValue();
List<Long> allRows = new ArrayList<>();
for (TableRow tableRow : tableData.getValue()) {
allRows.add(tableRow.getId());
}
if (allRows.containsAll(copyIds)) {
sourceDataEntry = entry;
}
}
}
if (sourceDataEntry == null) {
return null;
}
if (!((TableVO) metadataClient.getField(tenantId, formId, sourceDataEntry.getKey())).getCopy()) {
return null;
}
TableData sourceTable = (TableData) sourceDataEntry.getValue();
for (TableRow tableRow : sourceTable.getValue()) {
if (copyIds.contains(tableRow.getId())) {
tableRow.setStatus(DataState.HIDDEN);
}
}
sourceTable.getValue().addAll(copyResultRows);
formData.getData().put(sourceDataEntry.getKey(), sourceTable);
formData.setSelectedRows(new ArrayList<>());
mongoTemplate.save(formData);
Map<String, DataBaseVO> dataVO = jsonTransfer.transDataVO(tenantId, formData.getCreator(), formId,
JSON.parseObject(JSON.toJSONString(formData.getData())), formData, null);
return new BaseVO<>(BaseVO.SUCCESS_CODE, "操作成功", (TableDataVO) dataVO.get(sourceDataEntry.getKey()));
}
而他的接口如下;
这和你各自具体的业务相关,mongoDB能干啥,无非就是数据的操作,你把数据拿出来按照一定业务逻辑过滤一遍,然后再存回数据库去,这是一种,业务逻辑各种各样,而基础操作就那么一些
#4其他我想告诉你的
比如下面这个接口:
具体实现;
mongoDB中的高级查询
@Override
public List<FormData> getHistoryVersionInfo(Long tenantId, Long originId, Long grantId, Long formId) {
//创建查询对象
Query query = new Query();
// 添加查询条件
query.addCriteria(Criteria.where("tenant_id").is(tenantId).and("origin_id").is(originId).and("form_id").is(formId).and("status").ne("DELETE"));
// 将查询对象,参数传递进去,利用mongoTemplate的find()方法拿到你想要的数据,
return mongoTemplate.find(query, FormData.class, Const.COLLECTION_FORM_DATA);
}
这些需要你对MongoDB数据库有一定的了解,比如ne关键字啊,find()findOne等等起数据库自身的相关内容
#5.两种方式总结
#1. 写自己的接口去继承别人的接口(MongoRepository) 由框架帮我们实现,当然也可以在自己的接口写扩展.
#2. 利用框架已经写好的具体实现类(MongoTemplate),通过注入该类对象,调用该类几乎涵盖了所有操作内容的方法
方法有很多,看你自己喜欢,个人推荐第二种 #2,即注入MongoTemplate,调用其丰富的方法,实现SpringBoot对MongoDB的操作…