欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot集成MongoDB的實(shí)現(xiàn)

 更新時(shí)間:2025年01月06日 08:28:59   作者:rivercoder  
本文主要介紹了SpringBoot集成MongoDB的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1、MongoDB簡(jiǎn)介

MongoDB 是一個(gè)開(kāi)源的、高性能、無(wú)模式(schema-free)的文檔型數(shù)據(jù)庫(kù),它屬于 NoSQL 數(shù)據(jù)庫(kù)的一種。MongoDB 的設(shè)計(jì)初衷是為了簡(jiǎn)化開(kāi)發(fā)和方便擴(kuò)展,同時(shí)提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。

以下是 MongoDB 的一些關(guān)鍵特點(diǎn):

  • 面向文檔:MongoDB 中的數(shù)據(jù)以文檔的形式存儲(chǔ),這些文檔是鍵值對(duì)的集合,類(lèi)似于 JSON 對(duì)象但使用的是 BSON(Binary JSON)格式,這使得它可以存儲(chǔ)復(fù)雜的數(shù)據(jù)類(lèi)型。
  • 無(wú)模式(Schema-less):與關(guān)系型數(shù)據(jù)庫(kù)不同,MongoDB 不需要預(yù)先定義固定的表結(jié)構(gòu),每個(gè)文檔可以有不同的字段和數(shù)據(jù)類(lèi)型。
  • 高可用性和擴(kuò)展性:MongoDB 支持自動(dòng)分片(sharding),這有助于水平擴(kuò)展,能夠處理大量的數(shù)據(jù)和高并發(fā)訪問(wèn)。
  • 豐富的查詢語(yǔ)言:MongoDB 提供了強(qiáng)大的查詢能力,其語(yǔ)法接近于面向?qū)ο蟮牟樵冋Z(yǔ)言,支持復(fù)雜的查詢操作,包括排序、聚合等。
  • 索引支持:為了加快查詢速度,MongoDB 支持對(duì)字段創(chuàng)建索引,包括單字段索引、復(fù)合索引、地理空間索引等。
  • 復(fù)制和容錯(cuò):通過(guò)副本集(replica set),MongoDB 可以實(shí)現(xiàn)數(shù)據(jù)的冗余存儲(chǔ),提高系統(tǒng)的可靠性和容錯(cuò)能力。
  • 易于使用和集成:MongoDB 提供了多種編程語(yǔ)言的驅(qū)動(dòng)程序,方便開(kāi)發(fā)者進(jìn)行應(yīng)用開(kāi)發(fā),并且擁有圖形化管理工具如 Compass、Navicat、Studio 3T等來(lái)輔助數(shù)據(jù)庫(kù)管理和維護(hù)。
  • 社區(qū)和支持:作為一個(gè)廣泛使用的數(shù)據(jù)庫(kù)系統(tǒng),MongoDB 擁有一個(gè)活躍的社區(qū)和官方提供的商業(yè)支持服務(wù)。

MongoDB 被設(shè)計(jì)用來(lái)滿足現(xiàn)代應(yīng)用程序的需求,特別是那些需要處理大量非結(jié)構(gòu)化或半結(jié)構(gòu)化數(shù)據(jù)的應(yīng)用場(chǎng)景,比如內(nèi)容管理系統(tǒng)、實(shí)時(shí)分析、移動(dòng)應(yīng)用后端等。由于其靈活性和性能優(yōu)勢(shì),MongoDB 成為許多開(kāi)發(fā)者和企業(yè)的首選數(shù)據(jù)庫(kù)解決方案之一。

2、MongoDB安裝

Linux安裝
下載MongoDB Community Server
下載地址:https://www.mongodb.com/try/download/community

解壓后啟動(dòng)MongoDB Server

#創(chuàng)建dbpath和logpath
mkdir -p /mongodb/data /mongodb/log  
#進(jìn)入mongodb目錄,啟動(dòng)mongodb服務(wù)
bin/mongod --port=27017 --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log

3、SpringBoot集成MongoDB

3.1、環(huán)境準(zhǔn)備

1、引入依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

完整依賴如下:

 <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.3.RELEASE</version>
  </parent>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.9</version>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
    
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
    </dependency>

    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.68</version>
    </dependency>
  </dependencies>

2、配置

application.properties

# MongoDB
spring.data.mongodb.host = 127.0.0.1
spring.data.mongodb.port = 27017
spring.data.mongodb.database = test
spring.data.mongodb.auto-index-creation = true

# 或者直接使用uri方式
#spring.data.mongodb.uri=mongodb://user:password@127.0.0.1:27017/test?authSource=admin

# 打印mongoDB日志
logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
logging.level.org.mongodb.driver.connection=DEBUG

連接配置可參考文檔 https://www.mongodb.com/zh-cn/docs/manual/reference/connection-string/

3.2、文檔操作

1、新增實(shí)體

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Document(collection = "person") // 指定集合名稱
public class Person {
    @Id  // 映射文檔中的_id
    private Long id;
    private String name;
    private Integer age;
}

2、添加集合文檔

集合操作時(shí)注入MongoTemplate

@SpringBootTest(classes = MongoApplication.class)
@RunWith(SpringRunner.class)
public class InsertTests {
    
    @Resource
    private MongoTemplate mongoTemplate;

    @Test
    public void testInsert() {
        Person person = Person.builder().id(2L).name("river").age(18).build();
        mongoTemplate.insert(person);

        // 如果有就修改, 沒(méi)有就插入
        mongoTemplate.save(Person.builder().id(2L).name("zhangsan").age(28).build());

        // 批量寫(xiě)入
        List<Person> persons = new ArrayList<>();
        for (int i = 100; i <= 150; i++) {
            person = Person.builder().id(Long.valueOf(i)).name("lisi" + i).age(i).build();
            persons.add(person);
        }
        mongoTemplate.insertAll(persons);
    }
}

插入數(shù)據(jù)時(shí): insert插入的_id 不能有重復(fù),否則會(huì)報(bào) DuplicateKeyException 提示主鍵重復(fù); save對(duì)已存在的數(shù)據(jù)進(jìn)行更新;
批處理操作時(shí): insertAll可以一次性插入所有數(shù)據(jù),效率較高;save需遍歷所有數(shù)據(jù),一次插入或更新,效率較低。

3、查詢集合文檔

@Slf4j
@SpringBootTest(classes = MongoApplication.class)
@RunWith(SpringRunner.class)
public class QueryTests {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    public void find() {
        // 查詢集合中的全部文檔數(shù)據(jù)
        List<Person> personList = mongoTemplate.findAll(Person.class);
        log.info("查詢結(jié)果:{}", personList);

        // 查詢集合中指定的ID文檔數(shù)據(jù)
        Person byId = mongoTemplate.findById(1L, Person.class);
        log.info("查詢結(jié)果:{}", byId.toString());

        // 根據(jù)條件查詢符合條件的文檔數(shù)據(jù)并返回第一條數(shù)據(jù)
        Query query = new Query(Criteria.where("name").is("river"));
        Person result = mongoTemplate.findOne(query, Person.class);
        log.info("查詢結(jié)果:{}", result);

        // 根據(jù)條件查詢所有符合條件的文檔
        query = new Query(Criteria.where("age").gt(18));
        List<Person> list = mongoTemplate.find(query, Person.class);
        log.info("查詢結(jié)果:{}", list);

        // 創(chuàng)建查詢對(duì)象,然后將條件對(duì)象添加到其中
        Criteria criteria = Criteria.where("age").gt(18).lte(30);
        query = new Query(criteria);
        list = mongoTemplate.find(query, Person.class);
        log.info("查詢結(jié)果:{}", list);

        Criteria name = Criteria.where("name").is("zhangsan");
        Criteria age = Criteria.where("age").is(18);
        // 創(chuàng)建條件對(duì)象,將上面條件進(jìn)行 AND 關(guān)聯(lián)
        criteria = new Criteria().andOperator(name, age);
        query = new Query(criteria);
        list = mongoTemplate.find(query, Person.class);
        log.info("查詢結(jié)果:{}", list);

        // 從第5行開(kāi)始,查詢3條數(shù)據(jù)返回
        query = new Query(Criteria.where("age").is("20"))
                .with(Sort.by("id"))
                .limit(3).skip(5);
        list = mongoTemplate.find(query, Person.class);
        log.info("查詢結(jié)果:{}", list);
    }
}

Criteria是標(biāo)準(zhǔn)查詢的接口,可以引用靜態(tài)的Criteria.where的把多個(gè)條件組合在一起,就可以輕松地將多個(gè)方法查詢連接起來(lái),方便我們操作查詢語(yǔ)句。

4、更新集合文檔

@Slf4j
@SpringBootTest(classes = MongoApplication.class)
@RunWith(SpringRunner.class)
public class UpdateTests {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    public void update() {
        Person person = mongoTemplate.findById(1L, Person.class);
        person.setName("wangwu");
        mongoTemplate.save(person);

        Query query = new Query(Criteria.where("id").is(1L));
        // 修改內(nèi)容
        Update update = new Update().set("name", "lisi");
        UpdateResult updateResult = mongoTemplate.updateMulti(query, update, Person.class);
//        // 只更新滿足條件的第一條記錄
//        UpdateResult updateResult = mongoTemplate.updateFirst(query, update, Person.class);

        // 沒(méi)有符合條件的記錄則插入數(shù)據(jù)
//       //  update.setOnInsert("id",11);  // 指定_id
//        updateResult = mongoTemplate.upsert(query, update, Person.class);

        // 返回修改的記錄數(shù)
        log.info("updateResult: {}", updateResult.getModifiedCount());

    }
}

如果更新后的結(jié)果和更新前的結(jié)果是相同,返回0。
updateFirst() 只更新滿足條件的第一條記錄
updateMulti() 更新所有滿足條件的記錄
upsert() 沒(méi)有符合條件的記錄則插入數(shù)據(jù)

5、刪除集合文檔

@Slf4j
@SpringBootTest(classes = MongoApplication.class)
@RunWith(SpringRunner.class)
public class DeleteTests {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Test
    public void delete() {
        // 刪除id為1的記錄
        Query query = new Query(Criteria.where("id").is(1L));
        DeleteResult remove = mongoTemplate.remove(query, Person.class);
        log.info("刪除的條數(shù)為:{}", remove.getDeletedCount());

        // 刪除符合條件的單個(gè)文檔并返回刪除的文檔
        query = new Query(Criteria.where("id").is(2L));
        Person per = mongoTemplate.findAndRemove(query, Person.class);
        log.info("刪除的文檔: {}", per);
    }
}

3.3、去掉_class屬性

使用MongoTemplate寫(xiě)入文檔時(shí),會(huì)自動(dòng)將_class屬性添加到文檔中,一般不需要使用_class屬性,可以配置去掉_class屬性。

@Configuration
public class MongoConfig {

    @Bean("mongoTemplate")
    public MongoTemplate mongoTemplate(MongoDbFactory mongoDbFactory, MongoMappingContext mongoMappingContext) {
        DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory);
        MappingMongoConverter mappingMongoConverter = new MappingMongoConverter(dbRefResolver, mongoMappingContext);
        // 去掉_class字段
        mappingMongoConverter.setTypeMapper(new DefaultMongoTypeMapper(null));
        return new MongoTemplate(mongoDbFactory, mappingMongoConverter);
    }
}

到此這篇關(guān)于SpringBoot集成MongoDB的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot集成MongoDB內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

最新評(píng)論