Categorias
Análise de livro banco de dados Java Play

Saindo da mesmisse com Play framework e MongoDB

Há alguns anos quando estava estudando Java, li em um livro a seguinte frase: “provavelmente em algumas décadas os bancos de dados relacionais continuarão a ser dominantes no mercado, por esse motivo é importante aprender JDBC e SQL, pois o Java implementa blá blá blá“.

Na época eu concordei com o autor, e não imaginei que pudesse mudar de ideia algum dia, apesar de não gostar do fato de desenvolver um sistema e sempre depender de quem armazena os dados.

databases

Quando se aprende uma linguagem nova, sempre existiu essa dependência de aprender SQL para interagir com os bancos de dados relacionais, e no caso do Java o Hibernate veio para salvar para que o mundo orientado a objeto não virasse simplesmente um de-para de tabelas do banco.

Apesar disso, sempre existir uma tendência para desenvolver orientado ao banco de dados, afinal ele é relacional e não vai mudar tão cedo.

Bom, muita gente ainda acha isso, mas a minha opinião mudou depois da revolução NoSQL, e com certeza para cada caso uma opção de banco de dados é mais adequada.

Sempre começamos a desenvolver um sistema partindo do princípio que ele usará um banco de dados relacional (MySQL , Oracle, SQL Server, etc.), mas esse pensamento precisa mudar!

Um sistema baseado em grafos em base relacional certamente seria muito lento, mas em uma base como Neo4J seria muito rápido.

Muitos sistemas que fazemos, ao persistirmos em bases relacionais e normalizarmos as tabelas, e no final, em uma simples tela inicial teremos executando um SELECT em diversas tabelas. Isso é um problema que o DBA pega e cria um índice, mas isso não diminui a complexidade da coisa, afinal o sistema está amarrado às tabelas relacionais.

Nesse ponto que os Document Databases, como o MongoDB vieram para nos salvar. Quando se diz Document, não é um arquivo de documento em formato DOC ou PDF, mas sim a informação em formato JSON.

Um banco de dados gigantesco (em inglês huMONGOus) que costuma armazenar dados na casa dos Terabytes pode ser facilmente manipulado por desenvolvedores.

java-evil-edition

Outra assunto que todo desenvolvedor Java web está condenado é à API de Servlet e ao deployment descriptor , isso sem falar das intermináveis publicações e restarts de servidor (apesar do JavaRebel aliviar um pouco).

Saindo então dessa mesmisse de codifica-deploy-codifica-deploy e inspirado na produtividade de Ruby on Rails e Django que o desenvolvedor Guillaume Bort criou o Play Framework.

Eu gostei tanto de trabalhar com Play Framework que acabei escrevendo um livro =)

Play!

Nesse projeto de Filmes Cult (fontes no GitHub) é demonstrado como o MongoDB se integra facilmente às aplicações Java e ao Play Framework.

Primeiro adicionamos uma dependência do MongoDB ao projeto do Play (dentro do build.sbt):

libraryDependencies ++= Seq(
  "net.vz.mongodb.jackson" %% "play-mongo-jackson-mapper" % "1.1.0"

Em seguida em application.conf apontamos para a base do MongoDB:

# Database configuration
mongodb.servers="127.0.0.1:27017"
mongodb.database="boaglio"

E dentro do nosso domain Filme, definimos como se mapeia com a collection de filmes:

public class Filme {

    @Id
    @ObjectId
    public String id;

    public String nome;

    public String tipo;

    public Double nota;

    public Integer duracao;

    public Integer ano;

    public String genero;

    public Integer votos;

    public String url;

    public Diretor diretor;

    public static List<Filme> all() {
        return Filme.coll.find().toArray();
    }

    private static JacksonDBCollection<Filme,String> coll = MongoDB.getCollection("filmes",Filme.class,String.class);

}

E teremos o seguinte resultado:

play-com-mongodb

A base de dados de filmes está no GitHub junto com o projeto , ela oferece a lista de filmes abaixo, exibida no console do MongoDB:

MongoDB shell version: 2.4.9
connecting to: test
> use boaglio
switched to db boaglio
> db.filmes.count()
98
> db.filmes.find({nome:"Psicose"});
{ "_id" : ObjectId("531f9d490612421e5c4847d3"), "nome" : "Psicose", "tipo" : "Feature Film", "ano" : 1960, "nota" : 8.6, "duracao" : 109, "url" : "http://www.imdb.com/title/tt0054215/", "diretor" : "Alfred Hitchcock" }
> db.filmes.find({nome:"Psicose"}).pretty();
{
        "_id" : ObjectId("531f9d490612421e5c4847d3"),
        "nome" : "Psicose",
        "tipo" : "Feature Film",
        "ano" : 1960,
        "nota" : 8.6,
        "duracao" : 109,
        "url" : "http://www.imdb.com/title/tt0054215/",
        "diretor" : "Alfred Hitchcock"
}
 MongoDB shell version: 2.4.9
connecting to: test
> use boaglio
switched to db boaglio
> db.filmes.count()
98
> db.filmes.find({nome:"Psicose"});
{ "_id" : ObjectId("531f9d490612421e5c4847d3"), "nome" : "Psicose", "tipo" : "Feature Film", "ano" : 1960, "nota" : 8.6, "duracao" : 109, "url" : "http://www.imdb.com/title/tt0054215/", "diretor" : "Alfred Hitchcock" }
> db.filmes.find({nome:"Psicose"}).pretty();
{
        "_id" : ObjectId("531f9d490612421e5c4847d3"),
        "nome" : "Psicose",
        "tipo" : "Feature Film",
        "ano" : 1960,
        "nota" : 8.6,
        "duracao" : 109,
        "url" : "http://www.imdb.com/title/tt0054215/",
        "diretor" : "Alfred Hitchcock"
}

O MongoDB oferece um excelente treinamento online gratuito para desenvolvedores web, consulte mais detalhes em http://education.mongodb.com/

Fernando Boaglio, para a comunidade!