Conteúdo


Fundamentos do IBM Cloud: inclua um banco de dados SQL no app Java

Introdução aos serviços de banco de dados do IBM Cloud

Visão geral

Aprenda como criar e incluir um banco de dados SQL nos aplicativos da web Java no IBM Cloud. Explore uma loja da web acionada por dados, gerada dinamicamente, que altera sua aparência dependendo do nível de estoque do inventário atual. Use o SQL Database Console do IBM Cloud, baseado na web, para visualizar e manter bancos de dados SQL.

Este tutorial faz parte da série de tutoriais "fundamentos do IBM Cloud" no developerWorks.

 

O que você fará neste tutorial

Etapa 1. Fazer download do código

Etapa 2. Implementar o arquivo WAR no IBM Cloud

Etapa 3. Criar uma instância de serviço do banco de dados SQL e ligá-la ao app

Etapa 4. Importar o app na área de trabalho do Eclipse

Etapa 5. Examinar a estrutura do código

Etapa 6. Criar um WAR ativado por dados e implementar no IBM Cloud

Etapa 7. Incluir dados com JPA

Etapa 8. Acessar o banco de dados SQL usando o SQL Database Console do IBM Cloud

Etapa 9. Explorar a geração dinâmica de website acionado por dados

Outros serviços do IBM Cloud

Hora da avaliação!

Parabéns— você concluiu os fundamentos do IBM Cloud!

Vamos começar

No tutorial anterior, "Inclua um mundo de serviços de nuvem no aplicativo", você aprendeu que os serviços são, simplesmente, códigos hospedados no IBM Cloud ou por parceiros terceiros que possam agregar valor aos apps implementados no IBM Cloud.

Os serviços fornecem funções eficientes aos apps, como bancos de dados, suporte de aplicativo móvel, analítica, integração de sistemas legados e gerenciamento de segurança. Eles são semelhantes a plug-ins, no sentido de que podem ser incluídos e ligados ao app a qualquer momento.

Dos serviços disponíveis do IBM Cloud, os serviços de banco de dados são os usados com maior frequência. E o serviço do banco de dados SQL é uma das adições de aplicativo da web mais populares.

A maioria dos aplicativos da web que são projetados para a arquitetura clássica de três camadas (como apps Java EE) requer um serviço de banco de dados na terceira camada:

Diagram of the three-tiered architecture
Diagram of the three-tiered architecture

A lógica do aplicativo é executada na camada do aplicativo stateless, e os dados são armazenados na camada do banco de dados. Essa arquitetura permite ampliar o aplicativo para um número crescente de usuários, simplesmente aumentando o número de instâncias do aplicativo.

Aqui está uma visão geral rápida de como será o trabalho com o IBM Cloud neste tutorial, para incluir um serviço do banco de dados SQL no aplicativo do IBM Cloud.

Diagram of steps in this tutorial
Diagram of steps in this tutorial

Você criará uma instância de serviço do banco de dados SQL e a ligará ao aplicativo Java. Em seguida, você criará tabelas (também conhecidas como esquemas) no banco de dados e as preencherá com dados. Você aprenderá como o aplicativo da web pode alterar sua aparência dinamicamente, dependendo dos dados no banco de dados. Finalmente, você usará o IBM SQL Database Console no IBM Cloud como uma forma alternativa de acessar os dados.

Conhecimento necessário para este tutorial

Software necessário para este tutorial

Etapa 1. Fazer download do código

  1. Clique neste botão para fazer download do código do app da web Java de amostra, o javasqltutorial.zip:
  2. Salve o javatutorial1.zip no computador e extraia seus conteúdos, que consistem em dois arquivos:
    • lauren.war é um arquivo WAR Java EE padrão, implementável que contém o servlet, JSPs e a configuração que constitui o aplicativo.
    • llldbproject.zip é um archive de projeto Eclipse. Ele contém o projeto Eclipse para este tutorial.

Etapa 2. Implementar o arquivo WAR no IBM Cloud

O serviço do SQL Database no IBM Cloud oferece uma instância do IBM DB2 que pode ser ligada e usada imediatamente no aplicativo. O atual plano beta grátis oferece uma instância que suporta até 10 conexões simultâneas e 100 MB, outros planos oferecem opções de até 500 GB e 100 conexões simultâneas.

Agora, você implementará o app no IBM Cloud e criará e ligará uma instância de serviço do SQL Database para ele.

  1. Se você ainda não tiver efetuado login no IBM Cloud, execute este comando usando o prompt de comandos do S.O. para efetuar login:

    cf api https://api.ng.bluemix.net/
    cf login

  2. Implemente lauren.war no IBM Cloud, executando este comando:

    cf push your-app-name -p lauren.war

    O nome escolhido para o aplicativo deve ser exclusivo no IBM Cloud, ou seja, não pode ser usado por nenhum outro usuário do IBM Cloud. Se o nome (chamado de "rota") já estiver em uso, ocorrerá um erro.

  3. Abra https://your-app-name.mybluemix.net/ no app, uma loja da web simples chamada Lauren's Lovely Landscapes. Talvez você já tenha se familiarizado com o app nos tutoriais anteriores. Atualmente, a loja vende três gravuras, cada página de gravura exibe o nome, a imagem e o preço associados. Mas você notará que não há gravuras listadas na loja da web! O motivo é que essa loja da web exibe o inventário de gravuras a partir de um banco de dados, e essa versão não está conectada a nenhum banco de dados. Essa conexão será estabelecida na próxima etapa.

Etapa 3. Criar uma instância de serviço do banco de dados SQL e ligá-la ao app

  1. Crie uma instância de serviço do banco de dados SQL usando o plano beta grátis e nomeie-a como "laurenlandscapes":

    cf create-service sqldb sqldb_free laurenlandscapes

  2. Ligue essa instância de serviço do banco de dados SQL ao app em execução:

    cf bind-service your-app-name laurenlandscapes

Embora o serviço de banco de dados esteja agora ligado ao app, o código no app ainda não usa o banco de dados. Isso será abordado nas próximas etapas ao criar um novo arquivo WAR e implementá-lo no IBM Cloud.

Etapa 4. Importar o app na área de trabalho do Eclipse

  1. Inicie o Eclipse IDE e selecione Arquivo > Importar. Em seguida, selecione Geral > Projetos existentes na área de trabalho.
  2. Clique na opção de arquivo Selecionar archive.
  3. Navegue e selecione o arquivo llldbproject.zip.
  4. Clique em Concluir.

Agora o projeto está importado na área de trabalho. Sua estrutura pode ser vista na área de janela do Explorador Corporativo à esquerda. É possível notar vários problemas listados na área de janela Marcadores. Eles podem ser ignorados com segurança durante todo o trabalho neste tutorial.

A próxima etapa o familiarizará com o projeto e o código.

Etapa 5. Examinar a estrutura do código

Com o projeto aberto no Eclipse, veja a área de janela do Explorador Corporativo à esquerda:

Enterprise Explorer pane
Enterprise Explorer pane

Expanda Recursos Java para ver os arquivos de código-fonte Java. Expanda WebContent para ver os dois arquivos JSP que compõe o website.

A estrutura do código deve ser familiar devido aos tutoriais anteriores.

Para lembrar, as solicitações da web de uma página da loja Lauren's Lovely Landscapes primeiro passam pelo DispatchServlet e, em seguida, são encaminhadas para uma das páginas JSP — alaska.jsp, antartica.jsp ou australia.jsp — uma para cada gravura disponível para venda. O DispatchServlet anexa um objeto WebsiteTitle à solicitação, e cada página JSP usa o WebsiteTitle para configurar o título para Lauren's Lovely Landscapes.

Uma diferença que você notará: as JPSs individuais por gravura não existem mais, agora uma única página printdisp.jsp orientada por banco de dados manipula a exibição dos detalhes e da precificação da gravura.

New printdisp.jsp page
New printdisp.jsp page

Agora o DispatchServlet encaminha apenas para uma das duas JSPs, home.jsp ou printdisp.jsp. As solicitações destinadas para home.jsp são encaminhadas com uma lista de gravuras anexadas. Em seguida, home.jsp gera a página inicial baseada nas gravuras disponíveis.

Se o usuário selecionar uma das gravuras disponíveis, DispatchServlet encaminhará a solicitação recebida para printdisp.jsp e anexará as informações sobre uma gravura à solicitação. Em seguida, printdisp.jsp gerará dinamicamente o título, a referência JPG, a descrição e o preço da gravura.

Vamos experimentar. Primeiro, é necessário criar um novo WAR ativado por dados e implementá-lo no IBM Cloud.

Etapa 6. Criar um WAR ativado por dados e implementar no IBM Cloud

  1. Obtenha as credenciais do banco de dados para a instância de serviço do banco de dados SQL ligada a partir do app implementado.

    cf env your-app-name

    Serão exibidas as variáveis de ambiente disponíveis para o app implementado. As informações do serviço de banco de dados SQL ligado serão mostradas em VCAP_SERVICES. Procure algo semelhante a isto:

    "VCAP_SERVICES": {
      "sqldb": [
       {
        "credentials": {
         "db": "SQLDB",
         "host": "75.126.1.1",
         "hostname": "75.126.1.1",
         "jdbcurl": "jdbc:db2://75.126.1.1:50000/SQLDB",
         "password": "3pKxxxxxxx",
         "port": 50000,
         "uri": "db2://user1234:3pKxxxxxxx@75.126.1.1:50000/SQLDB",
         "username": "user1234"
        },
    …

    Retornando ao Eclipse, procure o arquivo persistence.xml. Talvez seja necessário expandir o Conteúdo JPA ou consultar em Recursos Java > src > META-INF. Abra persistence.xml e modifique as seguintes propriedades:

    javax.persistence.jdbc.url
    javax.persistence.jdbc.user
    javax.persistence.jdbc.password

    Altere esses valores de propriedade para corresponder a VCAP_SERVICES. Para javax.persistence.jdbc.url, assegure-se de modificar somente a primeira parte do valor da propriedade com o campo "jdbcurl" de VCAP_SERVICES.

    Essas mudanças vinculam o código de acesso do banco de dados à instância de serviço do banco de dados SQL já criada.

  2. Reconstrua o projeto. No menu do Eclipse, selecione Projeto > Construir todos. Se "Construir todos" estiver esmaecido, assegure-se de que Projeto > Construir automaticamentenão esteja marcado.
  3. Crie um novo arquivo WAR no Eclipse, selecionando Arquivo > Exportar. Em seguida, no menu, selecione Web > Arquivo WAR. Navegue para a pasta de destino na qual deseja colocar o arquivo WAR e nomeie-o como "laurendb.war." Clique em Concluir para gerar o arquivo WAR.
  4. Implemente esse arquivo WAR ativado por dados no IBM Cloud:

    cf push your-app-name -p laurendb.war

  5. Abra https://your-app-name.mybluemix.net/ no navegador para experimentar o app. Você notará que não há gravuras listadas na loja da web! Isso ocorre porque embora a instância de serviço do banco de dados SQL tenha sido criada, ela está vazia no momento. Você incluirá dados no banco de dados e preencherá a loja na próxima etapa.
Web store with no prints listed
Web store with no prints listed

Etapa 7. Inclua dados com JPA

O EclipseLink inclui o suporte Java Persistence API (JPA) para projetos Eclipse. Para este tutorial, será necessário o EclipseLink versão 2.4.x, que é compatível com o jpa-2.0 — a única versão suportada com confiança pelo servidor de perfil Liberty atual no IBM Cloud.

O JPA automatiza o cansativo trabalho de codificação de conversão entre chamadas de acesso de objeto e consultas de banco de dados relacional. Ele faz isso com um mapeamento entre os Plain Old Java Objects (POJOs) anotados que você cria e as linhas que residem nas tabelas em um banco de dados relacional.

JPA maps     between POJOs and rows in database tables
JPA maps between POJOs and rows in database tables

Um POJO anotado é uma Entidade em JPA. Com a ajuda de um EntityManager do JPA, é possível preencher o campos do POJO e, em seguida, persisti-lo. Essa ação, na verdade, gravará ou atualizará linhas no banco de dados relacional associado. Também é possível buscar linhas em uma tabela usando instâncias do POJO, com a ajuda do EntityManager.

No caso desse aplicativo de loja da web, Print.java (em Recursos Java > src > com.ibm.devworks.examples.lll") contém a definição do POJO anotada e representa uma gravura que está disponível na loja da web Lauren. Essa classe tem as seguintes propriedades, que são mapeadas uma a uma para os campos do banco de dados:

  • title é o título da gravura
  • description é uma descrição do produto para a gravura
  • imgsrc é o nome do arquivo JPEG que contém a gravura
  • price é o preço da gravura em centavos
  • quan é o número de cópias da gravura em estoque no momento

Por exemplo, Print.java é transformado de um POJO em uma Entidade JPA por meio da anotação @Entity:

@Entity
public class Print implements Serializable {  
@Id
@GeneratedValue
private long id;
private String title;
private String description;
private String imgsrc;
private float price;
private int quan;
private static final long serialVersionUID = 1L;

Esse POJO é mapeado diretamente para uma tabela de gravura no banco de dados SQL. Instâncias desse POJO podem ser mapeadas para linhas na tabela.

  1. No projeto Eclipse, procure Recursos Java > src > com.ibm.devworks.example.java.lll > DataSeeder.java. Clique com o botão direito no arquivo, selecione Executar como > Aplicativo Java. Essa classe tem um método main() que:
    • Insere as tabela de gravura existentes no banco de dados
    • Cria tabela de gravura para o POJO anotado
    • Preenche a tabela com dados das três gravuras

    Todas as ações acima são realizadas via JPA por DDL. Por exemplo, o código para inserir e criar a tabela é executado pelos recursos de geração de DDL do EclipseLink:

    propertiesMap.put(PersistenceUnitProperties.DDL_GENERATION,
    PersistenceUnitProperties.DROP_AND_CREATE);

    E o preenchimento da tabela com o registro de gravura Alaska é semelhante a este (em é o EntityManager do JPA):

            print = new Print();
    		print.setDescription("Lauren loves this photo even though she wasn't present when the
    photo was taken. Her husband took this photo on a guys' weekend in Alaska.");
    		print.setTitle("Alaska");
    		print.setImgsrc("alaska.jpg");
    		print.setPrice(75);
    		print.setQuan(1);
    		em.persist(print);
  2. Recarregue o navegador apontado para https://your-app-name.mybluemix.net/. Agora, as gravuras disponíveis devem ser exibidas na loja, mas observe que a gravura Australia está destacada em vermelho e não pode ser selecionada. Isso ocorre porque a gravura não existe no estoque. Se você observar o código em DataSeeder.java, verá que a quantidade da gravura Australia está configurada como 0.
Lauren's Lovely Landscapes     store with Australia print out of stock
Lauren's Lovely Landscapes store with Australia print out of stock

Etapa 8. Acesse o banco de dados SQL usando o SQL Database Console do IBM Cloud

  1. Efetue login no painel do IBM Cloud.
  2. Localize o serviço do banco de dados SQL laurenlandscapes que você criado. Clique em SERVIÇOS na área de janela esquerda para expandi-la e selecione laurenlandscapes. laurenlandscapes SQL database service
    laurenlandscapes SQL database service
  3. Clique no serviço Ativar . Essa ação ativa a instância para visualização e manipulação. Daqui é possível carregar dados da planilha do Excel para o banco de dados SQL. SQL database console     welcome page
    SQL database console welcome page
  4. Por agora, clique em Trabalhar com tabelas e selecione GRAVURA. Na área de janela direita, selecione Procurar dados. Agora devem ser exibidas todas as linhas da tabela de gravura, inseridas pelo DataSeeder da Etapa 7. SQL database console with     print table rows discplayed
    SQL database console with print table rows discplayed

Etapa 9. Explorar a geração dinâmica de website acionado por dados

Nesta etapa final no tutorial, suponha que uma nova remessa de gravuras Australia tenha chegado e será necessário atualizar a quantidade disponível no banco de dados. Depois disso, o website será alterado dinamicamente para incluir esse item recém-incluído no estoque.

  1. No projeto Eclipse, em Recursos Java > src > com.ibm.devworks.examples.java.lll, procure AddAustraliaPrint.java.
  2. Clique com o botão direito em AddAustraliaPrint.java e selecione Executar como > Aplicativo Java. A quantidade de gravuras aumentará de 0 para 3.
  3. Recarregue o navegador apontado para https://your-app-name.mybluemix.net/. Agora todas as gravuras devem aparecer novamente no estoque! A gravura Australia não está mais em vermelho. Tente selecioná-la para ver os detalhes.

AddAustraliaPrint.java opera de forma semelhante ao DataSeeder.java. Em uma transação JPA, a gravura Australia é procurada, sua quantidade é atualizada e, em seguida, ela é novamente persistida no banco de dados SQL:

		List<Print> prints = em.createQuery("SELECT p FROM Print p ORDER BY p.id").getResultList();		
		for(Print print : prints ) {
			if (print.getTitle().equals("Australia")) {
				print.setQuan(3);
				em.persist(print);
				break;
			}		
		}	
		em.getTransaction().commit();
		em.close();

Se você estiver imaginando como o home.jsp manipula a renderização dinâmica das gravuras sem estoque, localize o código JSTL <c:choose> no JSP — combinado com a classe de estilo CSS outofstock para alterar sua aparência:

<c:choose>
	<c:when test"${print.quan < 1}">
		<div class="preview outofstock">
		<a href="printdisp?id=${print.id}" class="outofstock">
		${print.title} - <i><small>(out of stock)</small></i><br>
	</c:when>
	<c:otherwise>
		<div class="preview">
		<a href="printdisp?id=${print.id}">
		${print.title}<br>
	</c:otherwise>
</c:choose>

Outros serviços do IBM Cloud

Além do serviço de banco de dados SQL, o IBM Cloud oferece muitos serviços interessantes que podem agregar valor e recursos ao aplicativo. Por exemplo, muitos dos recursos de aprendizado e cognitivos do IBM Watson agora estão disponíveis como serviços do IBM Cloud. É interessante navegar no catálogo de serviços do IBM Cloud e imaginar todos os novos recursos que podem ser incluídos nos aplicativos da web implementados.

Quiz

Teste seu conhecimento sobre o que você aprendeu neste tutorial. As respostas estão abaixo.

  1. O serviço do banco de dados SQL no IBM Cloud, na verdade, é apoiado por:
    1. Bancos de dados Oracle
    2. Bancos de dados MySQL
    3. Elasticsearch
    4. IBM DB2
    5. IBM Cloudant
  2. Um POJO Java anotado é conhecido em JPA como:
    1. ORM
    2. Mapeamento relacional
    3. um gerenciador de entidade
    4. uma entidade
    5. uma unidade de persistência
  3. JPA é a abreviação de:
    1. Java Programming Authority
    2. Java Persistence API
    3. Java Python Algol
    4. Java Persisted Archives
    5. Java Persisting Adapter
  4. Uma unidade de persistência JPA é definida em:
    1. jpa_config.xml
    2. persistence.xml
    3. unit.xml
    4. server.xml
    5. web.xml
  5. Usando o SQL Database Console do IBM Cloud, é possível:
    1. Importar dados de uma planilha do Excel para tabelas SQL
    2. Visualizar dados carregados em tabelas
    3. Executar uma consulta com relação aos dados carregados em tabelas
    4. Visualizar a definição de esquema das tabelas SQL
    5. Todas as alternativas acima

Respostas do quiz

1. d, 2. d, 3. b, 4. b, 5. e

 

Parabéns!

Neste tutorial, você:

  • Criou uma instância de serviço do banco de dados SQL do IBM Cloud
  • Ligou a instância do banco de dados SQL a um aplicativo da web
  • Criou tabelas e preencheu linhas em um banco de dados SQL usando JPA
  • Configurou um aplicativo da web para usar a instância de serviço do banco de dados SQL
  • Gerenciou um banco de dados SQL e visualizou dados usando o SQL Database Console do IBM Cloud
  • Explorou e examinou a eficiência do JPA POJO para mapeamentos relacionais (Object to Relational Mapping ou ORM)
  • Aprendeu como criar aplicativos da web dinâmicos acionados por dados

Este tutorial conclui a série de tutoriais "fundamentos do IBM Cloud" no developerWorks! Se você passou por todos eles, muito bem!

Para acessar um fluxo constante de tutoriais e recursos técnicos que ajudam a continuar a aprender, desenvolver e conectar-se com o IBM Cloud, consulte a página do IBM Cloud no developerWorks.


Recursos para download

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Cloud computing, Tecnologia Java
ArticleID=1021974
ArticleTitle=Fundamentos do IBM Cloud: inclua um banco de dados SQL no app Java
publish-date=11242015