Spring Data MongoDB 使用

2023-07-16 18:00:56

本文為博主原創,轉載請註明出處:

  Spring Data MongoDB 是 Spring Data 系列的一部分,它提供了與 MongoDB 的整合和操作支援,類似於 JPA 對關係型資料庫的支援。通過使用 Spring Data MongoDB,您可以使用類似於 JPA 的 Repository 介面、自動對映功能以及其他便利特性來存取和操作 MongoDB 資料庫。

1.Spring Data MongoDB接入

1.1新增依賴:

  在專案的構建檔案(如 Maven 的 pom.xml 或 Gradle 的 build.gradle)中新增 Spring Data MongoDB 的依賴項。例如,在 Maven 中新增以下依賴項:

<dependencies>
  <!-- 其他依賴 -->
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
  </dependency>
</dependencies>

1.2 建立實體類:

  使用 MongoDB 的註解來定義實體類,並將其對映到 MongoDB 的集合(collection)。註解包括 @Document@Field@Id 等。

import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.annotation.Id;

@Document(collection = "users")
public class User {

  @Id
  private String id;

  @Field("name")
  private String name;

  // getter and setter methods
}

1.3建立 Repository 介面:

  建立一個繼承自 MongoRepository(或其他 Spring Data MongoDB 提供的 Repository 介面)的介面,用於存取和操作實體類對應的 MongoDB 資料

import org.springframework.data.mongodb.repository.MongoRepository;

public interface UserRepository extends MongoRepository<User, String> {
    // 可根據需要新增自定義查詢方法
}

1.4設定 MongoDB 連線資訊:

  在 Spring Boot 的組態檔中,設定 MongoDB 的連線資訊,例如資料庫名稱、主機地址、埠等。

spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=mydatabase
  1. 使用 Repository 進行操作:在需要使用 MongoDB 操作的地方,通過注入 Repository 介面物件來呼叫相應的方法。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

  private final UserRepository userRepository;

  @Autowired
  public UserService(UserRepository userRepository) {
    this.userRepository = userRepository;
  }

  public User saveUser(User user) {
    return userRepository.save(user);
  }

  public User getUserById(String id) {
    return userRepository.findById(id).orElse(null);
  }

  // 其他操作方法
}

  上述範例是一個簡單的使用 JPA 和 MongoDB 的流程。它包括建立實體類、定義 Repository 介面、設定 MongoDB 的連線資訊和使用 Repository 進行操作。這樣可以使用 Spring Data MongoDB 結合 JPA 和 MongoDB 進行開發,並享受到 Spring Data 提供的便利特性。

2.Spring Data MongoDB 自定義方法解析使用

  在 UserRepository 中定義使用的方法非常簡單。Spring Data MongoDB 提供了一套命名規則,它根據方法名自動解析和生成查詢語句。您可以按照規則給方法命名,而不需要編寫具體的查詢語句。

  以下是一些常見的方法命名規則及其解析方式:

  • 根據屬性查詢:

    • findBy<PropertyName>:根據屬性名稱進行查詢,例如 findByName(String name)
    • findBy<PropertyName>And<OtherProperty>:根據多個屬性進行查詢,並通過 "And" 連線,例如 findByNameAndAge(String name, int age)
  • 按條件查詢:

    • findBy<PropertyName>Equals:根據屬性的精確匹配進行查詢,例如 findByNameEquals(String name)
    • findBy<PropertyName>In:根據屬性值在給定集合中的條件進行查詢,例如 findByAgeIn(Collection<Integer> ages)
  • 模糊查詢:

    • findBy<PropertyName>Like:根據屬性值進行模糊查詢,例如 findByNameLike(String keyword)

  除了以上範例,還有更多可用的方法命名規則,可以根據具體需求查閱 Spring Data MongoDB 檔案以獲得更全面的瞭解。

  注意事項:

  • 方法名稱必須遵循命名規則,否則可能會導致查詢失敗。
  • 方法引數的數量和型別必須與屬性的型別和數量匹配。
  • 在使用一些特殊操作時,如模糊查詢、集合查詢等,可以使用 LikeIn 等關鍵字來指定更復雜的條件。

  以下是一個簡單的範例:

import org.springframework.data.mongodb.repository.MongoRepository;
import java.util.List;

public interface UserRepository extends MongoRepository<User, String> {
    List<User> findByName(String name);
    List<User> findByAgeGreaterThan(int age);
    List<User> findByEmailNotNull();
    List<User> findByAgeIn(List<Integer> ages);
    List<User> findByNameLike(String keyword);
}

  在上述範例中,UserRepository 定義了五個查詢方法:根據名稱查詢使用者、根據年齡大於給定值查詢使用者、查詢郵箱不為 null 的使用者、根據年齡在給定集合中查詢使用者以及根據名稱進行模糊查詢。這些方法會根據方法名自動解析為相應的查詢條件,並返回符合條件的使用者列表。

  請注意,在實際使用過程中,可能需要處理一些特定的查詢場景或複雜的條件,可能需要編寫自定義的查詢語句。Spring Data MongoDB 提供了註解和其他方式來支援自定義查詢,以滿足更復雜的需求。

3.自定義查詢語句

  在 Spring Data MongoDB 中,可以使用自定義的查詢語句來滿足特定的查詢需求。以下是兩種常用的方式來實現自定義查詢:

3.1使用 @Query 註解:

  1. 在需要進行自定義查詢的方法上新增 @Query 註解,並提供相應的查詢語句。
  2. 在查詢語句中使用命名引數(例如 :paramName)來參照方法引數。
  3. 如果有多個引數,可以通過索引位置(例如 ?0?1)參照它們。

  範例:

import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;
import java.util.List;

public interface UserRepository extends MongoRepository<User, String> {
    @Query("{ 'name' : ?0 }")
    List<User> findByName(String name);

    @Query("{ 'age' : { $gt: ?0 }, 'email' : { $ne: null } }")
    List<User> findByAgeGreaterThanAndEmailNotNull(int age);
}

  在上述範例中,使用了 @Query 註解來自定義查詢語句。通過 ?0 參照了方法引數,並根據屬性條件進行查詢。

3.2使用 Criteria API:

    • 建立一個 Criteria 物件,並使用其提供的方法來構建查詢條件。
    • 將 Criteria 物件傳遞給 MongoTemplate 的 find 方法進行查詢。

  範例:

import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import java.util.List;

public class UserRepositoryImpl implements UserRepositoryCustom {

    private final MongoTemplate mongoTemplate;

    public UserRepositoryImpl(MongoTemplate mongoTemplate) {
        this.mongoTemplate = mongoTemplate;
    }

    @Override
    public List<User> findByAgeGreaterThanAndEmailNotNull(int age) {
        Criteria criteria = Criteria.where("age").gt(age).and("email").ne(null);
        Query query = new Query(criteria);
        return mongoTemplate.find(query, User.class);
    }
}

  在上述範例中,UserRepositoryImpl 實現了 UserRepositoryCustom 介面,並使用 MongoTemplate 和 Criteria API 來自定義查詢方法。在 findByAgeGreaterThanAndEmailNotNull 方法中,建立了一個 Criteria 物件,並指定年齡大於給定值且郵箱不為空的條件,然後將其傳遞給 Query 物件並執行查詢。