Automatizando seu DB com FlyWay Plugin – MySql

Olá Pessoal,

No post de hoje vou mostrar para vocês como podemos automatizar a criação de um banco de dados usando o plugin flyway. Aqui na ITS temos usado o plugin para aumentar a produtividade e sempre manter a integridade dos ambientes.

Lets go…

O problema

Há várias ferramentas e formas de automatizar a criação das tabelas do banco com cenários já prontos ou até vazios.  Aqui na ITS, para os projetos Java temos usado o flyway, apesar de que testamos outras como o DBMaintain, mas optamos pelo plugin flyway, já que em termos de resultado final era semelhante ao dbmaintain, porém a curva de aprendizado e configuração  era mais rápida.  Para projetos Ruby, estamos vendo outra solução.

O problema que tínhamos aqui era a criação da base de dados para cada ambiente, desde local até ambiente de INT, DEV e PROD. A modelagem do banco pode mudar (e certamente vai) e quando isso acontece, o problema está feito. Como atualizar cada ambiente rapidamente?

Opção 1

Criar um dump do banco e rodar o .sql em cada ambiente manualmente.

Opção 2

Automatizar esse processo de update.

Nesse post vamos nos limitar apenas em como gerar a base de dados rapidamente. Em outro post veremos como atualizar outros ambientes através de uma ferramenta de build continuous como o Jenkins. 

A opção 1 funciona, mas não é a ideal, pois é preciso logar em cada ambiente e rodar o .sql. Isso consome tempo e é chato de fazer, ninguém gosta de fazer esse trabalho repetitivo. E se o banco durante o dia mudar 3 ou 4 vezes? Quantas vezes você vai executar a opção 1? Se você tem 3 ambientes para atualizar será preciso fazer isso 3 vezes a cada mudança. Péssimo, não? 

A opção 2

Você pode automatizar. Há ferramentas que ajudam a fazer isso usando um Servidor de Build como o Jenkins ou até como plugin maven.  Já usei o dbmaintain, mas analisando outras opções encontrei o flyway, até porque o desenvolvedor pode rodar o plugin local e se tiver o banco de dados rodando em segundos ele tem o ambiente local atualizado.

Configurando o FlyWay  via Maven

Antes de tudo você precisa ter um arquivo .sql que irá criar as tabelas e ele deve estar nessa estrutura: src/main/resources/db/migration

flywaysql

E o nome do arquivo tem que ser V1__QUALQUERNOME.sql

São 2 underscore. Se seu banco mudou você precisa ter um V2 e assim por diante. O flyway faz um tracking disso e salva em uma tabela schema_version. Se você tem mais de um ambiente, sugiro dar uma lida nesse post:

http://lwandersonmusings.blogspot.com/2012/07/using-maven-to-integrate-flyway.html

Vamos ver na prática um simples exemplo. Vou considerar que você já tem um projeto Maven

Step 1

Abra o pom e adicione:

<plugin>

                           <groupId>com.googlecode.flyway</groupId>

                           <artifactId>flyway-maven-plugin</artifactId>

                           <version>2.2.1</version>

                           <configuration>

                                  <url>jdbc:mysql://localhost:3306/seu_database</url>

                                  <user>camilo </user>

                                  <password>2014</password>

                           </configuration>

                           <dependencies>

                                  <dependency>

                                        <groupId>mysql</groupId>

                                  <artifactId>mysql-connector-java</artifactId>

                                        <version>5.1.25</version>

                                  </dependency>

                           </dependencies>

                    </plugin>

 

 Step 2

Garanta que o banco foi inicializado.

Step 3

Garanta que o database exista, caso contrário o flyway não vai conseguir conectar.

flywaydatabase

Step 4

via command line (se preferir pode usar o Eclipse) digite o seguinte comando:

flywaycommandmigrate

Step 5

Veja o resultado:

flywaycommandmigrateresult

 

flywaytablecreated

Observe que as tabelas foram criadas. Tive que ocultar os nomes das tabelas. 

Simples não?

Alguns comandos básicos

mvn flyway:clean

 

Limpar o Database, ou seja, todas tables são apagadas.

mvn flyway:info

 

Mostra quando o último script foi rodado e o status.

mvn flyway:migrate

 

Faz a migração, ou melhor, executa o .sql em si.

Note: Você pode usar o recurso de profiles e ter diferentes execuções para o flyway.

O flyway tem se mostrado um plugin muito bom no dia a dia e atendendo aos requisitos que precisamos, sem falar que tem uma boa documentação e os posts no blog deles tem sido bem mão na massa. 

Abraços, see ya!! 

Fazendo Deploy de sua aplicação JEE no OpenShift

Olá Pessoal

O post de hoje é para quem deseja fazer deploy de sua app na nuvem e sem custo. O openShift é uma plataforma de cloud da RedHat que permite fazer isso de forma gratuita, até 1 GB de Storage. Show, heim? Nunca tinha usado o OpenShift, e daí resolvi fazer o deploy da app I4JSFDemo, que é um exemplo de uso da API I4JSF.

Lets go…

Primeiro passo

Ter uma conta no OpenShift. Abra sua conta, it is very easy.

Segundo Passo

Você precisa  gerar o SSH. Se você usa o Git com o GitHub certamente vai ter um id_rsa e id_rsa.pub  em .ssh. Portanto abra o arquivo .id_rsa.pub e deixe aberto por enquanto.

Terceiro Passo

Clique em create application e siga os passos

openshiftcreateapp

Escolha em browser by tag a opção Java. Assim teremos os servers Java:

 

openshifttagjavaappserver

No meu caso vou escolher TomCat .

Quarto Passo

Após ter criado a app vá em My Application e veja que ela está lá. Clique na setinha que está apontando para a direita e assim teremos detalhes da app. Veja:

 

openshiftgitrepo

Observe que você tem o url do repositório. Faça o clone desse repositório.

Quinto Passo

git rm -r src/ pom.xml

Assim vamos remover os arquivos default criado pelo OpenShift.

Sexto Passo

Coloque seu .war em webapps

Sétimo Passo

Faça um commit  e push

 git commit –am “my first commit openshift”  git push

Aguarde o push terminar e observe que o openshift vai fazer build da sua aplicação e o deploy. 

 

openshiftpush

 

openshiftbuildsucess

Aqui eles explicam o que acontece quando faz um push:

https://www.openshift.com/developers/deploying-and-building-applications

Outro link legal:

https://github.com/openshift/origin-server/blob/master/cartridges/openshift-origin-cartridge-jbossews/README.md

Resultado:

openshiftresultapp

 

Link da APP

http://i4jsfdemo-camilolopes.rhcloud.com/i4jsfdemo/

Conclusão

  • – Deploy muito fácil;
  • – Boa documentação;
  • – Podemos logar na aplicação via command line com o Putty por exemplo;
  • – É grátis até 1GB de Storage;

Se você pretende fazer uma POC a versão free atende bem.

No mais é isso. Espero que tenham gostado do post.

See ya!!

Abraços

Novo curso: Desenvolvimento de Aplicações JEE Utilizando Frameworks

olá Pessoal, 
 
O post de hoje tem como objetivo apresentar para vocês um novo curso que lançei recentemente pelo IMasterPro. O objetivo é para aqueles iniciantes no mundo JEE  usando frameworks possam ter a oportunidade de colocar mão na massa usando aqueles frameworks que mais ouvimos no dia-dia tais como “Hibernate, JSF, SpringSecurity etc”. A seguir apresento um pouco sobre o curso.
 
Lets go.. 
 
 
Sobre Curso 
 
O curso tem como objetivo de ser prático com exercícios e explicações mão na massa, pois acredito que só aprende praticando, afinal de contas você não vai aprender a dirigir se ler um manual de como dirigir ou apenas como dar partida no carro, isso não é o suficiente para você falar que sabe dirigir, é preciso praticar dia-dia para se tornar um melhor motorista, foi com esse conceito que o criei o curso. 
 
 
O que veremos? 
 
Ahh coloquei um pouco de tudo, Hibernate, SpringSecurity, JSF, Mysql 5.x etc. Vamos misturando um pouco daqui e dali, criando pequenas aplicações e evoluindo a cada aula o aprendizado.
 
O que NÃO é o objetivo do curso 
 
Este não tem como objetivo torná-lo especialista em cada framework, até porque é impossível se tornar especialista em tantas tecnologias em algumas horas apenas. Não tenha essa expectativa. A idéia aqui é para quem quer sair do 0x0.
 
Publico Alvo
Eu digo que é iniciante no mundo JEE e não iniciantes em Java. Se você é iniciante no mundo Java, favor não faça o investimento agora.  Na página do curso eu falo dos requisitos esperados que tenha antes de fazer o investimento.
Mais detalhes do curso
 
Vou ficando por aqui… 
 
abracos, see ya!!!!

Java WebServices com BD

Olá Pessoal,

Dando continuidade aos post sobre webservice neste ultimo desta série, vamos ver como ter uma aplicação que faz pesquisa no banco de dados e vamos disponibilizar essa pesquisa via webservice. Um cliente nosso, vai consumir essa webservice e conseguir pesquisar em nosso banco, então deixar o “hello world” de lado. Ah, vamos usar o Hibernate framework para fazer a consultar no banco.Outro detalhe, não seguir as melhores praticas para criar  DAO genérica, fiz tudo em uma classe, o objetivo aqui não é DAO, Hibernate etc. E sim disponibilizar um web service para que possa ser consumido pelos clientes, que será uma consulta de clientes pelo ID.

Lets go…

Requisitos

  • Java 6 ou mais recente
  • MySql 5
  • Hibernate

Contexto

Se você não entendeu bem o contexto, vou dar um pouco mais de detalhe, antes de começarmos a desenvolver. Vamos ter dois projetos, um que é a nossa aplicação que pesquisa clientes por ID e o outro o projeto do fornecedor que vai consumir a webservice. O nosso banco já está populado com alguns clientes. No nosso caso serão poucos dados apenas o ID e o CPF.

Desenvolvendo

Nosso código será um pouco grande, pois vou incluir parcialmente o código do Hibernate,  também vou considerar que já conhece o framework, sendo assim, não irei explicar código que não seja relacionado webservice. Se tem dúvida com o Hibernate, pode visitar nossa categoria aqui no blog e ver o que temos por lá.  Certifique-se também que você tem uma tabela no banco populada:

A minha tabela chamei de Cliente.

Crie o projeto Java Project aqui chamei de WSDAO.

Não esqueça de adicionar os .jars do Hibernate  & MySQL ao seu projeto.

Vamos começar pelo bean, então crie uma classe cliente conforme abaixo, os getters/setters foram omitidos.

@Table

@Entity

public class Cliente {

      @Id

      @Column(name=”ID_CLIENTE”)

      @GeneratedValue

      private int id;

      @Column

      private long cpf;

//getters/setters omitidos

Agora vamos criar o nosso DAO, para isso crie uma classe conforme abaixo:

public class ClienteDAO {

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

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

      public Session getSession(){

            Session session = threadLocal.get();

            if (session == null) {

                  session = sessionFactory.openSession();

                  threadLocal.set(session);

            }

            return session;

      }

      public Cliente getCliente(int id) {

            Session session = getSession();

            Cliente cliente = new Cliente();

            try{

                  session.beginTransaction();

            String hql = “from Cliente where id=:idvalue “;

            Query query = session.createQuery(hql );

                  query.setInteger(“idvalue”, id);

                  cliente = (Cliente) query.uniqueResult();

            }catch (HibernateException e) {

                  e.printStackTrace();

            }finally{

                  session.close();

            }

            return cliente;

      }

Criando agora o nosso SEI:

@WebService

public interface Service {

      @WebMethod

      Cliente getCliente(int id);

}

Criando SIB

@WebService(endpointInterface=”br.com.camilolopes.ws.sei.Service”)

public class ServiceImpl implements Service {

      private ClienteDAO clienteDAO = new ClienteDAO();

      @Override

      public Cliente getCliente(int id) {

            return clienteDAO.getCliente(id);

      }

}

Publicando o serviço:

public class ClientePublish {

      public static void main(String[] args) {

            Endpoint.publish(“http://localhost:9876/wscliente”, new ServiceImpl());

      }

}

Testando com SOAPUI

            Agora precisamos testar, então suba o serviço rodando a classe ClientePublish(Run → as    → Java Application ) e em seguida abra o SOAPUI, crie um projeto e passe a url do  com o wsdl (no meu caso: http://localhost:9876/wscliente?wsdl)

            Ao adicionar url certamente verá o método getCliente a esquerda na tela da esquerda da ferramenta, click no sinal + e dê dois cliques no request1. Sua tela deve ser conforme a image a seguir:

Na tag <arg0>?</arg0> vamos passar o ID do cliente que queremos buscar, então informe os Ids válidos conforme vimos mais cedo na tabela do DB. Vou informar o ID 1 e ele deve retornar o resultado na aba que está a esquerda. Troque a  ? por 1 e execute clicando no botão submit request (uma seta verde que está na parte superior da tela)

note: lembre-se que seu serviço deve tá publicado, ou seja, a classe que faz o publish deve tá rodando. No caso do exemplo do post chamei ela de ClientePublish.

O resultado é conforme a imagem a seguir:

Observe que temos o resultado no formato XML a direita. E  oque acontece se o ID  não existir? Simplesmente não traz nada. :).

Criando o Cliente para Consumir

Agora vamos criar um cliente que vai conseguir esse nosso webservice  que faz uma pesquisa no banco de dados pelo ID do cliente. Para ficar claro e separar o projeto webservice do cliente, vamos criar um projeto separado, lembrando que uma vez o serviço publicado este projeto cliente que vai consumir o webservice, não necessariamente precisa ser desenvolvido em Java, poderia ser em .NET, PHP etc.

Step 1

Crie um novo projeto Java, o do post chamei de WSDAOConsumer somente para facilitar o entendimento no post.

note: não crie os packages conforme a imagem acima, apenas o projeto por enquanto, beleza?

Step 2

            via prompt de comando acesse o src do projeto

Step 3

            import o wsdl para o projeto:

wsimport -keep -p br.ws.cliente http://localhost:9876/wscliente?wsdl

note: Se você não quiser rodar o comando wsimport verifique se a sua IDE dá suporte  na importação do wsdl de maneira visual e execute, o resultado será o mesmo. Depender da versão do Eclipse que estiver usando você terá o suporte.

Step 4

            crie em um package separado a classe que vai usar as operações do service

public class Consumer {

      public static void main(String[] args) {

            Service service = new ServiceImplService().getServiceImplPort();

                  Cliente cliente = service.getCliente(1);

                  System.out.println(cliente.getId());

                  System.out.println(cliente.getCpf());

      }

}

O resultado é mais simples possível, apenas imprime o resultado no console:

A questão é: “imprime no console, porque o meu projeto é assim, ele usa o prompt para imprimir as coisas que ele consome do web service”.Analise e pense dessa forma com o exemplo acima.Porém, Se fosse um projeto JEE eu poderia exibir isso em uma view JSF em uma tabela ou também não poderia exibir em lugar nenhum, e pegar o resultado do WS e salvar em tabela no meu banco de dados, enfim são N possibilidades que podemos fazer com os dados que estamos consumindo, isso vai está atrelado as regras de negócio do seu projeto. Resolvi trazer essa abordagem, para quem está chegando não ache que para consumir um web service deve rodar em cima de Java Application apenas.

Vou ficando por aqui, espero que vocês tenham gostado dessa  série de posts sobre web service.

Abraços, see ya!!

Throubleshooting MySql Case Sensitive Criteria Hibernate

 

Olá Pessoal,

Mais um thoubletshooting, e dessa vez é com o Mysql. É aquela velha frase “vivendo e aprendendo”. No dia a dia trabalho com outros bancos de dados, mas nos meus projetos house-made gosto do mysql.

Um dia desses estava desenvolvendo e um dos requisitos era considerar o case-sensitive. Dai vou lá feliz da vida usando o Criteria do Hibernate com o MySql:

criteria.add(Restrictions.eq(“email”, email));

criteria.add(Restrictions.eq(“password”, password));

E o que acontece?

Simplesmente se tiver:

camilo@camilolopes.com com o password: 123cam

e

camilo@camilolopes.com com o password: 123CAM

Teremos dois registros no retorno.

Daí fui ver na documentação o motivo e achei isso:

http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html

Solução

Como podemos ver na documentação acima, o Mysql trata Varchar como case-insensitive. Daí ao criar a tabela devemos setar a flag Binary. Caso  a tabela já exista, basta dar um alter table

ALTER TABLE `user` MODIFY COLUMN `EMAIL` VARCHAR(255) BINARY CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL;

Pronto. E resolvido.

Vou ficando por aqui.

See ya!!!