springboot整合mongodb使用詳解
一、mongodb簡介
1.1 什么是mongodb
MongoDB是一個文檔數(shù)據庫(以 JSON 為數(shù)據模型),由C++語言編寫,旨在為WEB應用提供可擴展的高性能數(shù)據存儲解決方案。
1.2 mongodb特點
- MongoDB是一個介于關系數(shù)據庫和非關系數(shù)據庫之間的產品,是非關系數(shù)據庫當中功能最豐富,最像關系數(shù)據庫的;
- 它支持的數(shù)據結構非常松散,數(shù)據格式為BSON,一種類似JSON的二進制形式的存儲格
- 式,簡稱Binary JSON ,和JSON一樣支持內嵌的文檔對象和數(shù)組對象,因此可以存儲比較復雜的數(shù)據類型;
- MongoDB最大特點是支持的查詢語言非常強大,語法有點類似于面向對象的查詢語言,幾乎可以實現(xiàn)類似關系數(shù)據庫單表查詢的絕大部分功能,而且還支持對數(shù)據建立索引;
- 原則上 Oracle 和MySQL 能做的事情,MongoDB 都能做(包括 ACID 事務);
二、mongodb中的核心術語
在正式學習mogodb之前,有必要對mogodb中的基本術語和相關的語法做一個簡單了解,就像學習mysql必須掌握其基本語法、DDL、DML等一樣的道理,當然學習mogodb時可以類比mysql中的數(shù)據庫,表和字段進行理解。
2.1 mogodb與數(shù)據庫對比
MongoDB 概念與關系型數(shù)據庫( RDBMS )非常類似,見下表;
2.2 mongodb中的核心概念
關于上述表中關于mongodb各個術語,再做簡單的補充說明:
數(shù)據庫(database)
最外層的概念,可以理解為邏輯上的名稱空間,一個數(shù)據庫包含多個不同名稱的集合
集合(collection)
相當于SQL中的表,一個集合可以存放多個不同的文檔
文檔(document)
一個文檔相當于數(shù)據表中的一行,由多個不同的字段組成
字段(field)
文檔中的一個屬性,等同于列(column)
索引(index)
獨立的檢索式數(shù)據結構,與SQL概念一致
id
每個文檔中都擁有一個唯一的id字段,相當于SQL中的主鍵(primary key)
視圖(view)
可以看作一種虛擬的(非真實存在的)集合,與SQL中的視圖類似。從MongoDB3.4版本開始提供了視圖功能,其通過聚合管道技術實現(xiàn)
聚合操作($lookup)
MongoDB用于實現(xiàn)“類似”表連接(tablejoin)的聚合操作符
2.3 與關系數(shù)據庫的差異
盡管這些概念大多與SQL標準定義類似,但MongoDB與傳統(tǒng)RDBMS仍然存在不少差異,包括:
2.3.1 半結構化
半結構化,在一個集合中,文檔所擁有的字段并不需要是相同的,而且也不需要對所用的字段進行聲明,因此,MongoDB具有很明顯的半結構化特點。
2.3.2 支持多級嵌套
除了松散的表結構,文檔還可以支持多級的嵌套、數(shù)組等靈活的數(shù)據類型,非常契合面向對象的編程模型。
2.3.3 關系弱化
弱關系,MongoDB沒有外鍵的約束,也沒有非常強大的表連接能力。類似的功能需要使用聚合管道技術來彌補。
三、mongodb 技術優(yōu)勢和應用場景
3.1 mongodb 技術優(yōu)勢
傳統(tǒng)的關系型數(shù)據庫(如MySQL),在數(shù)據操作的“三高”需求以及應對Web2.0的網站需求面前,逐漸開始顯得吃力,對于數(shù)據庫來說,盡管可以通過集群或其他方式對單節(jié)點的mysql實例進行擴展,但這樣帶來的成本和代價也是巨大的,由于mongodb從一開始就是為分布式而生,面對海量數(shù)據,高并發(fā)的場景有得天獨厚的優(yōu)勢,同時其豐富的集群模式可以適應企業(yè)不同的數(shù)據運維和部署場景。
關于三高的解釋補充
1、High performance - 對數(shù)據庫高并發(fā)讀寫的需求;
2、Huge Storage - 對海量數(shù)據的高效率存儲和訪問的需求;
3、High Scalability && High Availability- 對數(shù)據庫的高可擴展性和高可用性的需求;
3.2 mongodb 應用場景
從目前阿里云 MongoDB 云數(shù)據庫上的用戶看,MongoDB 的應用已經滲透到各個領域,這里總結如下:
游戲場景
使用 MongoDB 存儲游戲用戶信息,用戶的裝備、積分等直接以內嵌文檔的形式存儲,方便查詢、更新;
物流場景
使用 MongoDB 存儲訂單信息,訂單狀態(tài)在運送過程中會不斷更新,以MongoDB 內嵌
數(shù)組的形式來存儲,一次查詢就能將訂單所有的變更讀取出來;
社交場景
使用 MongoDB 存儲存儲用戶信息,以及用戶發(fā)表的朋友圈信息,通過地理位置索引實
現(xiàn)附近的人、地點等功能;
物聯(lián)網場景
使用 MongoDB 存儲所有接入的智能設備信息,以及設備匯報的日志信息,并對這些信息進行多維度的分析;
大數(shù)據應用
使用云數(shù)據庫MongoDB作為大數(shù)據的云存儲系統(tǒng),隨時進行數(shù)據提取分析,掌握行業(yè)動態(tài)
3.3 什么時候選擇 mongodb
在上述的應用場景中,數(shù)據操作方面有如下一些共同的特點:
1)數(shù)據量大;
2)寫入操作頻繁(讀寫可能都很頻繁);
3)價值較低的數(shù)據,對事務性要求不高;
對于這樣的數(shù)據,我們更適合使用MongoDB來實現(xiàn)數(shù)據的存儲。在實際架構選型上,除了上述的三個特點外,如果你還猶豫是否要選擇它?可以考慮以下的一些問題:
1、應用不需要事務及復雜 join 支持;
2、新應用,需求會變,數(shù)據模型無法確定,想快速迭代開發(fā);
3、應用需要2000-3000以上的讀寫QPS(更高也可以);
4、應用需要TB甚至 PB 級別數(shù)據存儲;
5、應用發(fā)展迅速,需要能快速水平擴展;
6、應用要求存儲的數(shù)據不丟失;
7、應用需要99.999%高可用;
8、應用需要大量的地理位置查詢、文本查詢;
如果上述有1個符合,可以考慮 MongoDB,2個及以上的符合,選擇 MongoDB肯定不會錯。
四、快速部署 mongodb
為方便后面代碼整合使用,下面通過docker快速部署起一個mongodb的服務,按照下面的操作步驟執(zhí)行;
4.1 搭建過程
4.1.1 拉取鏡像
docker pull mongo:4.4
4.1.2 啟動鏡像
在啟動鏡像之前先創(chuàng)建一個數(shù)據目錄的映射
mkdir data
使用下面的命令啟動鏡像
docker run -itd --name mongo -v /usr/local/mongo/data:/data/db -p 27017:27017 mongo:4.4 --auth
參數(shù)說明:
1)-p 27017:27017,映射容器服務的 27017 端口到宿主機的 27017 端口,外部可以直接通過 宿主機 ip:27017 訪問到 mongo 的服務;
2)--auth:需要密碼才能訪問容器服務;
4.2 創(chuàng)建賬戶
4.2.1 登錄mongo容器,并進入到【admin】數(shù)據庫
docker exec -it mongo mongo admin
4.2.2 創(chuàng)建一個用戶
mongo 默認是沒有用戶的,這里root只是自己指定的用戶名,可以自己命名
db.createUser({ user:'root',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},'readWriteAnyDatabase']});
參數(shù)說明:
- 【user:‘root’ 】:設置用戶名為root;
- 【pwd:‘123456’】:設置密碼為123456;
- 【role:‘userAdminAnyDatabase’】:只在admin數(shù)據庫中可用,賦予用戶所有數(shù)據庫的userAdmin權限;
- 【db: ‘admin’】:可操作的數(shù)據庫;
- 【‘readWriteAnyDatabase’】:賦予用戶讀寫權限;
dbAdmin:允許用戶在指定數(shù)據庫中執(zhí)行管理函數(shù),如索引創(chuàng)建、刪除,查看統(tǒng)計或訪問system.profile
4.3 連接與測試
4.3.1連接mongo數(shù)據庫
db.auth('root', '123456');
4.3.2 插入與查詢數(shù)據
db.user.insert({"name":"zhangsan","age":18});
db.user.find();
4.3.3 使用客戶端連接
使用客戶端工具連接,如下圖所示,在下面填寫自己的連接信息即可;
五、整合springboot使用
5.1 前置說明
springboot與mongodb整合使用通常有兩種方式,這兩種方式在開發(fā)過程中結合實際需要都可以選擇;
5.1.1 jpa方式整合
使用過spingboot的jpa操作mysql的同學應該不陌生,這種方式的好處很明顯,就是jpa中針對常用的對于數(shù)據庫的CRUD操作相關的API做了封裝,開發(fā)者對于常用的增刪改查功能開發(fā)起來效率很高,缺點是如果業(yè)務操作比較復雜,需要編寫比較復雜的sql語句時,使用jpa就不太方便了,盡管jpa也可以通過注解編寫部分類sql語句,但是語法還是有一定上手成本的。
5.1.2 MongoTemplate 方式整合
很多第三方組件都與springboot做了整合集成,比如像redis提供了redisTemplate,kafka集成springboot時提供了kafkaTemplate等類似,mongodb也提供了MongoTemplate ,MongoTemplate 提供了滿足日常開發(fā)需要的豐富的API,基本上涵蓋了大部分的場景需求,學習成本較低,網上可以參閱的資料也比較豐富??梢宰鳛榈谝贿x擇。
為了更好的滿足日常開發(fā)中的需要,下面將這兩種方式的使用做一個詳細的介紹。
5.2 準備一個數(shù)據庫
為了方便后文中代碼的測試,基于上面已經搭建完成的mongodb服務,使用root賬戶登錄進去之后,創(chuàng)建一個名為 book的collection集合,創(chuàng)建也比較簡單,使用上面的root用戶登錄進客戶端之后,直接輸入下面的命令即可創(chuàng)建;
use 你的數(shù)據庫名稱
5.3 jpa方式整合使用
5.3.1 創(chuàng)建一個springboot的工程
創(chuàng)建一個空的springboot工程,目錄結構如下:
5.3.2 導入核心依賴
為了接口測試方便,引入了swagger的相關依賴;
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <!--swagger API獲取--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <!--swagger-ui API獲取--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> </dependencies>
5.3.3 application 配置文件
application.yml中添加如下配置
spring: data: mongodb: uri: mongodb://root:123456@IP地址:27017/book?authSource=admin&authMechanism=SCRAM-SHA-1 server: port: 8082
5.3.4 實體數(shù)據對象
創(chuàng)建一個Book類,作為與mongo中的book這個collection集合的映射,對象中的屬于對應著數(shù)據庫中的collection的各個字段;
@Document(collection="book") @Data @AllArgsConstructor @NoArgsConstructor public class BookInfo { @Id private String id; @Field("name") private String name; @Field("price") private Integer price; @Field("publish_time") private String publishTime; @Field("comment") private String comment; }
5.3.5 jpa數(shù)據持久層
添加一個與mongodb集合交互的jpa接口,繼承MongoRepository接口,使用過jpa的同學對此應該不陌生;
public interface BookRepository extends MongoRepository<BookInfo,String> { }
5.3.6 核心操作接口
為方便測試,創(chuàng)建一個接口類,由于基本的增刪改查邏輯相對比較簡單,直接調用MongoRepository即可,下面貼出基本的增刪改查接口
@Autowired private BookService bookService; @PostMapping("/save") public String save(BookInfo bookInfo) { return bookService.saveBook(bookInfo); } @PostMapping("/update") public String update(BookInfo bookInfo) { return bookService.update(bookInfo); } @GetMapping("/delete") public String deleteById(String id) { return bookService.deleteById(id); } @PostMapping("/detail") public BookInfo findById(String id) { return bookService.findById(id); }
業(yè)務實現(xiàn)
@Autowired private BookRepository bookRepository; /** * 保存 * @param bookInfo * @return */ public String saveBook(BookInfo bookInfo){ bookInfo.setId(IdUtil.generateId()); bookRepository.save(bookInfo); return "save book info success"; } /** * 修改 * @param bookInfo * @return */ public String update(BookInfo bookInfo) { if(StringUtils.isEmpty(bookInfo.getId())){ throw new RuntimeException("ID不能為空"); } bookRepository.save(bookInfo); return "save book info success"; } /** * 根據ID刪除 * @param id * @return */ public String deleteById(String id) { bookRepository.deleteById(id); return "delete success"; } /** * 查詢所有 * @return */ public List<BookInfo> findList() { return bookRepository.findAll(); } /** * 根據ID獲取 * @param id * @return */ public BookInfo findById(String id) { Optional<BookInfo> bookInfoOptional = bookRepository.findById(id); return bookInfoOptional.isPresent() ? bookInfoOptional.get() : null; }
以查詢詳情接口為例,在swagger中做一下測試,效果如下:
5.3.7 常用復雜查詢接口
相信很多項目使用mongodb的一個重要的原因就是使用mongo進行查詢時性能很高,尤其是針對一些復雜的查詢場景時優(yōu)勢很明顯,下面結合開發(fā)中其他比較常用的幾個查詢場景做一下補充;
模糊查詢
主要用到了ExampleMatcher這個匹配對象,類似于mysql的: like '%關鍵字%';
/** * 模糊查詢 * @param name * @return */ public List<BookInfo> query(String name) { //構建匹配器對象 ExampleMatcher matcher = ExampleMatcher.matching() .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //設置默認字符串匹配方式:模糊查詢 .withIgnoreCase(true); //設置默認大小寫忽略方式:true為忽略大小寫 BookInfo bookInfo = new BookInfo(); bookInfo.setName(name); Example<BookInfo> bookInfoExampleExample = Example.of(bookInfo,matcher); List<BookInfo> bookInfos = bookRepository.findAll(bookInfoExampleExample); return bookInfos; }
分頁查詢
public Page<BookInfo> pageQuery(Integer pageNo,Integer pageSize,String name) { //構造排序器,設置排序字段 Sort sort = Sort.by(Sort.Direction.ASC,"price"); Pageable pageable = null; if(Objects.isNull(pageNo) || Objects.isNull(pageSize)){ pageNo = 0; pageSize=10; } pageable = PageRequest.of(pageNo, pageSize, sort); //創(chuàng)建匹配器,設置查詢條件 ExampleMatcher matcher = ExampleMatcher.matching() //構建匹配器對象 .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //設置默認字符串匹配方式:模糊查詢 .withIgnoreCase(true); //設置默認大小寫忽略方式:true為忽略大小寫 //設置查詢條件 BookInfo bookInfo = new BookInfo(); bookInfo.setName(name); Example<BookInfo> bookExample = Example.of(bookInfo,matcher); //查詢 Page<BookInfo> page = bookRepository.findAll(bookExample, pageable); return page; }
sql方式查詢
某些情況下可能已有的API并不能很好的滿足,就需要通過編寫sql的方式實現(xiàn)了,在使用jpa操作mysql的時候俗稱hql語言,關于使用MongoRepository編寫類sql的相信資料可以參閱相關資料,網上可以搜到很多,其核心語法仍然是mongodb自身的那些操作語句,只是需要遵照Java中的編寫規(guī)范;
下面提供了幾個常用的查詢,提供參考
public interface BookRepository extends MongoRepository<BookInfo,String> { //根據名稱查詢 @Query("{name: ?0}") List<BookInfo> findByBookName(String name); //查詢價格大于某個數(shù)的集合 @Query(value = "{price: { $gt: ?0 }}") List<BookInfo> findByBookPriceThan(int price); //查詢ID在某個集合中,類似mysql 的 in ()語法 @Query(value = "{'_id':{$in:?0}}") List<BookInfo> findAllByIdIn(List<String> ids); }
5.4 MongoTemplate 方式整合使用
MongoTemplate相對于MongoRepository來說,從API的使用上來說,選擇更豐富,編碼也更友好,同時API的使用也更加符合編碼的習慣,下面再使用MongoTemplate 的方式做一下操作演示
配置文件等信息暫時不用修改
5.4.1 核心增刪接口
接口層
@RestController @RequestMapping("/template") public class BookTemplateController { @Autowired private BookTemplateService bookTemplateService; @PostMapping("/save") public BookInfo save(BookInfo bookInfo){ return bookTemplateService.save(bookInfo); } @PostMapping("/update") public BookInfo update(BookInfo bookInfo){ return bookTemplateService.update(bookInfo); } @GetMapping("/delete") public String delete(String id){ return bookTemplateService.delete(id); } @GetMapping("/details") public BookInfo details(String id){ return bookTemplateService.findById(id); } }
業(yè)務實現(xiàn)
@Service public class BookTemplateService { @Autowired private MongoTemplate mongoTemplate; public BookInfo save(BookInfo bookInfo) { bookInfo.setId(IdUtil.generateId()); BookInfo book = mongoTemplate.save(bookInfo); return book; } public BookInfo update(BookInfo bookInfo) { if(StringUtils.isEmpty(bookInfo.getId())){ throw new RuntimeException("ID為空"); } Query query = Query.query(Criteria.where("_id").is(bookInfo.getId())); BookInfo dbBook = mongoTemplate.findOne(query, BookInfo.class); if(Objects.isNull(dbBook)){ return null; } Update update = new Update(); if(!StringUtils.isEmpty(bookInfo.getName())){ update.set("name",bookInfo.getName()); } if(!StringUtils.isEmpty(bookInfo.getComment())){ update.set("comment",bookInfo.getComment()); } if(Objects.nonNull(bookInfo.getPrice())){ update.set("price",bookInfo.getPrice()); } mongoTemplate.updateFirst(query,update,BookInfo.class); return bookInfo; } public String delete(String id) { Query query = new Query(Criteria.where("_id").is(id)); mongoTemplate.remove(query,BookInfo.class); return "deleted"; } public BookInfo findById(String id) { BookInfo bookInfo = mongoTemplate.findById(id, BookInfo.class); return bookInfo; } }
5.4.2 復雜查詢接口
在實際業(yè)務開發(fā)中,更多的情況下會用到mongodb較復雜的查詢,下面列舉一些常用的復雜查詢的場景提供參考
json字符串方式查詢
如果在API調用過程中覺得書寫不習慣的話,也支持原生的json語句查詢,即將在客戶端命令行中的查詢語句轉為json作為一個完整的語句進行查詢
public List<BookInfo> queryByJson(String name,String type,Integer price) { //String json1 = "{name:'" + name +"'}"; String json2 = "{$or:[{price:{$gt: '" +price+"'}},{type: '"+type+"'}]}"; Query query = new BasicQuery(json2); //查詢結果 List<BookInfo> employees = mongoTemplate.find(query, BookInfo.class); return employees; }
模糊查詢
類似于mysql中的like
//模糊查詢 public List<BookInfo> queryLike(String key){ Query query = new Query(Criteria.where("name").regex(key)); List<BookInfo> bookInfos = mongoTemplate.find(query, BookInfo.class); return bookInfos; }
范圍查詢
//查詢價格大于某個值 public List<BookInfo> queryMoreThan(Integer price){ Query query = new Query(Criteria.where("price").gte(price)); List<BookInfo> bookInfos = mongoTemplate.find(query, BookInfo.class); return bookInfos; }
多條件查詢
類似于mysql中的多個條件通過and的查詢
//多條件查詢 public List<BookInfo> queryMultiParams(String name,String type,Integer price){ //or 條件查詢 Criteria criteria = new Criteria(); /*criteria.orOperator( Criteria.where("name").regex(name), Criteria.where("price").gte(price), Criteria.where("type").is(type) );*/ //and 條件查詢 criteria.andOperator( Criteria.where("price").gte(price), Criteria.where("type").is(type) ); Query query = new Query(criteria); List<BookInfo> bookInfos = mongoTemplate.find(query, BookInfo.class); return bookInfos; }
分頁查詢
//分頁查詢 public PageInfo<BookInfo> pageQuery(Integer pageIndex,Integer pageSize,String type){ Criteria criteria = new Criteria(); if(!StringUtils.isEmpty(type)){ criteria = Criteria.where("price").gte(type); } //TODO 如果有更多的查詢條件,繼續(xù)拼接 ... Query query = new Query(criteria); if(Objects.isNull(pageIndex) || Objects.isNull(pageSize)){ pageIndex = 1; pageSize = 2; } //查詢總數(shù) long total = mongoTemplate.count(query, BookInfo.class); System.out.println(total); //查詢結果根據價格排個序 query.with(Sort.by(Sort.Order.desc("price"))) .skip((pageIndex-1) * pageSize) //指定跳過記錄數(shù) .limit(pageSize); //每頁顯示記錄數(shù) List<BookInfo> bookInfos = mongoTemplate.find(query, BookInfo.class); PageInfo<BookInfo> pageInfo = new PageInfo(pageIndex,pageSize,total,bookInfos); return pageInfo; }
5.4.3 聚合查詢
聚合操作處理數(shù)據記錄并返回計算結果(諸如統(tǒng)計平均值,求和等)。聚合操作組值來自多個文檔,可以對分組數(shù)據執(zhí)行各種操作以返回單個結果。聚合操作包含三類:單一作用聚合、聚合管道、MapReduce。
單一作用聚合
提供了對常見聚合過程的簡單訪問,操作都從單個集合聚合文檔;
聚合管道
聚合管道是一個數(shù)據聚合的框架,模型基于數(shù)據處理流水線的概念。文檔進入多級管道,將文檔轉換為聚合結果;
MapReduce
MapReduce操作具有兩個階段:處理每個文檔并向每個輸入文檔發(fā)射一個或多個對象的map階段,以及reduce組合map操作的輸出階段。
5.4.4 聚合統(tǒng)計查詢案例
關于分組聚合統(tǒng)計的內容比較多,限于篇幅這里不做展開,我們將book這個collection集合的字段進行擴展(為了進行分組聚合使用),并插入一些數(shù)據,如下所示
下面我們要實現(xiàn)的需求是,
按照book的type字段進行分組,
1)統(tǒng)計每個type類型下的book的閱讀總數(shù),平均閱讀數(shù);
2)統(tǒng)計每個type類型下的book的喜歡總數(shù),平均喜歡的數(shù)量;
完整的代碼如下
public void groupQuery(){ // 查詢條件 Criteria criteria = new Criteria(); MatchOperation matchOperation = Aggregation.match(criteria); // 查詢包括的字段 ProjectionOperation projectionOperation = Aggregation.project("id", "name","price", "type","readCount","likeCount"); // 分組統(tǒng)計 GroupOperation groupOperation = Aggregation.group("type") //.first("type").as("type") .count().as("typeCount") .sum("likeCount").as("totalLike") .avg("likeCount").as("avgLikeCount") .sum("readCount").as("totalReadCount") .sum("readCount").as("avgReadCount"); AggregationResults<Map> totalAuthorResult = mongoTemplate.aggregate(Aggregation.newAggregation(BookInfo.class, matchOperation, projectionOperation, groupOperation), Map.class); //獲取分類總數(shù) int typeCount = (int) totalAuthorResult.getMappedResults().size(); System.out.println(typeCount); //得到最終分組聚合的結果 List<Map> mappedResults = totalAuthorResult.getMappedResults(); for(Map map :mappedResults){ System.out.println(map.keySet()); } }
通過debug,可以看到查詢得到的結果如下
如果你需要獲取最終的各個分組的統(tǒng)計結果,只需遍歷上述的結果集即可。
六、結語
關于mongodb的技術體系是比較龐大的,本文只是冰山一角,要深入學習和掌握mongodb還需要實際開發(fā)過程中通過經驗的積累才能加深對mongodb的理解和運用,隨著技術的發(fā)展,mongodb在越來越多的領域都有著不錯的運用,因此感興趣的同學可以在此基礎上深入研究。
以上就是springboot整合mongodb使用詳解的詳細內容,更多關于springboot整合mongodb的資料請關注腳本之家其它相關文章!
相關文章
spring boot actuator監(jiān)控超詳細教程
Spring Boot Actuator就是一款可以幫助你監(jiān)控系統(tǒng)數(shù)據的框架,其可以監(jiān)控很多很多的系統(tǒng)數(shù)據,接下來通過本文給大家介紹spring boot actuator監(jiān)控超詳細教程,感興趣的朋友一起看看吧2021-10-10eclipse的web項目實現(xiàn)Javaweb購物車的方法
這篇文章主要介紹了eclipse的web項目實現(xiàn)Javaweb購物車的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-10-10Spring Boot創(chuàng)建非可執(zhí)行jar包的實例教程
這篇文章主要介紹了Spring Boot創(chuàng)建非可執(zhí)行jar包的實例教程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02Java 如何讀取Excel格式xls、xlsx數(shù)據工具類
這篇文章主要介紹了Java 如何讀取Excel格式xls、xlsx數(shù)據工具類的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09