Criando um pool de conexão JEE/TomCat

olá Pessoal,

O post desta semana é sobre pool de conexão, veremos como usar em uma aplicação JEE. Apesar de ter o mesmo efeito de fecharmos de forma programatica uma conexão, mas nem sempre esta ultima é melhor, principalmente em produção uma conexão pode ficar aberta, outra vem a ser aberta e por ai vai até estourar o nosso BD. E para retornar o normal tem que ter dar um restart no tomcat. Imagine em dar um restart no servidor em produção por causa disso?

Até a implementação do pool de conexão é bem lógico e bem refatorado, basta ter o JNDI e pronto. Quando precisar alterar vamos em um local e aonde o JNDI é referenciado já está atualizado (obvio).

Lets go…

Posts recomendados:

MySql + Java

Criando dynamic web project

Pool de Conexão

O pool de conexão é usado do lado do servidor independente da IDE que você está usando, porém cada servidor e IDE tem suas config especiais para o uso do Pool, ou seja, no tomcat é de uma forma, no Jboss eh outra, no glassfish também. E na IDE Netbeans pode mudar, que ele organiza um projeto JEE levemente diferente da IDE eclipse. Mas, nada que o programador precise “comprar um livro” para esse fim.

Requisitos:

Tomcat 5.5/superior – Instalação

Eclipse
MySql – 5.x

Antes de colocar mão na massa certifique-se que você tem o conectar 5.x.jar MySql . Pois, vamos precisar dele em nosso projeto JEE.

  1. crie um novo dynamic web project
  2. Abra o arquivo web.xml e na aba Tree clique em Resources.
  3. Precisamos adicionar uma referência para isso clique em add e deixe conforme abaixo:

< resource-ref>
    < res-ref-name>jdbc/blog
    < res-type>javax.sql.DataSource
    < res-auth>Container
  < /resource-ref>
  1. O name pode ser qualquer um, como jdbc/nomequevcquer
  2. crie um package para conexão br.com.conexao

  3. Agora crie uma classe chamada Conexao com o método a seguir:

import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class Conexao {

	public static Connection getConnection() throws Exception{

		InitialContext context = new InitialContext();
DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/blog");

		try {

			return ds.getConnection();
		} catch (SQLException e) {

			throw new Exception(e.getMessage());
		}}}
  1. o método lookup tem como objetivo buscar o jdni que criamos no web.xml

Configurando o config BD no TomCat

  1. crie um arquivo em META-INF chamado context.xml
  2. Aqui vamos passar as configurações do BD para o JNDI que criamos, ou seja, jdbc/blog. Vamos informar qual usuário/senha e schema do BD aquele JNDI deve conectar.

	
	

Então podemos ter vários JNDI em um mesmo context.xml com usuários/senha + schema diferentes. Isso ajuda quando precisar fazer alterações de teste para produção, basta mudar em um lugar. E pronto.

A JNDI é uma API para acesso a serviços de diretórios que permite aplicações cliente descobrir e obter dados ou objetos através de um nome. A API JNDI é utilizada em aplicações Java para acessar recursos externos, como banco de dados, filas ou tópicos JMS e componentes da plataforma Java EE. (Edson Gonçalves).”

Adicione ao projeto o driver do BD na pasta lib. Lembre-se de copia-lo fisicamente para o eclipse, ou seja, saia do eclipse e copie o .jar, pois o eclipse não faz isso automaticamente quando add via library da própria IDE.

Testando

Para testar vamos criar um simples servlet que vai estabelecer a conexão e se der tudo tudo certo, não veremos nenhuma exceção e será impresso uma mensagem.

Mas, antes disso criamos uma pagina .jsp que chama o servlet. Fizemos isso para ser mais rápido e e simples. Já que precisamos apenas saber se o nosso pool está funcionando corretamente.

Servlet.java

  1. crie um package br.com.servlet

  2. Crie um servlet TesteAPP conforme abaixo:

public class TesteAPP extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public TesteAPP() {
        super();
        // TODO Auto-generated constructor stub
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
	throws ServletException, IOException {
		try {
			Conexao.getConnection();
			System.out.println("conexão estabelecida com sucesso");

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();}}

note: Se usou o assistente do eclipse para criar um servlet, fique atento se não mudou o <url-pattern> . Caso não tenha feito este leva o mesmo nome da class Servlet.

Index.jsp

Apenas encaminha a solicitação para o servlet TesteAPP

Execute o projeto, e veja o resultado esperado.



Note: Não esqueça de verificar se o Banco de dados foi iniciado. Ou seja, deu start no BD? Senão vai receber uma exceção: Communication failure link

Simples não? Vou ficando por aqui e espero que tenham gostado do post.

Abraços, see you next post. :).

Solucionado ROLE_ Spring Security

Olá Pessoal,

O post de hoje vem com o objetivo de complementar dois posts do Edson Gonçalves referente Spring Security. Muitos desenvolvedores que pretende usar Spring Security (SS) em suas apps JEE para implementar a regra de segurança sofrem quando já temos dados cadastrado no BD e não queremos mudar as informações no BD para prefix o ROLE_ que é requerido pelo SS.

Neste post vou mostrar como resolver este problema, que você pode se deparar em sistema legado.

Lets go…

Recomendado:

Spring Security + BD

Spring Security Sem BD

Iniciando

Vou levar em conta que você ja tem implementado o SS conforme este post do Edson Gonçalves. Caso contrário leia o post do Gonçalves antes de continuar com o meu.

Mas, para refrescar sua mente lembre-se que o role deve ter ROLE_ prefixado para que as regras funcionem. Isso é default no SS. Há como alterar, porém pesquisei muitooo e não conseguir implementar, no forum SS há varias sugestoes, mas nenhuma delas foi mais eficiente que prefix o ROLE_ com os dados trazido do BD.

Desenvolvendo

A solução é mais simples que podemos imaginar, você vai precisar apenas prefix o ROLE_. Para quem usa MySQL temos a funcao concat(), no Oracle podemos usar | | etc. Em verifique na documentação do seu banco como concatenar.

A seguir mostramos com o MySQL. É simples demais, confira:

authorities-by-username-query="SELECT  username, concat('ROLE_',authority) FROM users where username = ? "

O código completo fica assim:

< jdbc-user-service data-source-ref="dataSource"  

users-by-username-query="SELECT username, password, 'true' as enable FROM users WHERE username=?"
authorities-by-username-query="SELECT  username, concat('ROLE_',authority) FROM users where username = ? "
/>

ou dessa forma:

 users-by-username-query="SELECT l.login as username, l.senha as password, 'true' as enable from funcionario l where l.login=?"	
authorities-by-username-query="SELECT lo.login as username, CONCAT('ROLE_',lo.cargo)as authority FROM funcionario lo where lo.login=?"	/>
 

Outra dica é se a coluna do usuario/password não for o que o Spring Security espera, basta você fazer conforme o código a seguir:

users-by-username-query="SELECT us.email as username, us.senha as password, 'true' as enable FROM	usuario as us WHERE email=?"
authorities-by-username-query="SELECT  us.email as username, us.tipo as authority FROM usuario us where email= ?"

Vou ficando por aqui, espero que tenham gostado do post.

Abracos e até o próximo post.

Segurança JEE Realm FORM TomCat

olá Pessoal,

Hoje vou falar de um assunto que todos os desenvolvedores, arquitetos etc. tem que se preocupar ao desenvolver uma aplicação é a famosa segurança. Você como “profissional do software” tem que saber quem vai ter acesso a determinadas partes da sua aplicação e o que ele pode fazer após ter concedido o acesso.

Dizer  se o usuário “camilo” for um simples “user” ele só pode navegar nas seguintes pages: “index.jsp, faleconosco.jsp etc”. Agora vamos dizer que o usuário “lopes” é um dos administradores do sistema, então ele pode acessar as páginas “cadastrarprodutos.jsp, deletarusuario.jsp que estão em /admin” etc.

Como fazer isso Camilo?

Bem, o objetivo deste post é dar um suporte quem está entrando agora no mundo JEE, hoje temos frameworks que ajudam de forma mais eficiente que usar Realm do TomCat. Mas, não pretendo ir além do Realm. Só ele dar um big post.

Alguns iniciantes em JavaEE, tem essa dúvida consigo: como implementar regra de acesso sem precisar fazer um hard-code?”

Fazer isso dentro do seu servlet, controller etc. não é boa ideia pelo simples motivo: “as regras de segurança podem mudar com bastante frequência”. Como por exemplo amanha você precisa adicionar um novo nível de administrador (sênior, pleno) e cada um com permissões diferentes. Mas, também pode acontecer de um novo grupo fazer parte da administração os “gerente de projetos” ai lá vai o desenvolvedor atualizar o code e se amanhã deixar de existir algum dos citados? Já viu o prolema que temos ao implementar regras de segurança dentro do seu servlet, controller etc.

Os iniciantes em JEE, põe tudo que for restrito dentro de WEB-INF, isso não é boa prática.

As regras de segurança referente acesso é algo que pode ser simples, mas também complexo, vai depender da regra de negócios da aplicação. Por exemplo, já vi aplicações que tem vários tipos de administradores, usuários, com acessos completamente diferentes, porém no mesmo nível. Mas, colocar em WEB-INF todos as suas pages .jsp. Vc deve se perguntar: “é seguro a quem?”.

Vamos parar de conversa e veremos na prática…

lets go…

Realm

Realm é um depósito de informações de usuário que autentica e autoriza os usuários.Usando realms, você põe a responsabilidade no servidor Web por obrigar a implementar políticas de segurança. Isto significa que os desenvolvedores não precisam escrever código para usar autenticação e autorização (não que isso os impeçam de fazê-lo). Delegando autenticação e autorização ao servidor, os desenvolvedores podem escrever códigos de propósitos gerais, sem preocupação com as regras de autorização de acesso. (Livro – Tomcat – Guia Rápido do Administrador)

Para esse exemplo vamos usar um dos mais populares container JEE o TomCat (versão 6). Se você estiver usando um container diferente, terá que ler a documentação do fabricante e saber como implementar. Porém há poucas mudanças na maioria das vezes.

Posts Recomendado:

Requisitos:

  • Eclipse (usarei o Galileo)

  • TomCat 6 (se tiver a 5.x.x sem problemas, pode usar)

Aqui vamos implementar sem usar dados vindo do BD. Então veja como uma forma de praticar “Segurança” até porque sem BD, vc vai precisar sempre ficar atualizando o arquivo tomcat-users.xml e se você não usar criptografia, qualquer um pode abrir esse arquivo e saber as senhas de cada usuário.

Desenvolvendo

  1. Crie um dynamic web project no Eclipse e deixe ele conforme a imagem a seguir. O meu chama RealmCamilo no decorrer do post, estarei informado o que teremos em cada page .jsp.

  2. Na página acessonegado.jsp insira o código a seguir:

    E-mail/Senha inválido.Tente novamente  />
  3. Na página index.jsp deixe conforme abaixo

     Acessar minha conta
  4. agora na pagina index.jsp dentro de /admin deixe assim:

    Está é uma página de conteúdo restrito. 🙂

Até aqui nada de especial. Agora que começa a segurança.

  1. Primeiro ponto é você deixar o tomcat parado e ir no caminho a seguir (caso tenha instalado no modo default):

    C:\Program Files\Apache Software Foundation\Tomcat 6.0\conf

  2. Abra o arquivo server.xml

    Precisamos dizer ao TomCat que vamos habilitar o Realm, a linha vem comentada, para isso tire o comentário da linha a seguir:

    <Realm className=”org.apache.catalina.realm.MemoryRealm”/>

  3. Salve e feche o arquivo

  4. Agora vá no arquivo tomcat-users.xml no mesmo diretório do arquivo server.xml.

    Nesse arquivo criamos os usuários que terão acesso aplicação e qual role ele pertence.

    rolecode

  5. Não é muito difícil de ler, veja:

    “lopes É-UM manager. Porém, admin e camilo são um manager e admin.”

  6. O relacionamento aqui é one-to-many, nao se esqueça disso. Ou seja, um usuário pode ter mais de um nível de acesso.

  7. Lembre-se isso ai só são strings. O poder deles está quando criamos as restrições no arquivo web.xml.

Criando as regras de acesso

Agora precisamos criar as regras de acesso, dizer o que um “manager” pode acessar e o que um “admin”pode acessar.

  1. Abra o arquivo web.xml da sua aplicação.

webxml

Antes do primeiro código você precisa saber disso:

  • <security-constraint>: Protege um recurso, ou seja, diz o que será protegido e quem pode acessar.

  • <auth-constraint>: Isto especifica os roles que são permitidos acessar recursos cobertos por esta limitação de segurança.

  • <web-resource-collection>: sub-elemento de <security-constraint> que diz o que será registro.

  • <login-config>: diz qual o tipo de autenticação. Há quatros tipos: BASIC, DIGEST, FORM, SSL.

Para o nosso exemplo usaremos o FORM. O BASIC ele usa a caixa de autenticação do browser.

  1. insira o código abaixo no seu arquivo web.xml


Atenção:

Agora tenha atenção com o código de <login-config> Muitos confundem, achando que se o login/senha estiver OK. Vá para a página que está em <form-login-page> , mas ali que temos nenhuma condição IF.

O segredo é que antes de ir para tela de login, vc precisa ter tentando acessar o conteúdo restrito(na realidade é isso que acontece, pense um pouquinho…), assim o servidor vai saber o que fazer com vc que acessar caso seu login/senha válido, ou seja, enviar você para a página que foi solicitada (requested).

Se você, tentar direto para página de login, sem tentar acessar um conteúdo restrito, como o servidor vai saber encaminha-lo? Já que no action do form não há nada que diz “vá para pagina XYZ”.

  1. veja o código do form login.jsp

    Login
    Usuario: Senha:
  2. O atributo name, action deve ser com os nomes acima. Caso contrário, nada funciona como esperado. E nao esqueça que o método deve ser post, pois é um FORM.

Eu tenho o hábito de dizer: “Primeiro erre, para depois acertar”. Ou seja, primeiro tente acessar se não conseguir use seu login/senha. O máximo que vai receber é dizer que você não tem permissão para acessar.

Testando

*não esqueça dos starts/stops que você deve dar sempre que atualizar os arquivos .xml do tomcat.

Para testar vamos fazer um deploy da nossa app. Vamos usar um arquivo WAR, se não sabe como exportar um projeto como WAR veja no post indicado no inicio do post.

Abaixo como ficou minha exportação:

Veja meus teste de acesso:

  1. Tentando com o usuário camilo


  2. Resultado:


  3. Tentando com o usuário lopes


  4. Resultado:


Agora é com você

Experimente testar acessando o conteúdo restrito direto, tente colocar usuário inexistente, ou usuário com roles diferentes ao acesso permitido. E para ficar uma mensagem de erro personalizada, crie suas proprias páginas de erro.

Bom ficando por aqui, acho que este foi um dos maiores posts que já escrevi e nao sou a favor de posts grandes, mas foi necessário. O assunto precisava ser detalhado e olha que nao fui tanto assim. Vi vários outros posts na internet porém os que encontrei estava resumido demais e para quem está dando os primeiros passos pode se tornar complicado o processo. Espero que tenham gostado.

Abraços, see you next post. :).

Criando Projeto Struts no Eclipse Jboss tools

 

Olá Pessoal,

Nesse post veremos como criar um projeto Struts no Eclipse, veja como é bem simples ter um Struts Project usando o Jboss Tools. Se não tem o Jboss tools configurado no eclipse veja o “post relacionado”. O objetivo deste post é para quem está querendo dar os primeiros passos com Struts, porem nao sabe por onde começar.

Lets go…

 

 

Não irei abordar alguns conceitos tais como: vantagens, quando usar?, por que usar?. Na verdade isso daria um novo post. Para quem tiver interesse em saber mais sobre Struts podem dar uma olhada no link a seguir e também nas vagas de emprego para Java, tenho 99% de certeza de 10 vagas para programador JEE minimo 8 vão pedir do candidato Struts como requisito.

O que é Struts?

Post Relacionado

 

  1. Uma vez com o JBoss configurado, clique em File ==> Project

  2. Localize o diretório Jboss Tools Web

  3. E agora dentro do diretório Struts escolha Struts Project

  4. Clique em next

  5. Dê um nome ao seu projeto e clique em next

  6. Agora escolha o servidor. Nesse caso vamos usar usar TomCat 6

  7. clique em Next

  8. Clique em finish

  9. A estrutura criada deve ser a semelhante a imagem a seguir.

  10. Agora vamos criar uma classe Java com Struts que vai imprimir apenas uma mensagem no browser confirmando a execução do Struts. Portanto crie um package br.com.camilo.struts

  11. Agora crie uma nova classe no package criado no passo anterior, com o nome de TesteStruts tendo como SuperClass a classe Action do Struts. Veja como deve ficar:

  12. Agora atualize sua classe com o código abaixo

 

package br.com.camilo.struts;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class TesteStruts extends Action {
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception{
		/* esse metodo retorna uma mensagem para o struts-config.xml
		 * ao chegar no arquivo struts-config.xml e encontrar o nome done
		 * a pagina eh encaminhada para um arquivo .jsp
		 */
		return mapping.findForward("done");}}

    Mas por que fazer o forward via arquivo .xml do Struts se posso fazer direto do arquivo .java colocando o xx.jsp ??

    A resposta é bem simples se o nome do arquivo mudar, e vc tem 10 classes que faz esse forward para aquele arquivo o que fazer? Atualizar manualmente arquivo por arquivo e se vc esquecer de 1 ou 2 ou mais. Se for 100 arquivos ? Então percebeu o problema? Com o .xml vc somente vai precisar alterar em um local o novo nome do arquivo. Claro que vc pode cair na mesma situação se inventar de alterar o nome de retorno para aquele tipo de redirecionamento, mas ai é outra situação.

     

    1. crie agora um arquivo .jsp chamado de teste.jsp (clique com o botão direito no projeto ==> New File ==> JSP )

    2. Dentro da tag <body> digite a mensagem que deseja visualizar para testar a funcionalidade do Struts.

    3. Agora abra o arquivo struts-config.xml no modo Source.(veja no rodapé do eclipse esta opção)

      Precisamos configurar agora o nosso arquivo .xml do Struts para fazer o redirecionamento é bem simples. Deixe conforme a seguir. Um

      Erro comum a ser cometido é o esquecimento de colocar / no path e o nome class em type.

      1. Para testar nossa aplicação vamos digitar http://localhost:8080/app/testando.do

      2. Esse .do vem la da configurado do arquivo web.xml, abra o arquivo e veja pq nesse caso devemos ter o .do. Não existe nenhum arquivo físico com esta extensão é apenas um nome lógico utilizado e uma recomendação.

      3. Antes de testar aplicação precisamos reiniciar o TomCat então clique no botão do meio.

        Se não encontra-lo, veja em que perspectiva vc está usando. Deveria ser Java EE

      4. Agora abra o webbrowser dentro do próprio eclipse

      5. E digite o endereço abaixo, caso seguiu o mesmo nome usado nesse post

        http://localhost:8080/BlogStruts/testando.do

      6. O resultado deve ser o seguinte:

         

      Bom vou ficando por aqui e espero que tenham gostado dessa pequena introdução com Struts. Foi na verdade mais uma motivação para quem colocou o framework na lista de estudos. Abraco a todos e até o próximo post.

       

      Criando Projeto Struts no Eclipse usando Jboss tools

       

      Olá Pessoal,

       

      Nesse post veremos como criar um projeto Struts no Eclipse, veja como é bem simples ter um Struts Project usando o Jboss Tools. Se não tem o Jboss tools configurado no eclipse veja o “post relacionado”. O objetivo deste post é para quem está querendo dar os primeiros passos com Struts, porem nao sabe por onde começar.

       

      Lets go…

       

      Não irei abordar alguns conceitos tais como: vantagens, quando usar?, por que usar?. Na verdade isso daria um novo post. Para quem tiver interesse em saber mais sobre Struts podem dar uma olhada no link a seguir e também nas vagas de emprego para Java, tenho 99% de certeza de 10 vagas para programador JEE minimo 8 vão pedir do candidato Struts como requisito.

       

      O que é Struts?

       

      Post Relacionado

       

       

      1. Uma vez com o JBoss configurado, clique em File ==> Project

      2. Localize o diretório Jboss Tools Web

      3. E agora dentro do diretório Struts escolha Struts Project

        <struts1>

      4. Clique em next

      5. Dê um nome ao seu projeto e clique em next

        <struts2>

      6. Agora escolha o servidor. Nesse caso vamos usar usar TomCat 6

        <struts3>

      7. clique em Next

        <struts4>

      8. Clique em finish

      9. A estrutura criada deve ser a semelhante a imagem a seguir.

        <struts5>

      10. Agora vamos criar uma classe Java com Struts que vai imprimir apenas uma mensagem no browser confirmando a execução do Struts. Portanto crie um package br.com.camilo.struts

      11. Agora crie uma nova classe no package criado no passo anterior, com o nome de TesteStruts tendo como SuperClass a classe Action do Struts. Veja como deve ficar:

        <struts6>

      12. Agora atualize sua classe com o código abaixo

        package br.com.camilo.struts;

        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;

        import org.apache.struts.action.Action;
        import org.apache.struts.action.ActionForm;
        import org.apache.struts.action.ActionForward;
        import org.apache.struts.action.ActionMapping;

        public class TesteStruts extends Action {

        public ActionForward execute(ActionMapping mapping, ActionForm form,
        HttpServletRequest request, HttpServletResponse response) throws Exception{
        /* esse metodo retorna uma mensagem para o struts-config.xml
        * ao chegar no arquivo struts-config.xml e encontrar o nome done
        * a pagina eh encaminhada para um arquivo .jsp
        */

        return mapping.findForward(“done”);
        }
        }

       

      Mas por que fazer o forward via arquivo .xml do Struts se posso fazer direto do arquivo .java colocando o xx.jsp ??

      A resposta é bem simples se o nome do arquivo mudar, e vc tem 10 classes que faz esse forward para aquele arquivo o que fazer? Atualizar manualmente arquivo por arquivo e se vc esquecer de 1 ou 2 ou mais. Se for 100 arquivos ? Então percebeu o problema? Com o .xml vc somente vai precisar alterar em um local o novo nome do arquivo. Claro que vc pode cair na mesma situação se inventar de alterar o nome de retorno para aquele tipo de redirecionamento, mas ai é outra situação.

       

      1. crie agora um arquivo .jsp chamado de teste.jsp (clique com o botão direito no projeto ==> New File ==> JSP )

      2. Dentro da tag <body> digite a mensagem que deseja visualizar para testar a funcionalidade do Struts.

         

        Executando minha pagina com Struts
      3. Agora abra o arquivo struts-config.xml no modo Source.(veja no rodapé do eclipse esta opção)

        Precisamos configurar agora o nosso arquivo .xml do Struts para fazer o redirecionamento é bem simples. Deixe conforme abaixo:

        <code>

       

      Erro comum a ser cometido é o esquecimento de colocar / no path e o nome class em type.

       

      1. Para testar nossa aplicação vamos digitar http://localhost:8080/app/testando.do

      2. Esse .do vem la da configurado do arquivo web.xml, abra o arquivo e veja pq nesse caso devemos ter o .do. Não existe nenhum arquivo físico com esta extensão é apenas um nome lógico utilizado e uma recomendação.

      3. Antes de testar aplicação precisamos reiniciar o TomCat então clique no botão do meio.

        <struts7>

        Se não encontra-lo, veja em que perspectiva vc está usando. Deveria ser Java EE

      4. Agora abra o webbrowser dentro do próprio eclipse

        <struts8>

      5. E digite o endereço abaixo, caso seguiu o mesmo nome usado nesse post

        http://localhost:8080/BlogStruts/testando.do

      6. O resultado deve ser o seguinte:

        <struts9>

         

      Bom vou ficando por aqui e espero que tenham gostado dessa pequena introdução com Struts. Foi na verdade mais uma motivação para quem colocou o framework na lista de estudos. Abraco a todos e até o próximo post.

    JPA com Java Básico MySql

    olá pessoal, nesse post vou apresentar como fazer persistência de dados usando apenas JPA, mas com Java Básico o objetivo é ajudar aqueles que estão dando o primeiro passo com a tecnologia. Não confunda este post com este Java Básico + Hibernate JPA + Mysql são parecidos, mas aqui nos não vamos envolver nada de Hibernate, ou seja, será 100% JPA.

    Recomendado: Você vai precisar configurar a JPA no seu projeto Java, portanto veja no post abaixo:

    *Basta adicionar ao seu projeto o arquivo .jar referente a JPA do pacote hibernate annotations. Nada mais que isso, confira: Java Básico + Hibernate JPA + Mysql

    Outros posts relacionados:

    Preparando o ambiente desenvolvimento

    1. crie um Java project no eclipse

    2. E monte conforme a estrutura abaixo:

    3. A classe TesteJPA  deve conter o método main.

    4. Não esqueça de adicionar o .jar ao seu projeto. Se tem dúvida com fazer isso veja nos posts citados acima.

    Preparando Banco de Dados

    Vamos usar o MySql como BD e vou levar em conta que você já tem o mesmo instalado e configurado. Crie apensa um DataBase e uma table para este. Se quiser seguir o exemplo do post o nosso ficou assim:

    DataBase: sistemas Table: Cliente

    A tabela cliente possui os seguintes campos como VARCHAR(nome,cidade,sobrenome)e um Integer(id). O id é auto_increment e chave-primaria da tabela.

    Desenvolvimento

    Explicando as anotações
    @Entity = é uma entidade que representa uma class bean;
    @Table = mapeia com o nome da tabela. Aqui eu coloquei o table para explicar, mas poderia omitir levando em conta que eu teria uma table no meu BD com o mesmo nome da minha class Bean. Ou seja, se você não especificar qual será a tabela do BD, será considerada o nome do Bean. Tenha atenção se você tem tabelas com nomes diferentes em relação ao seu bean;
    @Id = tem relação com a chave primaria da sua tabela;
    @Column = mapeia com as colunas da sua tabela, segue a mesma regra de table, quando ter colunas com nomes diferentes este campo eh obrigatório, caso contrario non-required ;

    Deixe sua classe Cliente.java conforme abaixo:

    package br.com.bean;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.Table;
    @Entity
    @Table(name="cliente")
    public class Cliente {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    	private int id;
    	private String nome;
    	private String cidade;
    	private String sobrenome;
    
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getNome() {
    		return nome;
    	}
    	public void setNome(String nome) {
    		this.nome = nome;
    	}
    	public String getCidade() {
    		return cidade;
    	}
    	public void setCidade(String cidade) {
    		this.cidade = cidade;
    	}
    	public String getSobrenome() {
    		return sobrenome;
    	}
    	public void setSobrenome(String sobrenome) {
    		this.sobrenome = sobrenome;
    	} }

    A classe ClienteDAO é responsável por implementar o CRUD usando a JPA, vamos ver aqui o salvar, excluir e atualizar. Então atualize seu arquivo ClienteDAO.java conforme abaixo:

    package br.com.dao;
    
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.Persistence;
    
    import br.com.bean.Cliente;
    
    public class ClienteDAO {
    
    	EntityManagerFactory emf; 
    
    	private EntityManager getEntityManager(){
    		return emf.createEntityManager();
    	}
    	public ClienteDAO() {
    	emf = Persistence.createEntityManagerFactory("sistemas");
    	}
    
    	public void salvar(Cliente cliente){
    		EntityManager em = getEntityManager();
    		try{
    			em.getTransaction().begin(); //inicia o processo de transacao
    			em.persist(cliente);//permite fazer insercoes e atualizacoes no bd
    			em.getTransaction().commit();//realizo as alteracoes no banco
    		}catch (Exception e) {
    			em.getTransaction().rollback();// se rolar uma excecao cancelo acao
    			e.printStackTrace();//mostro o percurso de onde veio as excecoes
    		}finally{
    			em.close();
    		}
    	}
    	public void excluir(Cliente cliente){
    		EntityManager em = getEntityManager();
    
    		try{
    			em.getTransaction().begin();
    			cliente = em.merge(cliente);
    			em.remove(cliente);
    			em.getTransaction().commit();
    		}catch (Exception e) {
    			em.getTransaction().rollback();
    		}
    	}
    	public void atualizar(Cliente cliente){
    		EntityManager em = getEntityManager();
    		try{
    			em.getTransaction().begin();
    			em.merge(cliente);
    			em.getTransaction().commit();
    		}catch (Exception e) {
    			em.getTransaction().rollback();
    		}}
    	}
    1. Fazendo a persistência de dados no arquivo persistence.xml. Precisamos passar as informações do BD, user, password etc para o arquivo persistence.xml, assim conseguimos a conexao com o nosso BD. Então atualize o arquivo .xml conforme o code abaixo(tive que dar um espaco entre os <  >  pois o plugin para code não estava reconhecendo com XML):

      org.hibernate.ejb.HibernatePersistence
      < persistence-unit name="sistemas" transaction-type="RESOURCE_LOCAL">
      org.hibernate.ejb.HibernatePersistence
              
      		br.com.bean.Cliente
      
                  
                  < property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect" />
                  < property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
                  < property name="hibernate.connection.url" value="jdbc:mysql://localhost/sistemas" />
                  < property name="hibernate.connection.username" value="camilo" />
                  < property name="hibernate.connection.password" value="integrator" />
       
                  < property name="hibernate.show_sql" value="true" />
                  < property name="hibernate.format_sql" value="true" />
                  < property name="use_sql_comments" value="true" />
      
              < /properties>
      
          < /persistence-unit>
    2. Atualizando a classe TesteCliente.java. Precisamos ter uma classe para testar o nosso CRUD com JPA. Para isso teremos uma classe java tradicional com o método main. Eu comentei algumas linhas apenas para poder testar outros recursos. Mas, levando em conta que sua table não há nenhuma informação, vamos executar primeiramente a opção salvar.

      package br.com.teste;
      
      import br.com.bean.Cliente;
      import br.com.dao.ClienteDAO;
      
      public class TesteCliente {
      
      	/**
      	 * @param args
      	 */
      	public static void main(String[] args) {
      		ClienteDAO clidao = new ClienteDAO();
      		Cliente cliente = new Cliente();
      	//	cliente.setCidade("salvador");
      		cliente.setNome("recife");
      		cliente.setSobrenome("neto");
      		//cliente.setId(12);
      		clidao.salvar(cliente);
      		//clidao.excluir(cliente);
      	//cliente.setCidade("Sao Paulo");
      		//cliente.setId(15);
      		//clidao.atualizar(cliente);
      	}
      }

    Não Esqueça:

    • Esteja certo que você deu um start no seu BD.

    • não esqueça dos .jars no seu projeto.

    Verificando dados no BD

    1. Acesse seu banco de dados e veja se a informação inserida realmente consta na tabela. Aqui usei uma ferramenta chamada Mysql Query Browser para facilitar o trabalho com o BD. No meu caso eu fiz varias alterações.

    Vou ficado por aqui e espero que tenham gostado do post. Para quem está em primeiro contato com a tecnologia pode parecer difícil, estranho ou complicado essa estrutura da JPA, mas pode ter certeza que é mais produtivo no ciclo de desenvolvimento.

    Abraços e até o próximo post.