Menu Docs
Página inicial do Docs
/ / /
Java síncrono
/ /

Formato de dados do documento: POJOs

Nesta página

  • Visão geral
  • Exemplo de POJO
  • Configurar o driver para POJOs
  • Realizar operações CRUD
  • Resumo

Neste guia, você pode aprender como armazenar e recuperar dados modelados por objetos Java antigos, ou POJOs. POJOs são frequentemente usados para encapsulamento de dados, que é a prática de separar lógica de negócios da representação de dados.

Dica

Para saber mais sobre POJOs, veja o artigo Plain Old Java Object na Wikipedia.

O exemplo deste guia demonstra como executar as seguintes tarefas:

  • Configurar o driver para serializar e desserializar POJOs

  • Execute operações CRUD que usam dados modelados por POJOs

As seções deste guia usam a seguinte amostra de classe POJO, que descreve as características das flores:

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}";
}
}

Ao definir um POJO para armazenar e recuperar dados dentro do MongoDB, use as seguintes diretrizes:

  • A classe POJO não pode implementar interfaces ou estender classes de uma framework.

  • Inclua todos os campos para os quais você deseja armazenar e recuperar dados e verifique se eles não estão marcados como static ou transient.

  • Se você incluir métodos getter ou setter públicos usando as convenções de nomenclatura JavaBean em seu POJO, o driver os chamará ao serializar ou desserializar dados. Se você omitir os métodos de getter ou setter para um campo de propriedade pública, o driver acessará ou atribuirá a eles diretamente.

Para configurar o driver para usar POJOs, você deve especificar os seguintes componentes:

  • PojoCodecProvider instância que tem codecs que definem como codificar e decodificar os dados entre o formato POJO e BSON. O fornecedor também especifica a quais classes ou pacotes POJO os codecs se aplicam.

  • CodecRegistry instância que contém os codecs e outras informações relacionadas.

  • MongoDatabase ou MongoCollection instância configurada para usar o CodecRegistry.

  • MongoCollection instância criada com a classe de documento POJO vinculada ao tipo genérico TDocument.

Execute as seguintes etapas para atender aos requisitos de configuração definidos na seção anterior:

  1. Configure o PojoCodecProvider. Neste exemplo, usamos a configuração automatic(true) de PojoCodecProvider.Builder para aplicar os codecs a qualquer classe e suas propriedades.

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

    Observação

    Os fornecedores de codecs também contêm outros objetos, como instâncias ClassModel e Convention, que definem melhor o comportamento da serialização. Para obter mais informações sobre fornecedores de codecs e personalização, consulte o guia sobre personalização do POJO.

  2. Adicione a instância PojoCodecProvider a um CodecRegistry. O CodecRegistry permite a você especificar um ou mais fornecedores de codec para codificar os dados POJO. Neste exemplo, chamamos os seguintes métodos:

    • fromRegistries() para combinar múltiplas CodecRegistry instâncias em uma instância

    • getDefaultCodecRegistry() para recuperar uma instância do CodecRegistry de uma lista de fornecedores de codec

    • fromProviders() para criar uma instância CodecRegistry a partir do PojoCodecProvider

    O seguinte código mostra como instanciar o 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. Configure a instância do MongoDatabase ou MongoCollection para utilize os codecs no CodecRegistry. Você pode configurar um banco de dados ou collection para especificar os codecs.

    Neste exemplo, definimos o CodecRegistry em um MongoDatabase chamado sample_pojos usando o método withCodecRegistry():

    MongoClient mongoClient = MongoClients.create(uri);
    MongoDatabase database = mongoClient.getDatabase("sample_pojos").withCodecRegistry(pojoCodecRegistry);
  4. Passe sua classe POJO para sua chamada para getCollection() como o parâmetro de classe de documento e especifique-o como o argumento de tipo de sua instância MongoCollection , conforme mostrado no código a seguir:

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

Depois de configurar a instância MongoCollection para usar o Flower POJO, você poderá executar operações CRUD nos dados modelados pelo POJO.

Este exemplo demonstra como realizar as seguintes operações usando o Flower POJO:

  • Inserir instâncias de Flower na collection flowers

  • Atualizar um documento na collection

  • Excluir um documento na collection

  • Encontrar e imprimir todos os documentos na collection

// 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);

O exemplo imprime a seguinte saída:

[
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
}]

Observação

Por padrão, o PojoCodecProvider omite campos em seu POJO que estão configurados para null. Para obter mais informações sobre como especificar esse comportamento, consulte o guia de personalização POJO .

Para obter mais informações sobre os métodos e as classes mencionadas nesta seção, consulte a seguinte documentação da API:

Este guia descreve como converter dados entre o formato BSON e POJO executando as seguintes tarefas:

  • Crie uma instância PojoCodecProvider que contém codecs que definem como codificar e decodificar dados entre os campos BSON e POJO.

  • Especifique o comportamento de conversão automática para o PojoCodecProvider aplicar Codecs em qualquer classe e suas propriedades.

  • Adicione o PojoCodecProvider a um CodecRegistry e especifique o registro em uma instância de um MongoDatabase ou MongoCollection.

  • Execute operações CRUD que usam a classe POJO de amostra.

Voltar

Documentos