Lendo XML & Populando no BD via Hibernate

olá Pessoal,

O post de hoje é como popular um banco de dados tendo os dados em um arquivo XML. Se ainda não passou por esse requisito no seu trabalho, não se preocupe que o momento vai chegar. Há várias formas de fazer a leitura do arquivo XML e popular o banco, para o post, escolhi o Xstream e o Hibernate, que já uso o Hibernate por default e o Xstream é de fato uma boa API. Há também a SAPX, que não cheguei a testar.

Lets go…

Requisitos

  • Java 5/superior
  • Hibernate 3.x/Superior
  • Eclipse IDE
  • Xstream : faça o download da API
  • MySql 5

Iniciando

Para inicio você precisa criar um Java Project no seu Eclipse, e ter as bibliotecas do Hibernate adicionadas ao projeto. Não esqueça de adicionar os .JARS do MySql e do XStream (apenas xstream-1.3.1.jar). Abaixo temos o nosso banco vazio, aguardando os dados do XML.

Vamos usar annotations para o mapeamento do nosso bean com o Hibernate, se tiver dúvidas de como fazer isso, terá que ver alguns posts meus mais antigos de Hibernate com annotations.

A seguir temos a imagem de como vai ficar nosso projeto. Você já pode ir adicionando as classes e as bibliotecas, ao decorrer do post, vamos apresentando os códigos relevantes.

Antes de mais nada faça o download do nosso arquivo XML que possui os dados dos usuarios que vamos popular, e adicione ele à raiz do projeto. Para fazer isso basta clicar com o botão direito no projeto, escolher importar ==> File System e buscar pelo arquivo XML no seu computador.

Baixar o usuarios.xml

note: no arquivo usuarios.xml não temos o campo id para representar a coluna no banco, uma vez que este será gerado de forma automatica. Então ao abrir o arquivo sentirá falta dele.

Resolvi colocar poucos dados no XML, mas se funcionar com 2-3, deve está ok com 10,20 etc. (teoricamente sim).


Na imagem acima temos o projeto atualizado com o arquivo xml.

Pronto. Acho que até aqui estamos ok. Na próxima etapa serão os codes das classes que vamos precisar para trabalhar de verdade.

Desenvolvimento

Primeiramente você deve criar o Bean, ou seja, a classe Usuario e fazer as devidas anotações, conforme o code abaixo. Removi os getters/setters, para poupar espaço:

@Entity

@Table

public class Usuario {

@Id

@GeneratedValue

private int id;

@Column

private String nome;

@Column

private String email;

@Column

private String senha;

@Column

private String tipo;

 

Agora, configure o seu arquivo hibernate-cfg.xml com os dados de conexão do seu banco. Não esqueça de definir o mapping para a classe bean, veja como ficou o meu:


Agora vamos criar os metodos para persistência em nossa classe HibernateDAO, ficando assim:

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.AnnotationConfiguration;

public class HibernateDAO {

private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();

private static final SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();

public Session getSession() {

Session session = threadLocal.get();

if (session == null) {

session = sessionFactory.openSession();

}

return session;

}

public void begin() {

getSession().beginTransaction();

}

public void commit() {

getSession().getTransaction().commit();

}

public void rollBack() {

getSession().getTransaction().rollback();

}

public void close() {

getSession().close();

}}

Agora vamos atualizar a classe UsuarioDAO que é a classe que solicita que a persistência aconteça.

public class UsuarioDAO extends HibernateDAO{

public void create(List<Usuario> listUser){

for (Usuario usuario : listUser) {

begin();

getSession().save(usuario);

try{

commit();

}catch (HibernateException e) {

e.printStackTrace();

rollBack();

}

}}}

Para quem já trabalha com Hibernate nada de especial até aqui. Lembrando que o objetivo do post não é explicar Hibernate e sim, mostrar como popular dados de um XML no banco.Então não vou entrar em detalhe sobre o code acima, qualquer dúvida basta consultar outros posts meus que explico em detalhe o Hibernate.

Vamos atualizar a classe LerDadosXML, que como nome já diz, ela será responsável

public class LerDadosXML {

private List<Usuario> listUsuario;

public List<Usuario> lerXml(Reader fonte){

XStream stream = new XStream(new DomDriver());

stream.alias(“Usuario”, Usuario.class);

List<Usuario> fromXML = (List<Usuario>) stream.fromXML(fonte);

popularData(fromXML);

return fromXML;

}

public void popularData(List<Usuario> listUsuario){

new UsuarioDAO().create(listUsuario);

}

}

Bom, a única novidade que temos ai é o uso da API XStream que será responsável por ler os dados do XML. Para ler os dados, como pode ver é bem simples, basta chamar xStream.fromXML(fonteOrigem); no nosso caso o local onde está o arquivo XML deverá ser passado para o argumento do método, mas poderiamos definir isso na mão grande algo como readerFile = new FileReader(new File(“nomedoarquivo.xml”));

Testando

Para testar e ver se de fato que planejamos vai acontecer, farei um unit test. Se não quiser usar unit test, pode criar a classe com o método main e executar.

A seguir temos o test passando e o banco populado:

public class LerDadosXMLTest {

@Test

public void testLerDadosXMLEPopulaNoBanco() throws FileNotFoundException{

FileReader fileReader = new FileReader(new File(“usuarios.xml”));

LerDadosXML lerDadosXML = new LerDadosXML();

assertFalse(lerDadosXML.lerXml(fileReader).isEmpty());}

}



 

Bom vou ficando por aqui, espero que tenham gostado do post.

Abracos, see ya!!