Spring Boot集成mongodb數(shù)據(jù)庫過程解析
一.認(rèn)識(shí)mongodb
MongoDB是一個(gè)介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的。它支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似json的bson格式,因此可以存儲(chǔ)比較復(fù)雜的數(shù)據(jù)類型。Mongo最大的特點(diǎn)是它支持的查詢語言非常強(qiáng)大,其語法有點(diǎn)類似于面向?qū)ο蟮牟樵冋Z言,幾乎可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫單表查詢的絕大部分功能,而且還支持對(duì)數(shù)據(jù)建立索引。
二.Spring boot項(xiàng)目集成mongodb
1.添加mongodb依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2.配置mongodb的連接
spring:
data:
mongodb:
#uri: mongodb://localhost:27017/data_exploration
uri: mongodb://root:dhcc-mongodb@192.168.100.87:27017/data_exploration?authSource=admin&authMechanism=SCRAM-SHA-1
解析:以上uri分別代表本地配置和遠(yuǎn)程連接
3.操作數(shù)據(jù)庫
(1)保存
@Repository
public class ExplorationJobDao {
@Autowired
MongoTemplate mongoTemplate;
public void save(ExplorationJob explorationJob) {
mongoTemplate.save(explorationJob);
}
}
(2)根據(jù)ID修改一條數(shù)據(jù)(其原理先符合ID的數(shù)據(jù),然后刪除查詢結(jié)果的第一條)
public void updateExecutionStatusById(int executionStatus, String jobId) {
Query query = new Query(Criteria.where("jobId").is(jobId));
Update update = new Update().set("executionStatus", executionStatus);
mongoTemplate.updateFirst(query, update, ExplorationJob.class);
}
(3)根據(jù)條修改多條數(shù)據(jù)(查詢符合ID的所有數(shù)據(jù),然后將所有數(shù)據(jù)修改)
public void update(BusinessExploration businessExploration) {
Query query = new Query(Criteria.where("_id").is(businessExploration.getId()));
Update update = new Update().set("sourceUnit", businessExploration.getSourceUnit())
.set("appSystem", businessExploration.getAppSystem())
.set("businessImplication", businessExploration.getBusinessImplication())
.set("safetyRequire", businessExploration.getSafetyRequire());
mongoTemplate.updateMulti(query, update, TableExploration.class);
}
(4)刪除(根據(jù)ID刪除)
public void delExplorationJobById(String jobId) {
Query query=new Query(Criteria.where("jobId").is(jobId));
mongoTemplate.remove(query,ExplorationJob.class);
}
(5)根據(jù)條件查詢(根據(jù)ID查詢)
public ExplorationJob getExplorationJobByJobId(String jobId) {
Query query = new Query(Criteria.where("jobId").is(jobId));
ExplorationJob explorationJob = mongoTemplate.findOne(query, ExplorationJob.class);
return explorationJob;
}
(6)查詢所有
mongoTemplate.findAll(TableExploration.class);
(7)多條件動(dòng)態(tài)查詢
public List<ExplorationJob> getExplorationByCondition(ExplorationJob explorationJob) {
Query query = new Query();
if (explorationJob.getJobName() != null) {
Pattern pattern = Pattern.compile("^.*" + explorationJob.getJobName() + ".*$", Pattern.CASE_INSENSITIVE);
query.addCriteria(Criteria.where("jobName").regex(pattern));
}
if (explorationJob.getDsType() != null) {
query.addCriteria(Criteria.where("dsType").is(explorationJob.getDsType()));
}
if (explorationJob.getExecutionStatus() != null) {
query.addCriteria(Criteria.where("executionStatus").lte(explorationJob.getExecutionStatus()));
}
List<ExplorationJob> explorationJobs=mongoTemplate.find(query, ExplorationJob.class);
return explorationJobs;
}
(8)查詢最大值
public Date getMaxExplorationDate(String tableName) {
FindIterable<Document> iterable = mongoTemplate.getCollection("tableExploration")
.find(new BasicDBObject("tableName", tableName)).sort(new BasicDBObject("explorationDate", -1)).skip(0)
.limit(1);
Document doc =null;
if (getDocuments(iterable).size()>0) {
doc=getDocuments(iterable).get(0);
Date date = doc.getDate("explorationDate");
return date;
}else {
return null;
}
}
/**
* 工具方法
*
* @param iterable
* @return
*/
public static List<Document> getDocuments(FindIterable<Document> iterable) {
List<Document> results = new ArrayList<Document>();
if (null != iterable) {
MongoCursor<Document> cursor = iterable.iterator();
Document doc = null;
while (cursor.hasNext()) {
doc = cursor.next();
results.add(doc);
}
}
return results;
}
(9)分組查詢(這里還是用到了排序)
public List<TableExploration> getAllTableExplorationGroupByTableName(String jobId){
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.match(Criteria.where("jobId").is(jobId)),
Aggregation.sort(new Sort(Direction.DESC,"explorationDate")),
Aggregation.group("tableName")
.first("_id").as("tableName")
.first("databaseType").as("databaseType")
.first("databaseName").as("databaseName")
.first("networkSituation").as("networkSituation")
.first("userName").as("userName")
.first("password").as("password")
.first("url").as("url")
.first("dataStorage").as("dataStorage")
.first("dataIncrement").as("dataIncrement")
.first("explorationDate").as("explorationDate")
//.push("columnExplorations").as("columnExplorations")
.first("jobId").as("jobId")
);
AggregationResults<TableExploration> aggregationResults= mongoTemplate.aggregate(aggregation, "tableExploration", TableExploration.class);
List<TableExploration> tableExplorations=aggregationResults.getMappedResults();
return tableExplorations;
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ReentrantLock條件變量使多個(gè)線程順序執(zhí)行
這篇文章主要為大家介紹了ReentrantLock條件變量使多個(gè)線程順序執(zhí)行,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
springboot啟動(dòng)時(shí)如何獲取端口和項(xiàng)目名
這篇文章主要介紹了springboot啟動(dòng)時(shí)如何獲取端口和項(xiàng)目名,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
如何使用IDEA創(chuàng)建MAPPER模板過程圖解
這篇文章主要介紹了如何使用IDEA創(chuàng)建MAPPER模板,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
解決springboot沒有啟動(dòng)標(biāo)識(shí),啟動(dòng)類也沒有啟動(dòng)標(biāo)識(shí)的問題
這篇文章主要介紹了解決springboot沒有啟動(dòng)標(biāo)識(shí),啟動(dòng)類也沒有啟動(dòng)標(biāo)識(shí)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
SpringSecurity集成圖片驗(yàn)證碼的詳細(xì)過程
SpringSecurity是通過過濾器鏈來完成的,接下來的驗(yàn)證碼,可以嘗試創(chuàng)建一個(gè)過濾器放到Security的過濾器鏈中,在自定義的過濾器中比較驗(yàn)證碼,本文通過實(shí)例代碼介紹SpringSecurity集成圖片驗(yàn)證碼的詳細(xì)過程,感興趣的朋友一起看看吧2023-12-12
springboot使用Redis隊(duì)列實(shí)戰(zhàn)
本文主要介紹了springboot使用Redis隊(duì)列實(shí)戰(zhàn),包含四種實(shí)現(xiàn)方式,基于List的 LPUSH+BRPOP的實(shí)現(xiàn), 基于Sorted-Set的實(shí)現(xiàn),PUB/SUB訂閱/發(fā)布模式和基于Stream類型的實(shí)現(xiàn),感興趣的可以了解一下2024-07-07

