Você está na página 1de 5

Trabalhando com o banco de dados

Atualmente grande parte das aplicaes devem integrar-se com um banco de dados. Ao usar um banco geralmente trabalhamos com o paradigma relacional, que nos prov mecanismos para relacionar as diferentes informaes que o nosso sistema armazenar. Para representarmos as informaes no banco, utilizamos tabelas e colunas. As tabelas geralmente possuem chaves primrias (PK) e podem ser relacionadas por meio da criao de chaves estrangeiras (FK) em outras tabelas. Conseguimos trabalhar com o banco alterando e consultando informaes atravs do SQL (Structured Query Language), que, apesar de ser um padro, apresenta diferenas significativas dependendo do fabricante.

O paradigma orientado a objetos


Quando trabalhamos com uma aplicao Java, seguimos o paradigma orientado a objetos, onde representamos nossas informaes por meio de classes, atributos e mtodos. Alm disso, podemos utilizar herana e composio para se relacionar, encapsular dados e lgicas, aproveitar o polimorfismo, entre outras possibilidades.

Evitando o SQL dentro do cdigo Java


Quando queremos trabalhar com banco de dados em Java podemos utilizar a API JDBC que nos prov formas de executarmos comandos SQL. No entanto, o problema do JDBC que precisamos escrever cdigo SQL misturado com o nosso cdigo Java, normalmente seguindo o padro de projeto Data Access Object (DAO). Dessa forma, sempre que quisermos mudar qualquer SQL da nossa aplicao, precisamos alterar a classe e recompil-la. Alm disso, o SQL nem sempre portvel entre bancos de dados diferentes e ao escrev-lo podemos ficar presos naquele fornecedor (Vendor lock-in).

JDBC e SQL - problemas de manuteno


Vamos provar isso atravs do projeto que preparamos: contas-jdbc. Na pasta lib est o driver de conexo do MySQL e o JAR do banco de dados HSQLDB. H tambm uma classe Conta que representa nosso modelo. Nada de especial nela, apenas atributos, getters e setters. Queremos executar as operaes bsicas no banco de dados, ou seja, inserir, alterar e listar contas. Ao abrir a classe TesteJDBC podemos ver como adicionar uma conta. Aps sua criao, usamos o DAO para executar o SQL. O cdigo simples, mas vamos tambm analisar o DAO. O ContaDAO s implementou os mtodos bsicos para trabalhar com a tabela Conta, mesmo assim j h uma grande quantidade de linhas. Aqui escrevemos o SQL e

mapeamos a classe Conta para a tabela, e tambm amarramos a um banco especfico, nesse caso o MySQL. Qualquer alterao no modelo ter um grande impacto nessa classe. Isso pode ser ilustrado comentando o atributo titular e seus getter e setter. Repare que praticamente todos os mtodos do ContaDAO param de compilar. preciso alterar o SQL e atualizar o DAO em todos esses pontos. Isso gera problemas de manuteno e diminui a produtividade. Uma boa parte do nosso tempo estamos preocupados com o mapemento da classe para a tabela.

Persistir objetos sem escrever SQL


O ideal seria que trabalhssemos apenas com a nossa linguagem de programao e todo o trabalho do banco de dados que envolve SQL, transao e outros cuidados fossem abstrados. Ou seja, para "gravarmos" a conta no banco queremos utilizar o mnimo de cdigo possvel, algo como:

conexao.salva(conta);
O mtodo salva da conexo faria todo o trabalho pesado para gerar o SQL adequado. No fundo, o que queremos diminuir o uso de detalhes do paradigma relacional para programar mais focado com o paradigma orientado a objetos.

Unindo os dois mundos atravs do Mapeamento Objeto-Relacional


O problema que o paradigma relacional bem diferente do orientado a objetos. Detalhes que existem em um no existem no outro e isso faz com que seja complexo integrar uma aplicao OO com um banco de dados relacional. Essa diferena, tambm conhecida como impedncia (impedance mismatch), abstrada pelos frameworks que mapeiam o mundo OO automaticamente para mundo relacional - so os famosos frameworks ORM (Object Relational Mapping).

A Java Persistence API JPA


Com o passar do tempo, surgiram diversos frameworks ORM, cada um funcionando de maneira diferente, mas o que se destacou no mercado foi o Hibernate, sendo fcil de usar sem abrir a mo do poder dos bancos de dados relacionais. O Hibernate tornou-se

praticamente o padro do mercado, levando a criao da especificao JPA (Java Persistence API) dentro do JavaEE.

O primeiro exemplo com JPA


Vamos mostrar os benefcios do JPA com Hibernate atravs de um pequeno projeto (contas-jpa). No se preocupe com a configurao, os prximos captulos mostraro em detalhes como usar e configurar o JPA. J temos as bibliotecas adicionadas, a maioria delas so do Hibernate. Alm disso, j configuramos os dados das conexo dentro do arquivo persistence.xml. Nele encontram-se as informaes tpicas sobre o Driver, URL, login e senha utilizados. Repare que foram configurados dois bancos diferentes, o primeiro o MySQL e o segundo, o Postgres. Igual ao exemplo anterior usamos uma classe Conta, mas agora h algumas anotaes que definem o mapeamento para a tabela, o JPA chama essas classes de entidades. Por ltimo preparamos uma classe que inicializa o JPA e persiste (salva) a conta. No h nenhum DAO, nem sequer uma linha de SQL nesse projeto. Ao executar, a conta ser salva no banco de dados, e como podemos ver no console, o SQL foi gerado automaticamente. Ao realizar o teste mais uma vez com o atributo titular comentado, percebemos que h pouco impacto. Executando novamente, o SQL foi gerado sem o titular, sendo transparente para o desenvolvedor isso. Por fim, vamos trocar o banco e usar o PostgreSQL no lugar do MySQL. Novamente no h nenhum impacto na aplicao. Trocamos apenas uma configurao. Ao executar foi gerado o SQL para o banco PostgreSQL. Como toda especificao JavaEE, o JPA possui vrias implementaes. Entre as mais comuns, podemos citar: Hibernate, EclipseLink e o OpenJPA. Nesse treinamento focamos nos recursos do JPA e usamos como implementao o Hibernate!

Resumo
Vimos neste captulo os problemas de termos cdigos SQL em nossas classes e o desencontro entre o mundo orientado a objetos e o mundo relacional. Vimos tambm como solucionar este problema atravs de um framework ORM, que realiza o mapeamento objeto-relacional de nossas classes. Tudo isso atravs do Hibernate, uma biblioteca de mapeamento objeto-relacional que ficou to famosa ao ponto de inspirar a criao da

especificao JPA dentro do JavaEE, que por sua vez, utiliza o prprio Hibernate entre outros como implementao.

Você também pode gostar