Programação Web em Java
Autor: Kayo Bruno | Publicado: 2012-02-11T18:15:00-08:00

Sejam bem vindos, esta é a décima quinta aula de Programação Web em Java.


Vamos construir uma aplicação de verdade usando Java e Web e o modelo MVC. Já sabemos lidar com java, xhtml e css e um pouco de teoria sobre o MVC. Vamos colocar tudo pra funcionar?

Décima Quinta Aula: &nbsp;Oracle e Hibernate, fazendo uma busca 

Definindo o que será nosso primeiro programa: um sistema de busca. Vamos começar com um formulário simples com uma caixa de texto e um botão buscar, que quando clicado leva a outra página com a lista de sites com a palavra chave procurada.

Para uso do Oracle faça o download do Oracle 10g Express Edition em http://www.oracle.com/technology/software/products/database/index.html. É uma versão limitada mas de uso gratuíto. (Debian, Mandriva, Novell, Red Hat, Ubuntu e Windows compatíveis conforme o site Oracle).

Após o processo de instalação crie um usuário “sbusca” com senha “suasenha”.

É só o que você precisa na parte do banco de dados, o restante ficará por conta do Hibernate.

Para a configuração do ambiente do Netbeans 6.0, você precisa das seguintes arquivos de biblioteca:

para conectar no banco:
classes12.jar
para o Hibernate:
ant-antlr-1.6.5.jar
asm-attrs.jar
asm.jar
cglib-2.1.3.jar
commons-collections-2.1.1.jar
commons-logging-1.0.4.jar
dom4j-1.6.1.jar
ehcache-1.2.3.jar
hibernate3.jar
jta.jar

O classes12.jar você encontra aqui mesmo:jdbc Oracle. As bibliotecas do Hibernate você encontra no site do Hibernate em http://www.hibernate.org/6.html. A opção de download do Core é suficiente. (hibernate3.jar está na raiz do zip e os outros no diretório lib)

Reserve os arquivos indicados acima, somente eles, em um diretório qualquer de sua máquina.

Abra agora o Netbeans e vamos começar a fazer a mágica. Após o processo de carga escolha o opção File/New Project…

Escolha a Categoria Web e o tipo de projeto Web Application conforme a figura abaixo:


Clique em Next e digite o nome do projeto e se quiser escolha outra localização para a pasta do projeto. O restante pode deixar como indicado na tela:


Clique em Next e ative a biblioteca do Struts.


Clicando em Finish o projeto estará criado.

Vamos instalar as bibliotecas hibernate e do oracle para uso no nosso projeto. Na aba Projects use o botão direito sobre o nome do projeto (sbusca) e clique em properties. Na janela “Project Properties – sbusca” clique em libraries nas Categorias e no botão “Add JAR/Folder”. Selecione todos os arquivos do diretório que você colocou os arquivos jar e confirme clicando em “OK”.

Criado o projeto e definido as bibliotecas que vamos utilizar, o próximo passo é o Hibernate. Esta biblioteca auxilia no acesso ao Banco de Dados. Implementa a persistência aos objetos, fazendo a ponte objeto/relacional.

Vamos configurar o Hibernate para conexão com o Oracle. Para isso vamos escrever um arquivo de configuração XML. Clique com o botão direito do mouse sobre “Source Package” na aba do projeto e escolha a opção “New/ XML Document”. Digite o nome do arquivo como “hibernate.cfg.xml” (xml é automaticamente preenchido digite somente hibernate.cfg). Clique em “Next” e “Finish”.

Digite ou copie o código de configuração da conexão com o Oracle: (sempre cuidado com as aspas em códigos fonte, o WordPress detona lembra-se?)

&lt;?xml version='1.0' encoding='utf-8'?&gt;
&lt;!DOCTYPE hibernate-configuration
PUBLIC &nbsp; "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"&gt;
&lt;hibernate-configuration&gt;
&lt;session-factory&gt;
&lt;!-- Database connection settings --&gt;
&lt;property name="connection.driver_class"&gt;oracle.jdbc.driver.OracleDriver&lt;/property&gt;
&lt;property name="connection.url"&gt;jdbc:oracle:thin:@10.89.9.6:1521:orabkl&lt;/property&gt;
&lt;property name="connection.username"&gt;SBUSCA&lt;/property&gt;
&lt;property name="connection.password"&gt;suasenha&lt;/property&gt;
&lt;!-- JDBC connection pool (use the built-in) --&gt;
&lt;property name="connection.pool_size"&gt;1&lt;/property&gt;
&lt;!-- SQL dialect --&gt;
&lt;!--property name="dialect"&gt;org.hibernate.dialect.HSQLDialect&lt;/property--&gt;
&lt;property name="dialect"&gt;org.hibernate.dialect.Oracle9Dialect&lt;/property&gt;
&lt;!-- Enable Hibernate's automatic session context management --&gt;
&lt;property name="current_session_context_class"&gt;thread&lt;/property&gt;
&lt;!-- Disable the second-level cache &nbsp;--&gt;
&lt;property name="cache.provider_class"&gt;org.hibernate.cache.NoCacheProvider&lt;/property&gt;
&lt;!-- Echo all executed SQL to stdout --&gt;
&lt;property name="show_sql"&gt;true&lt;/property&gt;
&lt;!-- Drop and re-create the database schema on startup --&gt;
&lt;!-- Depois que executar uma vez a classe de teste elimine a linha seguinte. Esta linha provoca a exclusão de todas as tabelas e recriação.--&gt;
&lt;property name="hbm2ddl.auto"&gt;create&lt;/property&gt;
&lt;mapping resource="sbusca/Sites.hbm.xml"/&gt;
&lt;/session-factory&gt;
&lt;/hibernate-configuration&gt;
Para facilitar a codificação com o Hibernate vamos criar uma classe para a conexão e desconexão do banco de dados. Clique com o botão direito do mouse sobre “Source Package” na aba do projeto e escolha a opção “New\java class”. Chame a classe de “HibernateUtil” e defina o package como “util”:



Clique em finish e copie o código da classe:

package util;
import org.hibernate.*;
import org.hibernate.cfg.*;
public class HibernateUtil {
&nbsp; private static final SessionFactory sessionFactory;
&nbsp; static {
&nbsp; &nbsp; try {
&nbsp; &nbsp; &nbsp; // Create the SessionFactory from hibernate.cfg.xml
&nbsp; &nbsp; &nbsp; sessionFactory = new Configuration().configure().buildSessionFactory();
&nbsp; &nbsp; } catch (Throwable ex) {
&nbsp; &nbsp; &nbsp; // Make sure you log the exception, as it might be swallowed
&nbsp; &nbsp; &nbsp; System.err.println("Initial SessionFactory creation failed." + ex);
&nbsp; &nbsp; &nbsp; throw new ExceptionInInitializerError(ex);
&nbsp; &nbsp; }
&nbsp; }
&nbsp; public static SessionFactory getSessionFactory() {
&nbsp; &nbsp; return sessionFactory;
&nbsp; }
}

Com a biblioteca carregada e as configurações do hibernate certas, vamos codificar uma classe Sites para representar um dado persistente. Clique em File/New File e escolha Categoria “java” e “File Types” igual a “Java Class”:



Clique em “Next” e defina o nome da classe como Sites e o package como sbusca:



Clicando em “Finish” o Netbeans irá abrir a página com o código da Classe. Complete o código da classe criando os campos necessários:

package sbusca;
public class Sites {
&nbsp; private Long id;
&nbsp; private String nome;
&nbsp; private String url;
&nbsp; private String descricao;
&nbsp; private String keyword;
&nbsp; public Sites() {}
&nbsp; public Long getId() {
&nbsp; &nbsp; return id;
&nbsp; }
&nbsp; private void setId(Long id) {
&nbsp; &nbsp; this.id = id;
&nbsp; }
&nbsp; public String getNome() {
&nbsp; &nbsp; return nome;
&nbsp; }
&nbsp; public void setNome(String nome) {
&nbsp; &nbsp; this.nome = nome;
&nbsp; }
&nbsp; public String getUrl() {
&nbsp; &nbsp; return url;
&nbsp; }
&nbsp; public void setUrl(String url) {
&nbsp; &nbsp; this.url = url;
&nbsp; }
&nbsp; public String getDescricao() {
&nbsp; &nbsp; return descricao;
&nbsp; }
&nbsp; public void setDescricao(String descricao) {
&nbsp; &nbsp; this.descricao = descricao;
&nbsp; }
&nbsp; public String getKeyword() {
&nbsp; &nbsp; return keyword;
&nbsp; }
&nbsp; public void setKeyword(String keyword) {
&nbsp; &nbsp; this.keyword = keyword;
&nbsp; }
}
Para o funcionamento perfeito do Hibernate são necessários alguns detalhes:

Um campo Id para ser usado como campo chave automático;
Funções Get e Set públicos para manipulação dos dados privados;
Após a criação da classe é necessário definir um arquivo de mapeamento Hibernate. Com o botão direito do mouse sobre “sbusca” em destaque na figura, escolha a opção “new” e “others”.


Na janela “New File” escolha a categoria “XML” e “File Type” “Xml Document”. Clique em “Next” e defina o nome do arquivo como “Sites.hbm.xml” (a extensão xml é automaticamente inserida). Clique em “Next” e por fim em “Finish”. Copie o código abaixo para realizar a amarração:

&lt;?xml version="1.0"?&gt;
&lt;!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"&gt;
&lt;hibernate-mapping&gt;
&lt;class name="sbusca.Sites" table="SITES"&gt;
&lt;id name="id" column="SITES_ID"&gt;
&lt;generator class="native"/&gt;
&lt;/id&gt;
&lt;property name="nome"/&gt;
&lt;property name="url"/&gt;
&lt;property name="descricao"/&gt;
&lt;property name="keyword"/&gt;
&lt;/class&gt;
&lt;/hibernate-mapping&gt;
Para verificar se tudo funcionou até aqui, vamos criar uma classe para ver se o hibernate está conseguindo criar os registros: (espero que já saiba como criar a classe depois de eu repetir mais de uma vez a seqüencia de teclas!)

package sbusca;
import org.hibernate.Session;
import util.HibernateUtil;
public class MaquinaDeBusca {
&nbsp; public static void main(String[] args) {
&nbsp; &nbsp; MaquinaDeBusca mgr = new MaquinaDeBusca();
&nbsp; &nbsp; mgr.createAndStoreEvent("Tecnoclasta","http://www.tecnoclasta.com","Detonanto Tecnologia","java, tecnologia, astronáutica, astronomia");
&nbsp; &nbsp; mgr.createAndStoreEvent("Uol Universo On-line","http://www.uol.com.br/","Universo On-line - O maior portal em língua portuguesa","portal, uol, sites, notícias");
&nbsp; &nbsp; mgr.createAndStoreEvent("Portal Terra","http://www.terra.com.br/","Qual a sua Terra","portal, terra, notícias, sites");
&nbsp; &nbsp; mgr.createAndStoreEvent("Folha de São Paulo","http://www.folha.uol.com.br/","O Jornal com Credibilidade","jornal, folha, notícias");
&nbsp; &nbsp; HibernateUtil.getSessionFactory().close();
&nbsp; }
&nbsp; private void createAndStoreEvent(String nome, String url, String descricao, String keyword) {
&nbsp; &nbsp; Session session = HibernateUtil.getSessionFactory().getCurrentSession();
&nbsp; &nbsp; session.beginTransaction();
&nbsp; &nbsp; Sites umSite = new Sites();
&nbsp; &nbsp; umSite.setNome(nome);
&nbsp; &nbsp; umSite.setDescricao(descricao);
&nbsp; &nbsp; umSite.setUrl(url);
&nbsp; &nbsp; umSite.setKeyword(keyword);
&nbsp; &nbsp; session.save(umSite);
&nbsp; &nbsp; session.getTransaction().commit();
&nbsp; }
}
Executando esta classe o NetBeans vai trabalhar um bocado, e no fim do processo tudo deverá funcionar. Veja você mesmo se foi criada a tabela e se os registros foram criados corretamente.

Observe que o hibernate elimina toda a necessidade de codificação em SQL. Isso facilita muito a manutenção e mesmo portar o sistema para um banco de dados diferente.

Um segundo teste do hibernate consiste em executar uma consulta. Mude a função main para esta, inclua uma nova função “buscaSites()” e execute a classe novamente:

public static void main(String[] args) {
&nbsp; MaquinaDeBusca mgr = new MaquinaDeBusca();
&nbsp; //String teste="store";
&nbsp; String teste = "list";
&nbsp; if (teste.equals("store")) {
&nbsp; &nbsp; mgr.createAndStoreEvent("Tecnoclasta", "http://www.tecnoclasta.com", "Detonanto Tecnologia", "java, tecnologia, astronáutica, astronomia");
&nbsp; &nbsp; mgr.createAndStoreEvent("Uol Universo On-line", "http://www.uol.com.br", "Universo On-line - O maior portal em língua portuguesa", "portal, uol, sites, notícias");
&nbsp; &nbsp; mgr.createAndStoreEvent("Portal Terra", "http://www.terra.com.br", "Qual a sua Terra", "portal, terra, notícias, sites");
&nbsp; &nbsp; mgr.createAndStoreEvent("Folha de São Paulo", "http://www.folha.uol.com.br", "O Jornal com Credibilidade", "jornal, folha, notícias");
&nbsp; } else if (teste.equals("list")) {
&nbsp; &nbsp; List sites = mgr.buscaSites("notícias");
&nbsp; &nbsp; for (int i = 0; i &lt; sites.size(); i++) {
&nbsp; &nbsp; &nbsp; Sites umSite = (Sites) sites.get(i);
&nbsp; &nbsp; &nbsp; System.out.println("Site: " + umSite.getNome() +": " + umSite.getDescricao()+ ", Url:"+umSite.getUrl());
&nbsp; &nbsp; }
&nbsp; }
&nbsp; HibernateUtil.getSessionFactory().close();
} //fim da função main
public List buscaSites(String keyword) {
&nbsp; Session session = HibernateUtil.getSessionFactory().getCurrentSession();
&nbsp; session.beginTransaction();
&nbsp; List result = session.createQuery("from Sites where keyword like '"+ keyword+"'").list();
&nbsp; session.getTransaction().commit();
&nbsp; return result;
}

Dando certo será listado os sites da Uol, Terra e Folha.