Linguagem de Programação: Aula 3
Linguagem de Programação: Aula 3
LINGUAGEM DE
PROGRAMAÇÃO
AULA 3
CONVERSA INICIAL
Uma aplicação Web é dividida em duas partes: back-end e front-end, na qual a primeira é
responsável pela implementação das regras de negócio e a segunda por prover a interface gráfica da
Vamos iniciar o desenvolvimento da nossa aplicação pela tela de cadastro de Cliente. Para isso,
devemos inicialmente criar a classe que irá conter os seus dados. Conforme especificado no
diagrama de classes da aplicação, devemos implementar a classe Cliente conforme nos mostra a
figura abaixo.
devemos agrupá-las em pacotes de acordo com as suas responsabilidades. Quanto às classes que
https://univirtus.uninter.com/ava/web/roa/ 2/26
05/03/2023, 21:32 UNINTER
irão representar as entidades do banco de dados, como, por exemplo, a classe Cliente, iremos
manter dentro do pacote br.com.springboot.model. Para criá-lo, basta clicar com o botão direito do
mouse sobre a pasta src/main/java na raiz do projeto e selecionar o menu New > Package, conforme
a figura a seguir.
Ao clicar sobre a opção Package (Pacote), será aberta a tela para a criação do pacote. Nela,
devemos informar o nome do pacote que desejamos criar no campo Name, conforme exemplificado
na Figura 3.
https://univirtus.uninter.com/ava/web/roa/ 3/26
05/03/2023, 21:32 UNINTER
Informado o nome do pacote no campo Name, clique no botão Finish. Criado o pacote, vamos
implementar a enumeração Sexo e a classe Cliente, iniciando a codificação pela primeira. Como a
br.com.springboot.model. Para adicioná-la a esse pacote, basta clicar com o botão direito sobre ele e
Ao clicar sobre a opção Enum (Enumeração), será aberta a tela para a criação da enumeração.
Nelam devemos informar o nome da enumeração que desejamos criar no campo Name, conforme
exemplificado na Figura 5.
https://univirtus.uninter.com/ava/web/roa/ 4/26
05/03/2023, 21:32 UNINTER
Informado o nome da enumeração no campo Name clique no botão Finish. A enumeração Sexo
irá conter apenas dois valores (Masculino e Feminino) e sua implementação pode ser vista no
quadro a seguir.
Finalizada a enumeração Sexo, podemos agora iniciar a implementação da classe Cliente. Para
ria-la, clique com o botão direito sobre o pacote br.com.springboot.model e selecione o menu New >
Ao clicar sobre a opção Class (Classe), será aberta a tela para a criação da classe. Nela,
devemos informar o nome da classe que desejamos criar no campo Name, conforme exemplificado
na Figura 7.
Informado o nome da classe no campo Name, clique no botão Finish. Adicione os atributos à
https://univirtus.uninter.com/ava/web/roa/ 6/26
05/03/2023, 21:32 UNINTER
Adicionado os atributos à classe Cliente, utilize a ferramenta Generate getters and setters do
Eclipse para gerar os getters e setters da classe Cliente de forma automática. Para acessar esse
recurso, clique sobre a lupa no canto superior direito da IDE ou a combinação das teclas Ctrl + 3 para
abrir a tela de pesquisa do Eclipse. No campo de pesquisa, digite Generate getters and setters e
clique sobre a opção que será listada conforme podemos visualizar na Figura 8.
https://univirtus.uninter.com/ava/web/roa/ 7/26
05/03/2023, 21:32 UNINTER
Clique sobre a opção Generate getters and setters. Na tela que será exibida, clique sobre o botão
Select All para selecionar todos os atributos e depois no botão Generate para gerar os getters e
Após implementar a classe Cliente, precisamos agora implementar a classe de acesso a dados
referente essa classe, que será responsável por prover os métodos de interação com o banco de
Iremos adicionar duas dependências para realizarmos a interação com o banco de dados. A
primeira dependência a ser adicionada ao projeto será a MySQL Connector/J, responsável por prover
o driver de conexão com o MySQL, visto que iremos utilizar esse SGBD para o gerenciamento de
dados da aplicação. A segunda dependência a ser adicionada ao projeto será a Spring Boot Starter
Data JPA, para que possamos implementar os métodos de acesso a dados utilizando o Hibernate,
framework de mapeamento objeto-relacional, em conjunto com a JPA (Java Persistence API),
As dependências podem ser encontradas no site dos fornecedores. Porém, para não ter que
ficar acessando diferentes sites a todo momento, recomendo o site MVN Repository que pode ser
acessado por meio da seguinte url <<https://mvnrepository.com>>. Nesse site, você irá encontrar de
forma rápida e fácil diversas dependências que podem ser adicionadas ao seu projeto. As duas
https://univirtus.uninter.com/ava/web/roa/ 8/26
05/03/2023, 21:32 UNINTER
adicionamos ao projeto por meio do Spring Boot, Spring Boot DevTools e Spring Web se encontram
entre essas tags, conforme podemos visualizar na Figura 9.
2.1 HIBERNATE
https://univirtus.uninter.com/ava/web/roa/ 9/26
05/03/2023, 21:32 UNINTER
Além da sua própria API “nativa”, o Hibernate também é uma implementação da especificação
JPA (Java Persistence API). Portanto, ele pode ser facilmente utilizado em qualquer ambiente que
suporte essa especificação, incluindo aplicações Java SE, servidores de aplicações Java EE,
Outra vantagem de se utilizar o Hibernate é que ele não requer tabelas ou campos de banco de
dados especiais e gera grande parte do SQL no momento da inicialização do sistema, não
Para demonstrar o porquê desse framework ORM (Object Relational Mapping) ser uma das
ferramentas mais utilizadas pelos desenvolvedores Java, vamos comparar a diferença entre duas
classes de acesso a dados diferentes, uma utilizando a JDBC e a outra o Hibernate, realizando a
persistência de dados do mesmo objeto. Para isso, iremos adotar a classe Categoria, conforme
https://univirtus.uninter.com/ava/web/roa/ 10/26
05/03/2023, 21:32 UNINTER
A classe de acesso a dados referente à classe Categoria utilizando JDBC pode ser visualizada
no Quadro 7, enquanto a classe de acesso a dados, para essa mesma classe utilizando o Hibernate,
pode ser visualizada no Quadro 8.
Para não tornar ambas as classes de acesso a dados tão extensas, foram implementados
apenas o método insere. Porém, a análise a seguir pode ser aplicado aos demais métodos da classe
Note que a classe de acesso a dados implementada utilizando o Hibernate é bem mais enxuta
que a classe de acesso a dados via JDBC, visto que, com apenas um único comando, realizamos a
inserção de um objeto no banco de dados, enquanto, na outra classe, foram utilizados cinco
Outra enorme vantagem ao utilizar o Hibernate é que, a cada atualização na estrutura da tabela
Categoria no SGBD, como, por exemplo, adicionar uma nova coluna à tabela, não é necessário
https://univirtus.uninter.com/ava/web/roa/ 11/26
05/03/2023, 21:32 UNINTER
refatorar os métodos de acesso a dados, pois, na sua implementação, não há código SQL,
diferentemente do que ocorre na classe de acesso a dados com JDBC.
Também podemos deixar a encargo do Hibernate o gerenciamento das tabelas do SGBD. Isso
significa que o próprio framework se encarrega de criar a tabela no banco de dados referente a uma
determinada classe e, até mesmo, adicionar as colunas à tabela quando for adicionado um novo
atributo a uma classe já existente. E como o Hibernate consegue realizar a persistência de dados e
gerenciar as tabelas do SGBD se não injetamos código SQL nas classes? Por meio do mapeamento
objeto-relacional, próximo tema desta aula.
de dados entre banco de dados relacionais e linguagens orientadas a objetos, estabelecendo uma
correlação entre classes e entidades. Para estabelecer essa correlação, utilizamos as anotações da
JPA (Java Persistence API).
A anotação é um recurso da linguagem Java que permite automatizarmos algumas tarefas por
meio de metadados, sendo ela identificada dentro do código Java pelo prefixo da arroba (@). Na
tabela a seguir, serão descritas as principais anotações da JPA para posteriormente, realizarmos o
Anotação Descrição
https://univirtus.uninter.com/ava/web/roa/ 12/26
05/03/2023, 21:32 UNINTER
@IdClass Especifica que a chave primária da entidade é composta por múltiplos campos
@JoinColumn Especifica qual coluna será utilizada para realizar a junção de uma associação
@JoinColumns Especifica quais colunas serão utilizadas para realizar a junção de uma associação
persistir os objetos dessa classe, devemos empregar a anotação @Entity. Por padrão, o Hibernate
entende que o nome da classe é equivalente ao nome da tabela no banco de dados. Porém, caso
eles sejam diferentes, deve-se utilizar a anotação @Table e especificar na sua propriedade name, o
nome da tabela.
Com relação as colunas o Hibernate adota o mesmo critério, ele compreende que os nomes dos
atributos são equivalentes aos nomes das colunas, porém, caso eles sejam diferentes, deve-se
Como toda tabela deve ter uma chave primária, devemos mapear o atributo chave da classe
com a anotação @Id, quando esse for uma chave primária simples, e com o @IdClass, quando se
tratar de uma chave primária composta. Também podemos definir por meio da anotação
@GeneratedValue qual será a estratégia de definição do seu conteúdo, como, por exemplo, gerar o id
de forma automática.
convencionar que:
https://univirtus.uninter.com/ava/web/roa/ 13/26
05/03/2023, 21:32 UNINTER
dados, visto que, por meio das anotações da JPA, especificamos em qual tabela os dados serão
Além do mapeamento das classes, precisamos realizar também mapear o relacionamento entre
https://univirtus.uninter.com/ava/web/roa/ 14/26
05/03/2023, 21:32 UNINTER
Por estar do lado N do relacionamento, a classe Produto irá receber a chave estrangeira; por
isso, adiciona-se a essa classe um atributo do tipo Categoria. A implementação da classe Produto
relacional deverá ser mapeada de acordo com a cardinalidade do relacionamento. Como estamos
mapeando a classe Categoria dentro da classe Produto, fazemos a leitura do relacionamento com
base na entidade Produto. Dessa forma, temos que muitos produtos estão vinculados a uma
categoria, ou seja, a cardinalidade do mapeamento é do tipo muitos para um (N:1).
que o Hibernate saiba como efetuar a persistência dos dados e realizar a junção entre as tabelas.
Além da cardinalidade, podemos também especificar qual será o nome da coluna que faz
referência à chave estrangeira. Para especificá-la, deve-se utilizar a anotação @JoinTable, definindo
o seu nome por meio da propriedade name. O mapeamento objeto-relacional para a classe Produto
pode ser visualizada no Quadro 11.
https://univirtus.uninter.com/ava/web/roa/ 15/26
05/03/2023, 21:32 UNINTER
criado a classe Cliente, restando nesse momento apenas efetuar o seu mapeamento objeto-
https://univirtus.uninter.com/ava/web/roa/ 16/26
05/03/2023, 21:32 UNINTER
Note que, no mapeamento em questão, foram utilizadas algumas anotações e propriedades que
não haviam sido empregadas anteriormente. Dentre elas, destacam-se:
@Temporal: anotação utilizada para mapear atributos do tipo Date ou Calendar. Deve-se
especificar qual é o tipo do dado a ser persistido utilizando a enumeração TemporalType, que
conteúdo do atributo será persistido por meio da enumeração EnumType, que possui dois
https://univirtus.uninter.com/ava/web/roa/ 17/26
05/03/2023, 21:32 UNINTER
valores:
STRING: ao adotar esse tipo, o atributo será armazenado como texto no banco de dados e seu
conteúdo equivalente ao nome do tipo da enumeração.Se o conteúdo do atributo sexo for igual
ORDINAL: ao adotar esse tipo, o atributo será armazenado como número no banco de dados,
de acordo com o índice do valor da enumeração. Se o conteúdo do atributo sexo for igual a
Sexo.MASCULINO, será armazenado o valor 0; caso seja Sexo.FEMININO, o valor a ser
@Column: embora já tenhamos utilizado essa anotação, ainda não havíamos abordado as
classe mapeada, a qual será responsável por realizar a interação com o banco de dados. As classes
de acesso a dados devem estar agrupadas dentro de um pacote específico, a fim de separarmos a
lógica de negócios da lógica de persistência de dados conforme o padrão de projeto DAO (Data
Access Object).
Crie o pacote br.com.springboot.dao dentro da pasta src/main/java, clicando com botão direito
sobre ela e acessando o menu New > Package. Na tela de cadastro de pacote, informe o nome do
pacote no campo Name e clique no botão Finish. Criado o pacote, vamos incluir uma interface com
os principais métodos de acesso a dados, popularmente conhecido CRUD (Create, Read, Update,
Delete), que compreende os métodos de inserção, remoção, leitura e atualização. A essa interface,
Para criar uma interface, clique com o botão direito sobre o pacote que acabamos de criar e
https://univirtus.uninter.com/ava/web/roa/ 18/26
05/03/2023, 21:32 UNINTER
Na tela de cadastro de interface, informe o seu nome no campo Name e clique no botão Finish,
conforme a imagem a seguir.
apresentado na sequência.
https://univirtus.uninter.com/ava/web/roa/ 19/26
05/03/2023, 21:32 UNINTER
funcionalidades:
Método lista: responsável por retornar todos os registros cadastrados retornando uma lista de
objetos;
Método insere: responsável por realizar a inserção do objeto passado por parâmetro no banco
de dados;
Método atualiza: responsável por atualizar os dados do objeto passado por parâmetro no
banco de dados;
Método remove: responsável por remover o objeto passado por parâmetro no banco de dados.
nome da classe e clique no botão Finish. Criada a classe, essa deverá implementar a interface CRUD,
Para implementá-los, iremos utilizar os métodos da classe EntityManager fornecida pela JPA;
https://univirtus.uninter.com/ava/web/roa/ 20/26
05/03/2023, 21:32 UNINTER
Como o Hibernate irá gerenciar o ciclo de vida das entidades da aplicação, devemos anotar a
classe EntityManager com a anotação @PersistenceContext. Finalmente, por se tratar de uma
indicando para o framework que se trata de uma classe de acesso a dados. A implementação da
https://univirtus.uninter.com/ava/web/roa/ 21/26
05/03/2023, 21:32 UNINTER
estabelecida a conexão com o servidor de banco de dados. Para isso, devemos acessar o arquivo de
configuração do Spring, no qual são configurados os diversos serviços e recursos utilizados no
projeto, bem como parâmetros da própria aplicação. O arquivo de configuração do projeto,
https://univirtus.uninter.com/ava/web/roa/ 22/26
05/03/2023, 21:32 UNINTER
Subprotocolo: especifica o driver de conexão, como será utilizado o MySQL como SGBD da
aplicação, o termo [subprotocolo] da string de conexão deve ser substituído por mysql;
Servidor: especifica o endereço do servidor com o qual a aplicação irá se conectar, devendo o
servidor, devendo o termo [porta] da string de conexão ser substituído pelo número da porta no
arquivo de configuração;
a autenticação.
https://univirtus.uninter.com/ava/web/roa/ 23/26
05/03/2023, 21:32 UNINTER
especificando para o Spring que será utilizado o Hibernate como framework de persistência de
dados.
Validate: valida a base de dados; caso haja alguma inconformidade entre a base de dados e o
mapeamento objeto-relacional, a aplicação não será inicializada;
Update: atualiza a base de dados, cria e atualiza as tabelas, caso haja alguma inconformidade
entre a base de dados e o mapeamento objeto-relacional;
Create: recria a base de dados, apagando os dados armazenados;
Create-drop: recria a base de dados, apagando os dados armazenados e a destrói assim que
finaliza a SessionFactory é finalizado.
https://univirtus.uninter.com/ava/web/roa/ 24/26
05/03/2023, 21:32 UNINTER
Com isso, conseguimos validar que a configuração de acesso a dados está correta, pois a
aplicação está acessando o banco de dados, visto que o Hibernate executou o comando de criação
da tabela clientes com sucesso.
FINALIZANDO
Nesta aula, foi iniciado o processo de implementação dos requisitos funcionais do projeto,
começando pela codificação da classe Cliente. Para realizar a persistência de dados dessa classe,
foi necessário adicionar duas dependências ao projeto: a MySQL Connector/J responsável por
estabelecer a conexão com o banco de dados, e a Spring Boot Starter Data JPA para realizar o
mapeamento objeto-relacional.
Feito isso, foi realizado o mapeamento objeto-relacional da classe Cliente e criada a classe de
acesso a dados ClienteDAO, responsável por efetuar a persistência de dados dos objetos da classe
Cliente. Na sequência, especificamos os parâmetros de acesso ao banco de dados e definimos o
Hibernate como framework de persistência de dados, tornando assim a aplicação apta a estabelecer
conexão com o banco de dados e realizar a persistência dos objetos.
https://univirtus.uninter.com/ava/web/roa/ 25/26
05/03/2023, 21:32 UNINTER
https://univirtus.uninter.com/ava/web/roa/ 26/26