吉祥小樱 發表於 2023-7-16 15:37:00

Spring Data MongoDB 使用

<p>本文为博主原创,转载请注明出处:</p>
<p><strong>  </strong>Spring Data MongoDB 是 Spring Data 系列的一部分,它提供了与 MongoDB 的集成和操作支持,类似于 JPA 对关系型数据库的支持。通过使用 Spring Data MongoDB,您可以使用类似于 JPA 的 Repository 接口、自动映射功能以及其他便利特性来访问和操作 MongoDB 数据库。</p>
<h1>1.Spring Data MongoDB接入</h1>
<h2>1.1添加依赖:</h2>
<p>  在项目的构建文件(如 Maven 的 pom.xml 或 Gradle 的 build.gradle)中添加 Spring Data MongoDB 的依赖项。例如,在 Maven 中添加以下依赖项:</p>
<div class="cnblogs_code">
<pre>&lt;dependencies&gt;
&lt;!-- 其他依赖 --&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
    &lt;artifactId&gt;spring-boot-starter-data-mongodb&lt;/artifactId&gt;
&lt;/dependency&gt;
&lt;/dependencies&gt;</pre>
</div>
<h2>1.2 创建实体类:</h2>
<p>  使用 MongoDB 的注解来定义实体类,并将其映射到 MongoDB 的集合(collection)。注解包括&nbsp;<code>@Document</code>、<code>@Field</code>、<code>@Id</code>&nbsp;等。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.mapping.Document;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.annotation.Id;

@Document(collection </span>= "users"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> User {

@Id
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String id;

@Field(</span>"name"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String name;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> getter and setter methods</span>
}</pre>
</div>
<h2>1.3创建 Repository 接口:</h2>
<p>  创建一个继承自&nbsp;<code>MongoRepository</code>(或其他 Spring Data MongoDB 提供的 Repository 接口)的接口,用于访问和操作实体类对应的 MongoDB 数据</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.repository.MongoRepository;

</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">interface</span> UserRepository <span style="color: rgba(0, 0, 255, 1)">extends</span> MongoRepository&lt;User, String&gt;<span style="color: rgba(0, 0, 0, 1)"> {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 可根据需要添加自定义查询方法</span>
}</pre>
</div>
<h2>1.4配置 MongoDB 连接信息:</h2>
<p>  在 Spring Boot 的配置文件中,配置 MongoDB 的连接信息,例如数据库名称、主机地址、端口等。</p>
<div class="cnblogs_code">
<pre>spring.data.mongodb.host=<span style="color: rgba(0, 0, 0, 1)">localhost
spring.data.mongodb.port</span>=27017<span style="color: rgba(0, 0, 0, 1)">
spring.data.mongodb.database</span>=mydatabase</pre>
</div>
<ol start="5">
<li>使用 Repository 进行操作:在需要使用 MongoDB 操作的地方,通过注入 Repository 接口对象来调用相应的方法。</li>
</ol>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.beans.factory.annotation.Autowired;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.stereotype.Service;

@Service
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> UserService {

</span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">final</span><span style="color: rgba(0, 0, 0, 1)"> UserRepository userRepository;

@Autowired
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> UserService(UserRepository userRepository) {
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.userRepository =<span style="color: rgba(0, 0, 0, 1)"> userRepository;
}

</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> User saveUser(User user) {
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> userRepository.save(user);
}

</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> User getUserById(String id) {
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> userRepository.findById(id).orElse(<span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">);
}

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 其他操作方法</span>
}</pre>
</div>
<p>  上述示例是一个简单的使用 JPA 和 MongoDB 的流程。它包括创建实体类、定义 Repository 接口、配置 MongoDB 的连接信息和使用 Repository 进行操作。这样可以使用 Spring Data MongoDB 结合 JPA 和 MongoDB 进行开发,并享受到 Spring Data 提供的便利特性。</p>
<h1>2.Spring<strong> Data MongoDB 自定义方法解析使用</strong></h1>
<p>  在 <code>UserRepository</code> 中定义使用的方法非常简单。Spring Data MongoDB 提供了一套命名规则,它根据方法名自动解析和生成查询语句。您可以按照规则给方法命名,而不需要编写具体的查询语句。</p>
<p>  以下是一些常见的方法命名规则及其解析方式:</p>
<ul>
<li>
<p>根据属性查询:</p>
<ul>
<li><code>findBy&lt;PropertyName&gt;</code>:根据属性名称进行查询,例如&nbsp;<code>findByName(String name)</code>。</li>
<li><code>findBy&lt;PropertyName&gt;And&lt;OtherProperty&gt;</code>:根据多个属性进行查询,并通过 "And" 连接,例如&nbsp;<code>findByNameAndAge(String name, int age)</code>。</li>
</ul>
</li>
<li>
<p>按条件查询:</p>
<ul>
<li><code>findBy&lt;PropertyName&gt;Equals</code>:根据属性的精确匹配进行查询,例如&nbsp;<code>findByNameEquals(String name)</code>。</li>
<li><code>findBy&lt;PropertyName&gt;In</code>:根据属性值在给定集合中的条件进行查询,例如&nbsp;<code>findByAgeIn(Collection&lt;Integer&gt; ages)</code>。</li>
</ul>
</li>
<li>
<p>模糊查询:</p>
<ul>
<li><code>findBy&lt;PropertyName&gt;Like</code>:根据属性值进行模糊查询,例如&nbsp;<code>findByNameLike(String keyword)</code>。</li>
</ul>
</li>
</ul>
<p>  除了以上示例,还有更多可用的方法命名规则,可以根据具体需求查阅 Spring Data MongoDB 文档以获得更全面的了解。</p>
<p>  注意事项:</p>
<ul>
<li><strong>方法名称必须遵循命名规则,否则可能会导致查询失败。</strong></li>
<li><strong>方法参数的数量和类型必须与属性的类型和数量匹配。</strong></li>
<li><strong>在使用一些特殊操作时,如模糊查询、集合查询等,可以使用&nbsp;<code>Like</code>、<code>In</code>&nbsp;等关键字来指定更复杂的条件。</strong></li>
</ul>
<p>  以下是一个简单的示例:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.repository.MongoRepository;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.util.List;

</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">interface</span> UserRepository <span style="color: rgba(0, 0, 255, 1)">extends</span> MongoRepository&lt;User, String&gt;<span style="color: rgba(0, 0, 0, 1)"> {
    List</span>&lt;User&gt;<span style="color: rgba(0, 0, 0, 1)"> findByName(String name);
    List</span>&lt;User&gt; findByAgeGreaterThan(<span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> age);
    List</span>&lt;User&gt;<span style="color: rgba(0, 0, 0, 1)"> findByEmailNotNull();
    List</span>&lt;User&gt; findByAgeIn(List&lt;Integer&gt;<span style="color: rgba(0, 0, 0, 1)"> ages);
    List</span>&lt;User&gt;<span style="color: rgba(0, 0, 0, 1)"> findByNameLike(String keyword);
}</span></pre>
</div>
<p>  在上述示例中,<code>UserRepository</code> 定义了五个查询方法:根据名称查询用户、根据年龄大于给定值查询用户、查询邮箱不为 null 的用户、根据年龄在给定集合中查询用户以及根据名称进行模糊查询。这些方法会根据方法名自动解析为相应的查询条件,并返回符合条件的用户列表。</p>
<p>  请注意,在实际使用过程中,可能需要处理一些特定的查询场景或复杂的条件,可能需要编写自定义的查询语句。Spring Data MongoDB 提供了注解和其他方式来支持自定义查询,以满足更复杂的需求。</p>
<h1>3.自定义查询语句</h1>
<p>  在 Spring Data MongoDB 中,可以使用自定义的查询语句来满足特定的查询需求。以下是两种常用的方式来实现自定义查询:</p>
<h2>3.1使用&nbsp;<code>@Query</code>&nbsp;注解:</h2>
<ol>
<li>在需要进行自定义查询的方法上添加&nbsp;<code>@Query</code>&nbsp;注解,并提供相应的查询语句。</li>
<li>在查询语句中使用命名参数(例如&nbsp;<code>:paramName</code>)来引用方法参数。</li>
<li>如果有多个参数,可以通过索引位置(例如&nbsp;<code>?0</code>、<code>?1</code>)引用它们。</li>
</ol>
<p>  示例:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.repository.MongoRepository;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.repository.Query;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.util.List;

</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">interface</span> UserRepository <span style="color: rgba(0, 0, 255, 1)">extends</span> MongoRepository&lt;User, String&gt;<span style="color: rgba(0, 0, 0, 1)"> {
    @Query(</span>"{ 'name' : ?0 }"<span style="color: rgba(0, 0, 0, 1)">)
    List</span>&lt;User&gt;<span style="color: rgba(0, 0, 0, 1)"> findByName(String name);

    @Query(</span>"{ 'age' : { $gt: ?0 }, 'email' : { $ne: null } }"<span style="color: rgba(0, 0, 0, 1)">)
    List</span>&lt;User&gt; findByAgeGreaterThanAndEmailNotNull(<span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> age);
}</span></pre>
</div>
<p>  在上述示例中,使用了 <code>@Query</code> 注解来自定义查询语句。通过 <code>?0</code> 引用了方法参数,并根据属性条件进行查询。</p>
<div>
<h2>3.2使用 Criteria API:</h2>
<ol start="2">
<li style="list-style-type: none">
<ul>
<li>创建一个&nbsp;<code>Criteria</code>&nbsp;对象,并使用其提供的方法来构建查询条件。</li>
<li>将&nbsp;<code>Criteria</code>&nbsp;对象传递给&nbsp;<code>MongoTemplate</code>&nbsp;的&nbsp;<code>find</code>&nbsp;方法进行查询。</li>
</ul>
</li>
</ol>
<p>  示例:</p>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.MongoTemplate;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.query.Criteria;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> org.springframework.data.mongodb.core.query.Query;
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> java.util.List;

</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> UserRepositoryImpl <span style="color: rgba(0, 0, 255, 1)">implements</span><span style="color: rgba(0, 0, 0, 1)"> UserRepositoryCustom {

    </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">final</span><span style="color: rgba(0, 0, 0, 1)"> MongoTemplate mongoTemplate;

    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> UserRepositoryImpl(MongoTemplate mongoTemplate) {
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.mongoTemplate =<span style="color: rgba(0, 0, 0, 1)"> mongoTemplate;
    }

    @Override
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> List&lt;User&gt; findByAgeGreaterThanAndEmailNotNull(<span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> age) {
      Criteria criteria </span>= Criteria.where("age").gt(age).and("email").ne(<span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">);
      Query query </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Query(criteria);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> mongoTemplate.find(query, User.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);
    }
}</span></pre>
</div>
<p>  在上述示例中,<code>UserRepositoryImpl</code> 实现了 <code>UserRepositoryCustom</code> 接口,并使用 <code>MongoTemplate</code> 和 Criteria API 来自定义查询方法。在 <code>findByAgeGreaterThanAndEmailNotNull</code> 方法中,创建了一个 <code>Criteria</code> 对象,并指定年龄大于给定值且邮箱不为空的条件,然后将其传递给 <code>Query</code> 对象并执行查询。</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/zjdxr-up/p/17557943.html
頁: [1]
查看完整版本: Spring Data MongoDB 使用