Aula 15: Oracle e Hibernate, fazendo uma busca

Sejam bem vindos, esta é a décima quinta aula de Programação Web em Java, para saber mais sobre o curso, começe em Curso de Programação Web em Java – CPWJ

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?

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.

Eu prometi que o conteúdo seria apresentado com o banco de dados mysql, porém tive uma seqüência de problemas com o hibernate mais mysql. Não quiz perder tempo com os detalhes. Eu não trabalho com o mysql, mas com o Oracle. Acredito que vocês possam encontrar material sobre o uso do mysql e hibernate, porém eu estou com pressa para publicar logo este material e como tenho experiência com Oracle é com ele mesmo que vou continuar. A forma de trabalho é a mesma, mudando apenas o xml de conexão com o banco.

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:
Novo Projeto

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:
Novo Projeto (2)

Clique em Next e ative a biblioteca do Struts conforme a figura:
Novo Projeto (3)

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?)

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration
PUBLIC   "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@10.89.9.6:1521:orabkl</property>
<property name="connection.username">SBUSCA</property>
<property name="connection.password">suasenha</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect -->
<!--property name="dialect">org.hibernate.dialect.HSQLDialect</property-->
<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Disable the second-level cache  -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<!-- 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.-->
<property name="hbm2ddl.auto">create</property>
<mapping resource="sbusca/Sites.hbm.xml"/>
</session-factory>
</hibernate-configuration>

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”:

HibernateUtil

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

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

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”:

Nova Classe

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

Nova Classe (2)

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 {
  private Long id;
  private String nome;
  private String url;
  private String descricao;
  private String keyword;
  public Sites() {}
  public Long getId() {
    return id;
  }
  private void setId(Long id) {
    this.id = id;
  }
  public String getNome() {
    return nome;
  }
  public void setNome(String nome) {
    this.nome = nome;
  }
  public String getUrl() {
    return url;
  }
  public void setUrl(String url) {
    this.url = url;
  }
  public String getDescricao() {
    return descricao;
  }
  public void setDescricao(String descricao) {
    this.descricao = descricao;
  }
  public String getKeyword() {
    return keyword;
  }
  public void setKeyword(String keyword) {
    this.keyword = keyword;
  }
}

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”.
Conectando Hibernate

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:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="sbusca.Sites" table="SITES">
<id name="id" column="SITES_ID">
<generator class="native"/>
</id>
<property name="nome"/>
<property name="url"/>
<property name="descricao"/>
<property name="keyword"/>
</class>
</hibernate-mapping>

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 {
  public static void main(String[] args) {
    MaquinaDeBusca mgr = new MaquinaDeBusca();
    mgr.createAndStoreEvent("Tecnoclasta","http://www.tecnoclasta.com","Detonanto Tecnologia","java, tecnologia, astronáutica, astronomia");
    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");
    mgr.createAndStoreEvent("Portal Terra","http://www.terra.com.br/","Qual a sua Terra","portal, terra, notícias, sites");
    mgr.createAndStoreEvent("Folha de São Paulo","http://www.folha.uol.com.br/","O Jornal com Credibilidade","jornal, folha, notícias");
    HibernateUtil.getSessionFactory().close();
  }
  private void createAndStoreEvent(String nome, String url, String descricao, String keyword) {
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();
    Sites umSite = new Sites();
    umSite.setNome(nome);
    umSite.setDescricao(descricao);
    umSite.setUrl(url);
    umSite.setKeyword(keyword);
    session.save(umSite);
    session.getTransaction().commit();
  }
}

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

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

Pensei em fazer isso em uma aula só, porém está ficando muito, muito longo. Então fica aqui a primeira parte do sistema de busca. Na próxima aula terminamos.

Dúvidas? vá para o fórum.

Outros Artigos:

7 comentários para “Aula 15: Oracle e Hibernate, fazendo uma busca”

  1. Nacho disse:

    Oi!
    Muito bom! Eu esteve esperando esta parte pacientemente. Vou provar com ums exemplos que tenho e os que você propoe.
    A gente se vé ao fórum.
    Nacho
    PS: Sorry my portuguese. Você usa Mist? :-)
    Best desktop-theme ever!!! The fastest!

    Tecnoclasta responde
    Ok, nos veremos no forum então.

  2. [...] Décima Quinta Aula: 19 de fevereiro | Oracle e Hibernate, fazendo uma busca [...]

  3. silvio araujo disse:

    Do ponto de vista do dba, qual a vantagem de se utilizar hibernate?

  4. Jorge Herrera disse:

    Ola …

    Por que seu exemplo não fala de DataSource e outros exemplos da web sim ?
    Oracle não precisa ?
    Veja este exemplo de um PDF que tenho

    java:comp/env/jdbc/datasourceHibernate

    Obrigado

    • Jorge,
      Utilizar DataSource é opcional. A ideia deste recurso é que a configuração da conexão seja registrada no Servidor Web, e uma referência seja feita na aplicação para esta conexão. É ótimo e recomendável, pois permite a mudança do servidor de banco de dados sem trocar nenhuma linha de código no programa.
      Eu não utilizei no meu curso, por que a configuração do DataSource no Web Server depende do Web Server utilizado. Fiz a opção de evitar recursos que poderiam complicar a configuração do ambiente pelo aluno. Da forma que codifiquei, o sistema funciona independente da configuração do Web Server.

  5. Tati disse:

    Olá..professor..

    (Não sei se o senhor ainda responde aos comentários desse site, mas vamos lá :) )

    Estou começando os esudos com java web, e encontrei seu site na net, então comecei a fazer os exemplos, e nesta aula em específico, me ocorreu um problema, fazendo a execução do netbeens, de fato como o senhor mencionou ele trabalhou um bocado, mas a tabela não foi criada no oracle, eu fiz tudo como o senhor indicou no site, estou usando a versão do netbeesn 6.9.1, tem algum problema? Por que será que a tabela nã foi criada?

    Abraços.

Deixe um comentário