• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Spring Mongodb—MongoTemplate和展示代码

武飞扬头像
Doker 多克 数码品牌
帮助1

Doker官网:Doker 多克

一、概述

MongoTemplate类位于org.springframework.data.mongodb.core包中,是Spring mongodb支持的中心类,为与数据库交互提供了丰富的功能集。该模板提供了创建、更新、删除和查询MongoDB文档的方便操作,并提供了域对象和MongoDB文档之间的映射。

MongoDB文档和域类之间的映射是通过委托给MongoConverter接口的实现来完成的。Spring提供了MappingMongoConverter,但您也可以编写自己的转换器。有关更多详细信息,请参阅“自定义转换-覆盖默认映射”。

MongoTemplate类实现了MongoOperations接口。在尽可能多的情况下,MongoOperations上的方法以MongoDB驱动程序Collection对象上可用的方法命名,以使习惯于驱动程序API的现有MongoDB开发人员熟悉该API。例如,您可以找到find、findAndModify、findAndReplace、findOne、insert、remove、save、update和updateMulti等方法。设计目标是尽可能容易地在基本MongoDB驱动程序和MongoOperations的使用之间进行转换。这两个API之间的一个主要区别是,MongoOperations可以传递域对象,而不是Document。此外,MongoOperations为查询、标准和更新操作提供了流畅的API,而不是填充文档来指定这些操作的参数。

MongoTemplate使用的默认转换器实现是MappingMongoConverter。虽然MappingMongoConverter可以使用额外的元数据来指定对象到文档的映射,但它也可以通过使用一些映射ID和集合名称的约定来转换不包含额外元数据的对象。“映射”一章对这些约定以及映射注释的使用进行了解释。

MongoTemplate的另一个核心功能是将MongoDB Java驱动程序抛出的异常转换为Spring的可移植数据访问异常层次结构。有关更多信息,请参阅“异常翻译”。

MongoTemplate提供了许多方便的方法来帮助您轻松执行常见任务。但是,如果您需要直接访问MongoDB驱动程序API,可以使用几种Execute回调方法之一。execute回调为您提供了对com.mongodb.client.MongoCollection或com.mongoodb.client.mongodb对象的引用。有关更多信息,请参阅“执行回调”部分。

下一节包含如何在Spring容器的上下文中使用MongoTemplate的示例。

二、实例化MongoTemplate

在pom.xml文件的 dependencies 元素中加入以下内容。

  1.  
    <dependencies>
  2.  
     
  3.  
    <!-- other dependency elements omitted -->
  4.  
     
  5.  
    <dependency>
  6.  
    <groupId>org.springframework.data</groupId>
  7.  
    <artifactId>spring-data-mongodb</artifactId>
  8.  
    <version>4.1.0-SNAPSHOT</version>
  9.  
    </dependency>
  10.  
     
  11.  
    </dependencies>

您可以使用以下配置来创建和注册MongoTemplate的实例,如下例所示:

  1.  
    @Configuration
  2.  
    class AppConfig {
  3.  
     
  4.  
    @Bean
  5.  
    MongoClient mongoClient() {
  6.  
    return MongoClients.create("mongodb://localhost:27017");
  7.  
    }
  8.  
     
  9.  
    @Bean
  10.  
    MongoTemplate mongoTemplate(MongoClient mongoClient) {
  11.  
    return new MongoTemplate(mongoClient, "geospatial");
  12.  
    }
  13.  
    }
  14.  
     

MongoTemplate有几个重载的构造函数:

  • MongoTemplate(MongoClient-mongo,String-databaseName):使用MongoClient对象和默认的数据库名称进行操作。

  • MongoTemplate(MongoDatabaseFactory mongoDbFactory):采用一个MongoDB Factory对象,该对象封装了MongoClient对象、数据库名称以及用户名和密码。

  • MongoTemplate(MongoDB数据库工厂mongoDbFactory,MongoConverter MongoConverter):添加一个MongoConver用于映射。

创建MongoTemplate时可能要设置的其他可选财产是默认的WriteResultCheckingPolicy、WriteConcern和ReadPreference财产。

三、写入结果检查策略

如果尚未通过更高级别的驱动程序(如com.mongodb.client.MongoClient)指定,则可以设置MongoTemplate用于写入操作的com.mongoodb.WriteCancern属性。如果未设置WriteConcern属性,则默认为MongoDB驱动程序的DB或Collection设置中设置的属性。

四、WriteConcern

如果尚未通过更高级别的驱动程序(如com.mongodb.client.MongoClient)指定,则可以设置MongoTemplate用于写入操作的com.mongoodb.WriteCancern属性。如果未设置WriteConcern属性,则默认为MongoDB驱动程序的DB或Collection设置中设置的属性。

五、WriteConcernResolver

对于更高级的情况,如果您希望在每个操作的基础上设置不同的WriteConcern值(用于删除、更新、插入和保存操作),可以在MongoTemplate上配置一个名为WriteConcernResolver的策略接口。由于MongoTemplate用于持久化POJO,因此WriteConcernResolver允许您创建一个策略,该策略可以将特定的POJO类映射到WriteConcern值。以下列表显示了WriteConcernResolver接口:

  1.  
    public interface WriteConcernResolver {
  2.  
    WriteConcern resolve(MongoAction action);
  3.  
    }

您可以使用MongoAction参数来确定WriteConcern值,也可以使用Template本身的值作为默认值。MongoAction包含要写入的集合名称、POJO的java.lang.Class、转换后的Document、操作(REMOVE、UPDATE、INSERT、INSERT_LIST或SAVE)以及其他一些上下文信息。以下示例显示了两组获得不同WriteConcern设置的类:

  1.  
    private class MyAppWriteConcernResolver implements WriteConcernResolver {
  2.  
     
  3.  
    public WriteConcern resolve(MongoAction action) {
  4.  
    if (action.getEntityClass().getSimpleName().contains("Audit")) {
  5.  
    return WriteConcern.NONE;
  6.  
    } else if (action.getEntityClass().getSimpleName().contains("Metadata")) {
  7.  
    return WriteConcern.JOURNAL_SAFE;
  8.  
    }
  9.  
    return action.getDefaultWriteConcern();
  10.  
    }
  11.  
    }

六、保存、更新和删除文档

MongoTemplate允许您保存、更新和删除域对象,并将这些对象映射到存储在 MongoDB 中的文档。

考虑下面的示例:

  1.  
    public class Person {
  2.  
     
  3.  
    private String id;
  4.  
    private String name;
  5.  
    private int age;
  6.  
     
  7.  
    public Person(String name, int age) {
  8.  
    this.name = name;
  9.  
    this.age = age;
  10.  
    }
  11.  
     
  12.  
    public String getId() {
  13.  
    return id;
  14.  
    }
  15.  
    public String getName() {
  16.  
    return name;
  17.  
    }
  18.  
    public int getAge() {
  19.  
    return age;
  20.  
    }
  21.  
     
  22.  
    @Override
  23.  
    public String toString() {
  24.  
    return "Person [id=" id ", name=" name ", age=" age "]";
  25.  
    }
  26.  
     
  27.  
    }

给定上例中的Person类,您可以保存、更新和删除对象,如下例所示:

  1.  
    package org.spring.example;
  2.  
     
  3.  
    import static org.springframework.data.mongodb.core.query.Criteria.where;
  4.  
    import static org.springframework.data.mongodb.core.query.Update.update;
  5.  
    import static org.springframework.data.mongodb.core.query.Query.query;
  6.  
     
  7.  
    import java.util.List;
  8.  
     
  9.  
    import org.apache.commons.logging.Log;
  10.  
    import org.apache.commons.logging.LogFactory;
  11.  
    import org.springframework.data.mongodb.core.MongoOperations;
  12.  
    import org.springframework.data.mongodb.core.MongoTemplate;
  13.  
    import org.springframework.data.mongodb.core.SimpleMongoClientDbFactory;
  14.  
     
  15.  
    import com.mongodb.client.MongoClients;
  16.  
     
  17.  
    public class MongoApp {
  18.  
     
  19.  
    private static final Log log = LogFactory.getLog(MongoApp.class);
  20.  
     
  21.  
    public static void main(String[] args) {
  22.  
     
  23.  
    MongoOperations mongoOps = new MongoTemplate(new SimpleMongoClientDbFactory(MongoClients.create(), "database"));
  24.  
     
  25.  
    Person p = new Person("Joe", 34);
  26.  
     
  27.  
    // Insert is used to initially store the object into the database.
  28.  
    mongoOps.insert(p);
  29.  
    log.info("Insert: " p);
  30.  
     
  31.  
    // Find
  32.  
    p = mongoOps.findById(p.getId(), Person.class);
  33.  
    log.info("Found: " p);
  34.  
     
  35.  
    // Update
  36.  
    mongoOps.updateFirst(query(where("name").is("Joe")), update("age", 35), Person.class);
  37.  
    p = mongoOps.findOne(query(where("name").is("Joe")), Person.class);
  38.  
    log.info("Updated: " p);
  39.  
     
  40.  
    // Delete
  41.  
    mongoOps.remove(p);
  42.  
     
  43.  
    // Check that deletion worked
  44.  
    List<Person> people = mongoOps.findAll(Person.class);
  45.  
    log.info("Number of people = : " people.size());
  46.  
     
  47.  
     
  48.  
    mongoOps.dropCollection(Person.class);
  49.  
    }
  50.  
    }

前面的示例将生成以下日志输出(包括来自MongoTemplate的调试消息):

  1.  
    DEBUG apping.MongoPersistentEntityIndexCreator: 80 - Analyzing class class org.spring.example.Person for index information.
  2.  
    DEBUG work.data.mongodb.core.MongoTemplate: 632 - insert Document containing fields: [_class, age, name] in collection: person
  3.  
    INFO org.spring.example.MongoApp: 30 - Insert: Person [id=4ddc6e784ce5b1eba3ceaf5c, name=Joe, age=34]
  4.  
    DEBUG work.data.mongodb.core.MongoTemplate:1246 - findOne using query: { "_id" : { "$oid" : "4ddc6e784ce5b1eba3ceaf5c"}} in db.collection: database.person
  5.  
    INFO org.spring.example.MongoApp: 34 - Found: Person [id=4ddc6e784ce5b1eba3ceaf5c, name=Joe, age=34]
  6.  
    DEBUG work.data.mongodb.core.MongoTemplate: 778 - calling update using query: { "name" : "Joe"} and update: { "$set" : { "age" : 35}} in collection: person
  7.  
    DEBUG work.data.mongodb.core.MongoTemplate:1246 - findOne using query: { "name" : "Joe"} in db.collection: database.person
  8.  
    INFO org.spring.example.MongoApp: 39 - Updated: Person [id=4ddc6e784ce5b1eba3ceaf5c, name=Joe, age=35]
  9.  
    DEBUG work.data.mongodb.core.MongoTemplate: 823 - remove using query: { "id" : "4ddc6e784ce5b1eba3ceaf5c"} in collection: person
  10.  
    INFO org.spring.example.MongoApp: 46 - Number of people = : 0
  11.  
    DEBUG work.data.mongodb.core.MongoTemplate: 376 - Dropped collection [database.person]

MongoConverter通过识别(通过约定)Id属性名称,导致存储在数据库中的String和ObjectId之间的隐式转换。

前面示例中使用的查询语法在“查询文档”一节中有更详细的解释。

大家好,我是Doker品牌的Sinbad,欢迎点赞和评论,您的鼓励是我们持续更新的动力!欢迎加微信进入技术群聊!

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgkfgfg
系列文章
更多 icon
同类精品
更多 icon
继续加载