文档菜单
文档首页
/ / /
Java 同步驱动程序
/ /

文档数据格式:POJO

本页内容

  • 概述
  • 示例POJO
  • 配置驱动程序以使用POJO
  • 执行CRUD操作
  • 总结

在本指南中,您可以了解如何存储和检索由普通Java对象(POJO)建模的数据。POJO通常用于数据封装,即将业务逻辑与数据表示分离的实践。

提示

要了解更多关于POJO的信息,请参阅普通Java对象 维基百科文章。

本指南中的示例演示了以下任务

  • 配置驱动程序以序列化和反序列化POJO

  • 执行使用由POJO建模的数据的CRUD操作

本指南的各节使用以下示例POJO类,该类描述了花卉的特征

public class Flower {
private ObjectId id;
private String name;
private List<String> colors;
private Boolean isBlooming;
private Float height;
// public empty constructor needed for retrieving the POJO
public Flower() {
}
public Flower(String name, Boolean isBlooming, Float height, List<String> colors) {
this.name = name;
this.isBlooming = isBlooming;
this.height = height;
this.colors = colors;
}
public ObjectId getId() {
return id;
}
public void setId(ObjectId id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Boolean getIsBlooming() {
return isBlooming;
}
public void setIsBlooming(Boolean isBlooming) {
this.isBlooming = isBlooming;
}
public Float getHeight() {
return height;
}
public void setHeight(Float height) {
this.height = height;
}
public List<String> getColors() {
return colors;
}
public void setColors(List<String> colors) {
this.colors = colors;
}
@Override
public String toString() {
return "\nFlower {\n\tid: " + id + "\n\tname: " + name + "\n\tcolors: " + colors + "\n\tisBlooming: " + isBlooming + "\n\theight: " + height + "\n}";
}
}

当在MongoDB中定义POJO以存储和检索数据时,请遵循以下指南

  • POJO类不能实现接口或扩展框架中的类。

  • 包含您希望存储和检索数据的所有字段,并确保它们没有被标记为statictransient

  • 如果你在你的POJO中使用JavaBean命名约定定义公开的getter或setter方法,则驱动程序在序列化或反序列化数据时会调用它们。如果你省略了公开属性字段的getter或setter方法,则驱动程序会直接访问或分配它们。

要配置驱动程序以使用POJO,你必须指定以下组件

  • PojoCodecProvider实例,该实例具有编解码器,用于定义如何在POJO格式和BSON之间编码和解码数据。提供程序还指定编解码器应用于哪些POJO类或包。

  • CodecRegistry实例,其中包含编解码器和其他相关信息。

  • MongoDatabaseMongoCollection实例,配置为使用CodecRegistry

  • MongoCollection实例,使用与TDocument泛型类型绑定的POJO文档类创建。

执行以下步骤以满足上一节中定义的配置要求

  1. 配置PojoCodecProvider。在本例中,我们使用PojoCodecProvider.Builderautomatic(true)设置将编解码器应用于任何类及其属性。

    CodecProvider pojoCodecProvider = PojoCodecProvider.builder().automatic(true).build();

    注意

    编解码器提供程序还包括其他对象,例如ClassModelConvention实例,它们进一步定义了序列化行为。有关编解码器提供程序和自定义的更多信息,请参阅POJO自定义指南。

  2. PojoCodecProvider实例添加到CodecRegistry中。CodecRegistry允许您指定一个或多个编解码器提供程序来编解码POJO数据。在本例中,我们调用以下方法

    • fromRegistries()将多个CodecRegistry实例合并为一个实例

    • getDefaultCodecRegistry()从编解码器提供程序列表中检索一个CodecRegistry实例

    • fromProviders()PojoCodecProvider创建一个CodecRegistry实例

    以下代码展示了如何实例化CodecRegistry

    // Include the following static imports before your class definition
    import static com.mongodb.MongoClientSettings.getDefaultCodecRegistry;
    import static org.bson.codecs.configuration.CodecRegistries.fromProviders;
    import static org.bson.codecs.configuration.CodecRegistries.fromRegistries;
    ...
    CodecRegistry pojoCodecRegistry = fromRegistries(getDefaultCodecRegistry(), fromProviders(pojoCodecProvider));
  3. 配置MongoDatabaseMongoCollection实例以使用CodecRegistry中的编解码器。您可以为数据库或集合配置编解码器。

    在本例中,我们使用withCodecRegistry()方法将名为sample_pojosMongoDatabase上的CodecRegistry设置

    MongoClient mongoClient = MongoClients.create(uri);
    MongoDatabase database = mongoClient.getDatabase("sample_pojos").withCodecRegistry(pojoCodecRegistry);
  4. 将您的POJO类传递给getCollection()的调用,将其作为文档类参数,并指定它为MongoCollection实例的类型参数,如下所示

    MongoCollection<Flower> collection = database.getCollection("flowers", Flower.class);

一旦配置了MongoCollection实例以使用Flower POJO,您就可以对由POJO模式化的数据进行CRUD操作。

本例演示了如何使用Flower POJO执行以下操作

  • Flower的实例插入到flowers集合中

  • 更新集合中的一个文档

  • 删除集合中的一个文档

  • 查找并打印集合中的所有文档

// Insert three Flower instances
Flower roseFlower = new Flower("rose", false, 25.4f, Arrays.asList(new String[] {"red", "pink"}));
Flower daisyFlower = new Flower("daisy", true, 21.1f, Arrays.asList(new String[] {"purple", "white"}));
Flower peonyFlower = new Flower("peony", false, 19.2f, Arrays.asList(new String[] {"red", "green"}));
collection.insertMany(Arrays.asList(roseFlower, daisyFlower, peonyFlower));
// Update a document
collection.updateOne(
Filters.lte("height", 22),
Updates.addToSet("colors", "pink")
);
// Delete a document
collection.deleteOne(Filters.eq("name", "rose"));
// Return and print all documents in the collection
List<Flower> flowers = new ArrayList<>();
collection.find().into(flowers);
System.out.println(flowers);

示例输出如下

[
Flower {
id: 65b178ffa38ac42044ca1573
name: daisy
colors: [purple, white, pink]
isBlooming: true
height: 21.1
},
Flower {
id: 65b178ffa38ac42044ca1574
name: peony
colors: [red, green]
isBlooming: false
height: 19.2
}]

注意

默认情况下,PojoCodecProvider会省略POJO中设置为null的字段。有关如何指定此行为的更多信息,请参阅POJO自定义指南。

有关本节中提到的方法和类的更多信息,请参阅以下API文档

本指南描述了如何通过执行以下任务在BSON和POJO格式之间转换数据:

  • 实例化一个包含如何编码和解码BSON和POJO字段之间数据的编解码器的 PojoCodecProvider

  • 指定 PojoCodecProvider自动 转换行为,将 Codecs 应用于任何类及其属性。

  • PojoCodecProvider 添加到 CodecRegistry,并在 MongoDatabaseMongoCollection 的实例上指定该注册表。

  • 执行使用示例POJO类的CRUD操作。

返回

文档