国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Spring Boot 中使用 MongoDB 增刪改查

ranwu / 2989人閱讀

摘要:聲明構(gòu)造函數(shù),作用是把從數(shù)據(jù)庫取出的數(shù)據(jù)實(shí)例化為對(duì)象。該構(gòu)造函數(shù)傳入的值為從中取出的數(shù)據(jù)省略接口提供增刪改查接口實(shí)現(xiàn)提供增刪改查接口實(shí)現(xiàn)提供了一個(gè)類似于的設(shè)計(jì)的類。

本文快速入門,MongoDB 結(jié)合SpringBoot starter-data-mongodb 進(jìn)行增刪改查

1、什么是MongoDB ?

MongoDB 是由C++語言編寫的,是一個(gè)基于分布式文件存儲(chǔ)的開源數(shù)據(jù)庫系統(tǒng)。

在高負(fù)載的情況下,添加更多的節(jié)點(diǎn),可以保證服務(wù)器性能。

MongoDB 旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。

MongoDB 將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對(duì)組成。

MongoDB 文檔類似于 JSON 對(duì)象。字段值可以包含其他文檔,數(shù)組及文檔數(shù)組。

2、MongoDB 優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

文檔結(jié)構(gòu)的存儲(chǔ)方式,能夠更便捷的獲取數(shù)據(jù)

內(nèi)置GridFS,支持大容量的存儲(chǔ)

海量數(shù)據(jù)下,性能優(yōu)越

動(dòng)態(tài)查詢

全索引支持,擴(kuò)展到內(nèi)部對(duì)象和內(nèi)嵌數(shù)組

查詢記錄分析

快速,就地更新

高效存儲(chǔ)二進(jìn)制大對(duì)象 (比如照片和視頻)

復(fù)制(復(fù)制集)和支持自動(dòng)故障恢復(fù)

內(nèi)置 Auto- Sharding 自動(dòng)分片支持云級(jí)擴(kuò)展性,分片簡(jiǎn)單

MapReduce 支持復(fù)雜聚合

商業(yè)支持,培訓(xùn)和咨詢

缺點(diǎn)

不支持事務(wù)操作

MongoDB 占用空間過大 (不過這個(gè)確定對(duì)于目前快速下跌的硬盤價(jià)格來說,也不算什么缺點(diǎn)了)

MongoDB沒有如MySQL那樣成熟的維護(hù)工具

無法進(jìn)行關(guān)聯(lián)表查詢,不適用于關(guān)系多的數(shù)據(jù)

復(fù)雜聚合操作通過mapreduce創(chuàng)建,速度慢

模式自由,自由靈活的文件存儲(chǔ)格式帶來的數(shù)據(jù)錯(cuò)

MongoDB 在你刪除記錄后不會(huì)在文件系統(tǒng)回收空間。除非你刪掉數(shù)據(jù)庫。但是空間沒有被浪費(fèi)

3、優(yōu)缺點(diǎn)詳細(xì)解釋

1.內(nèi)置GridFS,支持大容量的存儲(chǔ):

GridFS是一個(gè)出色的分布式文件系統(tǒng),可以支持海量的數(shù)據(jù)存儲(chǔ)。
內(nèi)置了GridFS了MongoDB,能夠滿足對(duì)大數(shù)據(jù)集的快速范圍查詢。

2.內(nèi)置 Auto- Sharding 自動(dòng)分片支持云級(jí)擴(kuò)展性,分片簡(jiǎn)單

提供基于Range的Auto Sharding機(jī)制:

一個(gè)collection可按照記錄的范圍,分成若干個(gè)段,切分到不同的Shard上。

Shards可以和復(fù)制結(jié)合,配合Replica sets能夠?qū)崿F(xiàn)Sharding+fail-over,不同的Shard之間可以負(fù)載均衡。
查詢是對(duì)客戶端是透明的。客戶端執(zhí)行查詢,統(tǒng)計(jì),MapReduce等操作,這些會(huì)被MongoDB自動(dòng)路由到后端的數(shù)據(jù)節(jié)點(diǎn)。
這讓我們關(guān)注于自己的業(yè)務(wù),適當(dāng)?shù)?時(shí)候可以無痛的升級(jí)。MongoDB的Sharding設(shè)計(jì)能力最大可支持約20 petabytes,足以支撐一般應(yīng)用。
這可以保證MongoDB運(yùn)行在便宜的PC服務(wù)器集群上。PC集群擴(kuò)充起來非常方便并且成本很低,避免了“sharding”操作的復(fù)雜性和成本。

3.海量數(shù)據(jù)下,性能優(yōu)越:

在使用場(chǎng)合下,千萬級(jí)別的文檔對(duì)象,近10G的數(shù)據(jù),對(duì)有索引的ID的查詢不會(huì)比mysql慢,而對(duì)非索引字段的查詢,則是全面勝出。 mysql實(shí)際無法勝任大數(shù)據(jù)量下任意字段的查詢,而mongodb的查詢性能實(shí)在讓我驚訝。寫入性能同樣很令人滿意,同樣寫入百萬級(jí)別的數(shù) 據(jù),mongodb比我以前試用過的couchdb要快得多,基本10分鐘以下可以解決。補(bǔ)上一句,觀察過程中mongodb都遠(yuǎn)算不上是CPU殺手。

4.全索引支持,擴(kuò)展到內(nèi)部對(duì)象和內(nèi)嵌數(shù)組

索引通常能夠極大的提高查詢的效率,如果沒有索引,MongoDB在讀取數(shù)據(jù)時(shí)必須掃描集合中的每個(gè)文件并選取那些符合查詢條件的記錄。

這種掃描全集合的查詢效率是非常低的,特別在處理大量的數(shù)據(jù)時(shí),查詢可以要花費(fèi)幾十秒甚至幾分鐘,這對(duì)網(wǎng)站的性能是非常致命的。

索引是特殊的數(shù)據(jù)結(jié)構(gòu),索引存儲(chǔ)在一個(gè)易于遍歷讀取的數(shù)據(jù)集合中,索引是對(duì)數(shù)據(jù)庫表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu)。

5.MapReduce 支持復(fù)雜聚合

MongoDB中聚合(aggregate)主要用于處理數(shù)據(jù)(諸如統(tǒng)計(jì)平均值,求和等),并返回計(jì)算后的數(shù)據(jù)結(jié)果。有點(diǎn)類似sql語句中的 count(*)。

與關(guān)系型數(shù)據(jù)庫相比,MongoDB的缺點(diǎn):

mongodb不支持事務(wù)操作:

所以事務(wù)要求嚴(yán)格的系統(tǒng)(如果銀行系統(tǒng))肯定不能用它。

mongodb不支持事務(wù)操作:

所以事務(wù)要求嚴(yán)格的系統(tǒng)(如果銀行系統(tǒng))肯定不能用它。

mongodb占用空間過大:

關(guān)于其原因,在官方的FAQ中,提到有如下幾個(gè)方面:

1、空間的預(yù)分配:為避免形成過多的硬盤碎片,mongodb每次空間不足時(shí)都會(huì)申請(qǐng)生成一大塊的硬盤空間,而且申請(qǐng)的量從64M、128M、256M那 樣的指數(shù)遞增,直到2G為單個(gè)文件的最大體積。隨著數(shù)據(jù)量的增加,你可以在其數(shù)據(jù)目錄里看到這些整塊生成容量不斷遞增的文件。

2、字段名所占用的空間:為了保持每個(gè)記錄內(nèi)的結(jié)構(gòu)信息用于查詢,mongodb需要把每個(gè)字段的key-value都以BSON的形式存儲(chǔ),如果 value域相對(duì)于key域并不大,比如存放數(shù)值型的數(shù)據(jù),則數(shù)據(jù)的overhead是最大的。一種減少空間占用的方法是把字段名盡量取短一些,這樣占用 空間就小了,但這就要求在易讀性與空間占用上作為權(quán)衡了。

3、刪除記錄不釋放空間:這很容易理解,為避免記錄刪除后的數(shù)據(jù)的大規(guī)模挪動(dòng),原記錄空間不刪除,只標(biāo)記“已刪除”即可,以后還可以重復(fù)利用。

4、可以定期運(yùn)行db.repairDatabase()來整理記錄,但這個(gè)過程會(huì)比較緩慢

MongoDB沒有如MySQL那樣成熟的維護(hù)工具,這對(duì)于開發(fā)和IT運(yùn)營都是個(gè)值得注意的地方。

4、環(huán)境需要

64位操作系統(tǒng),建議使用Linux / Unix /

CentOs 7.3

MongoDB 3.6.2

5、環(huán)境安裝

請(qǐng)參考我的另一篇文章

搭建 MongoDB分片(sharding) / 分區(qū) / 集群環(huán)境

http://www.ymq.io/2018/01/30/MongoDB-3

6、新加項(xiàng)目

新建一個(gè) maven 項(xiàng)目,這里就不詳細(xì)操作了,大家都會(huì)的

不過也可以下載我的示例源碼,下載地址如下

GitHub:https://github.com/souyunku/spring-boot-examples/tree/master/spring-boot-mongodb

碼云:https://gitee.com/souyunku/spring-boot-examples/tree/master/spring-boot-mongodb

MongoDB是一個(gè)開源NoSQL文檔數(shù)據(jù)庫,它使用類似JSON的模式而不是傳統(tǒng)的基于表格的關(guān)系數(shù)據(jù)。Spring Boot為MongoDB提供了一些便利,包括 spring-boot-starter-data-mongodb “Starter”。

7、添加依賴

在POM 中添加如下依賴


    org.springframework.boot
    spring-boot-starter-data-mongodb
8、配置文件

在配置文件 application.properties 添加如下配置

spring.application.name=spring-boot-mongodb
# mongodb
spring.data.mongodb.uri=mongodb://192.168.252.121:20000,192.168.252.122:20000,192.168.252.12:20000/demo

多個(gè)IP集群的配置:

spring.data.mongodb.uri=mongodb://user:secret@mongo1.example.com:12345,mongo2.example.com:23456/test
9、DemoEntity

spring-data-mongodb中的實(shí)體映射是通過MongoMappingConverter這個(gè)類實(shí)現(xiàn)的。它可以通過注釋把java類轉(zhuǎn)換為mongodb的文檔。

它有以下幾種注釋:

@Id - 文檔的唯一標(biāo)識(shí),在mongodb中為ObjectId,它是唯一的,通過時(shí)間戳+機(jī)器標(biāo)識(shí)+進(jìn)程ID+自增計(jì)數(shù)器(確保同一秒內(nèi)產(chǎn)生的Id不會(huì)沖突)構(gòu)成。

@Document - 把一個(gè)java類聲明為mongodb的文檔,可以通過collection參數(shù)指定這個(gè)類對(duì)應(yīng)的文檔。@Document(collection="mongodb") mongodb對(duì)應(yīng)表

@DBRef - 聲明類似于關(guān)系數(shù)據(jù)庫的關(guān)聯(lián)關(guān)系。ps:暫不支持級(jí)聯(lián)的保存功能,當(dāng)你在本實(shí)例中修改了DERef對(duì)象里面的值時(shí),多帶帶保存本實(shí)例并不能保存DERef引用的對(duì)象,它要另外保存,如下面例子的Person和Account。

@Indexed - 聲明該字段需要索引,建索引可以大大的提高查詢效率。

@CompoundIndex - 復(fù)合索引的聲明,建復(fù)合索引可以有效地提高多字段的查詢效率。

@GeoSpatialIndexed - 聲明該字段為地理信息的索引。

@Transient - 映射忽略的字段,該字段不會(huì)保存到mongodb。

@PersistenceConstructor - 聲明構(gòu)造函數(shù),作用是把從數(shù)據(jù)庫取出的數(shù)據(jù)實(shí)例化為對(duì)象。該構(gòu)造函數(shù)傳入的值為從DBObject中取出的數(shù)據(jù)

package io.ymq.example.mongodb;

@Document(collection = "demo_collection")
public class DemoEntity implements Serializable {

    @Id
    private Long id;

    private String title;

    private String description;

    private String by;

    private String url;
    
    省略 getter setter
}
10、Demo DAO 接口

提供增刪改查 MongoDB 接口

package io.ymq.example.mongodb;

public interface DemoDao {

    void saveDemo(DemoEntity demoEntity);

    void removeDemo(Long id);

    void updateDemo(DemoEntity demoEntity);

    DemoEntity findDemoById(Long id);
}
11、Demo DAO 實(shí)現(xiàn)

提供增刪改查 MongoDB 接口實(shí)現(xiàn)

Spring Data Mongo提供了一個(gè) MongoTemplate類似于Spring的設(shè)計(jì)的類JdbcTemplate。和JdbcTemplateSpring Boot一樣,自動(dòng)配置一個(gè)bean來簡(jiǎn)單地注入:

package io.ymq.example.mongodb;

/**
 * 描述: Demo DAO 實(shí)現(xiàn)
 *
 * @author yanpenglei
 * @create 2018-02-03 16:57
 **/
@Component
public class DemoDaoImpl implements DemoDao {

    @Resource
    private MongoTemplate mongoTemplate;

    @Override
    public void saveDemo(DemoEntity demoEntity) {
        mongoTemplate.save(demoEntity);
    }

    @Override
    public void removeDemo(Long id) {
        mongoTemplate.remove(id);
    }

    @Override
    public void updateDemo(DemoEntity demoEntity) {
        Query query = new Query(Criteria.where("id").is(demoEntity.getId()));

        Update update = new Update();
        update.set("title", demoEntity.getTitle());
        update.set("description", demoEntity.getDescription());
        update.set("by", demoEntity.getBy());
        update.set("url", demoEntity.getUrl());

        mongoTemplate.updateFirst(query, update, DemoEntity.class);
    }

    @Override
    public DemoEntity findDemoById(Long id) {
        Query query = new Query(Criteria.where("id").is(id));
        DemoEntity demoEntity = mongoTemplate.findOne(query, DemoEntity.class);
        return demoEntity;
    }

}
12、啟動(dòng)服務(wù)

運(yùn)行啟動(dòng)類

package io.ymq.example.mongodb;

@SpringBootApplication
public class SpringBootMongodbApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootMongodbApplication.class, args);
    }
}
13、單元測(cè)試

單元測(cè)試,提供mongodbdemo 庫的 demo_collection 集合的增刪改查

package io.ymq.example.mongodb;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringBootMongodbApplication.class)
public class SpringBootMongodbApplicationTests {

    @Autowired
    private DemoDao demoDao;

    @Test
    public void saveDemoTest() {

        DemoEntity demoEntity = new DemoEntity();
        demoEntity.setId(1L);
        demoEntity.setTitle("Spring Boot 中使用 MongoDB");
        demoEntity.setDescription("關(guān)注公眾號(hào),搜云庫,專注于開發(fā)技術(shù)的研究與知識(shí)分享");
        demoEntity.setBy("souyunku");
        demoEntity.setUrl("http://www.souyunku.com");

        demoDao.saveDemo(demoEntity);

        demoEntity = new DemoEntity();
        demoEntity.setId(2L);
        demoEntity.setTitle("Spring Boot 中使用 MongoDB");
        demoEntity.setDescription("關(guān)注公眾號(hào),搜云庫,專注于開發(fā)技術(shù)的研究與知識(shí)分享");
        demoEntity.setBy("souyunku");
        demoEntity.setUrl("http://www.souyunku.com");

        demoDao.saveDemo(demoEntity);
    }

    @Test
    public void removeDemoTest() {
        demoDao.removeDemo(2L);
    }

    @Test
    public void updateDemoTest() {

        DemoEntity demoEntity = new DemoEntity();
        demoEntity.setId(1L);
        demoEntity.setTitle("Spring Boot 中使用 MongoDB 更新數(shù)據(jù)");
        demoEntity.setDescription("關(guān)注公眾號(hào),搜云庫,專注于開發(fā)技術(shù)的研究與知識(shí)分享");
        demoEntity.setBy("souyunku");
        demoEntity.setUrl("http://www.souyunku.com");

        demoDao.updateDemo(demoEntity);
    }

    @Test
    public void findDemoByIdTest() {

        DemoEntity demoEntity = demoDao.findDemoById(1L);

        System.out.println(JSONObject.toJSONString(demoEntity));
    }
}

擴(kuò)展閱讀

手把手教你 MongoDB 的安裝與詳細(xì)使用(一)

http://www.ymq.io/2018/01/26/MongoDB-1/

手把手教你 MongoDB 的安裝與詳細(xì)使用(二)

http://www.ymq.io/2018/01/29/MongoDB-2/

源碼下載

GitHub:https://github.com/souyunku/spring-boot-examples/tree/master/spring-boot-mongodb

碼云:https://gitee.com/souyunku/spring-boot-examples/tree/master/spring-boot-mongodb

福利

Spring Boot 學(xué)習(xí)教程 會(huì)不定時(shí)更新技術(shù), 歡迎 Star 和 Fork。

https://github.com/souyunku/spring-boot-examples

https://github.com/souyunku/spring-boot-examples

參考:https://docs.spring.io/spring-boot/docs/1.5.1.RELEASE/reference/html/boot-features-nosql.html#boot-features-mongodb

Contact

作者:鵬磊

出處:http://www.ymq.io/2018/02/05/spring-boot-mongodb-example

Email:admin@souyunku.com

版權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)注明出處

Wechat:關(guān)注公眾號(hào),搜云庫,專注于開發(fā)技術(shù)的研究與知識(shí)分享

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/19190.html

相關(guān)文章

  • springboot_database項(xiàng)目介紹

    摘要:操作操作對(duì)象設(shè)置緩存時(shí)間有效時(shí)間等待等待設(shè)置為的時(shí)候后面可能取到值,的過期時(shí)間有延遲注意操作對(duì)象時(shí)對(duì)象需要實(shí)現(xiàn)序列化接口兩者操作互不影響生成為生稱為數(shù)據(jù)庫文件相關(guān)相關(guān)相關(guān)相關(guān)相關(guān)相關(guān)相關(guān)相關(guān)相關(guān)相關(guān)相關(guān)相關(guān) springboot_database springboot1.5.7集成mybatis、jpa、redis、mongodb,對(duì)不同數(shù)據(jù)庫進(jìn)行操作的實(shí)例項(xiàng)目代碼獲取:https:/...

    tracymac7 評(píng)論0 收藏0
  • 搭建簡(jiǎn)單的dubbo案例,并實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的刪改

    摘要:創(chuàng)建父工程文件如下這里只添加幾個(gè)最簡(jiǎn)單的依賴啟動(dòng)父依賴依賴依賴依賴創(chuàng)建子工程 1.創(chuàng)建父工程 showImg(https://segmentfault.com/img/bVbgtl4?w=387&h=255); pom文件如下(這里只添加幾個(gè)最簡(jiǎn)單的依賴) 4.0.0 wyb springbootDubbo pom 1.0-SNAPSHOT...

    MageekChiu 評(píng)論0 收藏0
  • 墻裂推薦:搜云庫技術(shù)團(tuán)隊(duì),面試必備的技術(shù)干貨

    摘要:今天整理了一下近大半年以來的一些文章,和我的預(yù)期一樣,很多文章我都忘記自己曾經(jīng)寫過了,這個(gè)記錄的過程讓我也有了新的理解。希望大家,收藏,點(diǎn)贊,加轉(zhuǎn)發(fā)。 今天整理了一下近大半年以來的一些文章,和我的預(yù)期一樣,很多文章我都忘記自己曾經(jīng)寫過了,這個(gè)記錄的過程讓我也有了新的理解。希望大家,收藏,點(diǎn)贊,加轉(zhuǎn)發(fā)。 面試必備 面試必備:深入Spring MVC DispatchServlet 源碼...

    SegmentFault 評(píng)論0 收藏0
  • 墻裂推薦:搜云庫技術(shù)團(tuán)隊(duì),面試必備的技術(shù)干貨

    摘要:今天整理了一下近大半年以來的一些文章,和我的預(yù)期一樣,很多文章我都忘記自己曾經(jīng)寫過了,這個(gè)記錄的過程讓我也有了新的理解。希望大家,收藏,點(diǎn)贊,加轉(zhuǎn)發(fā)。 今天整理了一下近大半年以來的一些文章,和我的預(yù)期一樣,很多文章我都忘記自己曾經(jīng)寫過了,這個(gè)記錄的過程讓我也有了新的理解。希望大家,收藏,點(diǎn)贊,加轉(zhuǎn)發(fā)。 面試必備 面試必備:深入Spring MVC DispatchServlet 源碼...

    Neilyo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<