Вы находитесь на странице: 1из 12

DSIS4 Desenvolvimento de Sistemas

edilson.ifsp@gmail.com

Aula 2 Mapeamento ER Modelo Relacional, Acesso ao MySQL utilizando Java


1. Mapeamento do Diagrama ER para o Modelo Relacional
1.1. Entidades Regulares
Para cada conjunto de entidades criar uma relao (tabela).
Para cada atributo simples incluir uma coluna na tabela.
No caso de atributo composto, incluir somente os atributos simples que o compem.

FUNCIONARIO
CPF primeiroNome nomeDoMeio sobreNome salario
1.2. Entidades Fracas
Criar uma tabela para cada conjunto de entidades fracas.
Incluir como chave estrangeira a chave primria da tabela de entidades dominantes.
As entidades fracas tm chave primria composta de duas partes:
o A chave primria da tabela de entidades dominantes
o A chave parcial do conjunto de entidades fracas.

FUNCIONARIO
CPF nome salario

DEPENDENTE
CPFResponsavel nome dataNasc

1.3. Relacionamentos: Um para Um


Devem ser identificadas duas tabelas, uma para cada conjunto de entidades que participa do
relacionamento.
Numa delas incluir como chave estrangeira a chave primria da outra.
o Se o relacionamento for total num dos dois conjuntos de entidades, melhor incluir
a chave estrangeira no lado total.
Incluir tambm colunas com os atributos do relacionamento.

FUNCIONARIO
CPF nome salario

DEPARTAMENTO
codDepto descricao CPFGerente dataInicio

1.4. Relacionamentos: Muitos para Um


Pode-se identificar duas tabelas, uma para cada conjunto de entidades que participam do
relacionamento.
Incluir como chave estrangeira, na tabela do lado muitos (o lado N), a chave primria da
tabela do lado um.
Incluir tambm as colunas com os atributos do relacionamento.

FUNCIONARIO
CPF nome salario codDepto dataLocacao

DEPARTAMENTO
codDepto descricao

1.5. Relacionamentos: Muitos para Muitos


Pode-se identificar duas tabelas, uma para cada conjunto de entidades que participa do
relacionamento. Criar uma nova tabela contendo, como chaves estrangeiras, as chaves
primrias dessas duas tabelas.
o A combinao dessas chaves estrangeiras forma a chave primria da nova tabela.
Incluir tambm as colunas com os atributos do relacionamento.

FUNCIONARIO
CPF nome salario

ALOCACAO
CPF codProjeto

horas

PROJETO
codigo descricao dataInicio dataFim

1.6. Atributos Multivalorados


Para cada atributo multivalorado criar uma tabela contendo:
o Como chave estrangeira, a chave primria da tabela que representa o conjunto de
entidades que tm o atributo multivalorado.
o O valor do atributo.
A chave primria da nova tabela a combinao da chave estrangeira e do valor do atributo.

FUNCIONARIO
CPF nome salario

FONE
CPFFuncionario numeroFone

1.7. Relacionamentos de Grau maior que dois


Criar uma nova tabela contendo, como chaves estrangeiras, as chaves primrias das tabelas
que representam os conjuntos de entidades participantes.
o Normalmente a combinao dessas chaves estrangeiras forma a chave primria da
nova tabela.
Mas se a cardinalidade mxima de uma das entidades participantes for 1,
ento a chave estrangeira que referencia essa entidade fica sendo a chave
primria da nova tabela.

VENDAS
codFornecedor codComprador codProduto data qtde
2. Join (Juno)
A operao de juno, representada atravs de |X|, utilizada para combinar tuplas (linhas)
relacionadas de duas ou mais relaes (tabelas) em uma nica linha.
Forma Geral:

R |X| <condica o de juncao> S


,onde R e S so as tabelas e |X| o smbolo que representa juno. Note que necessrio
especificar uma condio para a juno. Essa condio deve utilizar campos das tabelas que possuam
o mesmo tipo.

2.1. Inner Join (Juno Interna) |X|


Essa juno retorna todos os pares com correspondentes de linhas nas duas tabelas e descarta as
linhas sem correspondentes em ambas as tabelas.
2.2. Outer Join (Juno Externa)
usada quando queremos manter todas as linhas da tabela R, ou todas as linhas da tabela S, ou
todas as linhas de ambas as tabelas, independentemente se elas tm ou no linhas correspondentes
na outra tabela. Ela se subdivide em:
2.2.1. Left Outer Join (Juno Externa Esquerda) _|X|
O resultado dessa seleo contm todos os registros da tabela esquerda (isto , a primeira
tabela mencionada na consulta), mesmo quando no existirem registros correspondentes na tabela
direita. Assim, ela retorna todos os valores da tabela esquerda que possuem valores
correspondentes na tabela da direita, ou Null quando no h correspondncia.
2.2.2. Right Outer Join (Juno Externa Direita) |X|_
Essa operao inversa anterior. Ela retorna sempre todos os registros da tabela direita
(a segunda tabela mencionada na consulta), mesmo se no existir um registro correspondente na
tabela esquerda. Nesses casos, o valor Null retornado.
2.2.3. Full Outer Join (Juno Externa Total) _|X|_
Essa operao mostra todos os registros das tabelas esquerda e direita, mesmo que no
possuam correspondncia na outra tabela. A tabela combinada possuir todos os registros de ambas
as tabelas e apresentar valores nulos para os registros sem correspondncia.
Exemplo:
Dadas duas tabelas, chamadas Montadora e Veculo, vamos analisar os quatro tipos de juno.
Montadora
CodigoMontadora
1
2
3
4
5
6

NomeMontadora
GM
Honda
Toyota
Fiat
Volkswagen
Ford

Veiculo
CodigoModelo
10
20
30
40
50

NomeModelo CodigoMontadora
Gol
5
Palio
4
Corsa
1
Civic
2
Clio
Null

Inner Join:

Montadora |X| <Montadora .CodigoMontadora = Vei culo.Codi goMontadora > Veiculo


CodigoMontadora
1
2
4
5

NomeMontadora CodigoModelo NomeModelo


GM
30
Corsa
Honda
40
Civic
Fiat
20
Palio
Volkswagen
10
Gol

Left Outer Join

Montadora _|X| <Montadora .CodigoMontadora = Vei culo.CodigoMontadora> Veiculo


CodigoMontadora
1
2
3
4
5
6

NomeMontadora CodigoModelo NomeModelo


GM
30
Corsa
Honda
40
Civic
Toyota
Null
Null
Fiat
20
Palio
Volkswagen
10
Gol
Ford
Null
Null

Right Outer Join

Montadora |X|_ <Montadora .CodigoMontadora = Vei culo.CodigoMontadora> Veiculo


CodigoMontadora
5
4
1
2
Null

NomeMontadora CodigoModelo NomeModelo


Volkswagen
10
Gol
Fiat
20
Palio
GM
30
Corsa
Honda
40
Civic
Null
50
Clio

Full Outer Join

Montadora _|X|_ <Montadora .Codi goMontadora = Veiculo.CodigoMonta dora > Veiculo


CodigoMontadora
1
2
3
4
5
6
Null

NomeMontadora CodigoModelo NomeModelo


GM
30
Corsa
Honda
40
Civic
Toyota
Null
Null
Fiat
20
Palio
Volkswagen
10
Gol
Ford
Null
Null
Null
50
Clio

Veja o cdigo SQL para:


Inner Join
SELECT M.codMontadora, M.descricaoMontadora, V.codVeiculo, V.nomeVeiculo
FROM Montadora M, Veiculo V
WHERE M.codMontadora = V.codMontadora;
SELECT M.codMontadora, M.descricaoMontadora, V.codVeiculo, V.nomeVeiculo
FROM Montadora M INNER JOIN Veiculo V
ON M.codMontadora = V.codMontadora;

Left Outer Join


SELECT M.codMontadora, M.descricaoMontadora, V.codVeiculo, V.nomeVeiculo
FROM Montadora M LEFT OUTER JOIN Veiculo V
ON M.codMontadora = V.codMontadora;

Right Outer Join


SELECT M.codMontadora, M.descricaoMontadora, V.codVeiculo, V.nomeVeiculo
FROM Montadora M RIGHT OUTER JOIN Veiculo V
ON M.codMontadora = V.codMontadora;

3. Exerccios
3.1. Dadas as tabelas abaixo, escreva o cdigo SQL para as questes de 1 a 5.
CLIENTE
CodCliente

NroConta

Nome

DataN asc

Endereco

1
2
3
4
5

10020
Null
10014
10028
Null

Ronaldo
Klber
Mrcia
Joana
Alethia

20/07/1980
13/04/1986
28/11/1982
13/04/1986
28/11/1982

Rua Cinco 167


Rua Mato 211
Av Par 2560
Rua Gois 479
Av JK 2100

Cidade

So Paulo
Santos
Bauru
So Paulo
Jundia

CONTA
NroConta

10020
10075
10014
10028
10077

Agencia

SPCAP
SPLIT
SPINT
SPCAP
SPINT

Saldo

300
7000
2100
890
1070

a) Qual o nmero da conta da cliente Joana?


b) Quais clientes moram na cidade de So Paulo?
c) Quais clientes nasceram em 13/04/1986 e so da cidade de Santos?
d) Qual o resultado de CLIENTE |X| CONTA?
e) Qual o resultado de CLIENTE _|X| CONTA?
3.2. Dadas as tabelas:
Marinheiro

a)

Barco

codMarinheiro

nome

avaliacao idade

codBarco

descricao

cor

22

Dustin

45

101

Interlake azul

29

Brutus

33

102

Interlake vermelho

31

Lubber

55

103

Clipper

verde

32

Andy

25

104

Marine

vermelho

58

Rusty

10

35

64

Horatio

35

71

Zorba

10

16

74

Horatio

35

22

101

10/10/2013

85

Art

25

22

102

10/10/2013

95

Bob

63

22

103

08/10/2013

22

104

07/10/2013

31

102

10/11/2013

31

103

06/11/2013

31

104

12/11/2013

64

101

05/09/2013

64

102

05/09/2013

74

103

08/09/2013

Reserva
codMarinheiro codBarco

Encontre os nomes dos marinheiros que reservaram o barco 103.

data

b)

Encontre os cdigos dos marinheiros que reservaram um barco vermelho.

c)

Encontre os nomes dos marinheiros que reservaram um barco vermelho.

d)

Encontre os nomes dos marinheiros que reservaram pelo menos um barco.


3.3. Dado o esquema relacional a seguir:

Funcionario (CodFuncionario, Nome, Endereco, Sexo, Salario, Supervisor, Departamento)


Departamento(CodDepto, Descricao, CodGerente)
Projeto(CodProjeto, Descricao, Departamento)
Alocacao(CodFuncionario, CodProjeto, QtdeHoras)
Dependentes(CodFuncionario, NomeDependente, Sexo, DataNascimento, Parentesco)

Escreva o cdigo SQL que:


a) Selecione os funcionrios que trabalham no departamento 8.
b) Selecione os funcionrios que ganham mais do que R$ 3.000,00.
c) Selecione os funcionrios que ganham mais de R$2.000,00 e trabalham no departamento 4, ou
que ganham menos de R$500,00 e trabalham no departamento 5.
d) Obtenha o nome e salrio dos funcionrios do departamento 5.
4. Acesso ao banco de dados
O primeiro passo para estabelecer uma conexo com o banco de dados conhecer a API
(Application Programming Interface) JDBC (Java Database Connectivity). JDBC um padro da
indstria para estabelecer a conexo entre a linguagem de programao Java e uma grande
quantidade de bases de dados. Por meio do JDBC, possvel realizar trs tarefas:

Estabelecer uma conexo com o banco de dados;


Enviar declaraes SQL;
Processar os resultados;

A API JDBC composta por dois pacotes:


java.sql
javax.sql
O conjunto de interfaces JDBC que permitem a execuo de consultas, persistncia de
informaes, fechamento de conexes, dentre outros, ficam no pacote java.sql. As classes que
implementam essas interfaces faro a ponte entre o cdigo cliente (que utiliza a API JDBC) e o banco
de dados. Esse conjunto de classes conhecido como driver. . Para obter o driver relacionado a um
determinado banco de dados, verifique a pgina de download de drivers do SGBD. Exemplos:
MySQL (http://dev.mysql.com/downloads/connector/j/)
Oracle (http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html)
Para nosso caso, teremos um driver para o banco de dados MySQL.
Veja a seguir os passos para criar uma conexo com o banco de dados MySQL por meio da
linguagem Java:

1) Crie um novo projeto no NetBeans, especificando a categoria como Java e o projeto como
Aplicativo Java.
2) Informe como nome de projeto Aula02_ConexaoBD. Aps isso, crie a classe ConexaoBD.
possvel criar a classe e j inclu-la no pacote br.edu.ifsp.aplicacaoteste. Veja:

3) Com o projeto criado, digite o cdigo abaixo na classe ConexaoBD:


Observao: preciso que o banco de dados biblioteca exista.
package br.edu.ifsp.aplicacaoteste;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ConexaoBD {
public static void main(String[] args) {
Connection conexao;
String url = "jdbc:mysql://localhost:3306/biblioteca";
String usuario = "root";
String senha = "root";
try {
Class.forName("com.mysql.jdbc.Driver");
conexao = DriverManager.getConnection(url, usuario, senha);
System.out.println("Conexo Efetuada!");
conexao.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
}

4) Clique em Executar.
Observao: Ao tentar executar o projeto, ir ocorrer o seguinte erro:
Exception
in
thread
"main"
java.lang.RuntimeException:
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
br.edu.ifsparq.ConexaoBD.main(ConexaoBD.java:21)

at

Isso significa que a aplicao no encontrou uma implementao do driver JDBC para estabelecer
a conexo com o banco de dados.
Para solucionar esse problema, clique com o boto direito na pasta Biblioteca e escolha a
opo Adicionar biblioteca... (o NetBeans j possui o driver; no necessrio efetuar o download).
Aps isso, selecione o driver para o MySQL (MySQL JDBC Driver) e clique no boto Adicionar
biblioteca.

Observe que a biblioteca MySQl JDBC Driver foi adicionada ao projeto.

Dica: Para incluir o driver mais atual, v at http://www.mysql.com/downloads/connector/ e clique


em Connector/J. Escolha a verso .zip e faa o download. Aps descompactar o arquivo em uma
pasta local, efetue o mesmo procedimento para incluir a biblioteca. A nica diferena que voc
deve selecionar Adicionar JAR/pasta e especificar o arquivo jar que est dentro da pasta local.
4.1. Entenda o Cdigo
Registrando o driver JDBC para o MySQL
Na linha
Class.forName("com.mysql.jdbc.Driver");

O mtodo forName() retorna o objeto associado com a string com.mysql.jdbc.Driver, ou seja, o


driver para o MySQL. A partir do JDBC 4.0 (Java SE 6.0), no mais necessrio especificar essa linha
de maneira explcita. Quando o mtodo getConnection() chamado, ele mesmo ir tentar localizar
um driver JDBC. Portanto, daqui para frente, no irei inclu-la nos cdigos fonte.
Interface Connection
Um objeto que implementa a interface Connection gerencia a conexo entre o programa Java e o
banco de dados e permite a criao de instrues SQL que acessem o banco de dados.
Na linha
conexao = DriverManager.getConnection(url, usuario, senha);

o programa inicializa o objeto conexao (do tipo Connection) com o resultado de uma chamada
ao mtodo esttico getConnection(), que pertence classe DriverManager (pacote java.sql). O
mtodo getConnection() recebe trs argumentos: uma string que especifica o url do banco de dados,
o nome de usurio e sua senha.
O url especifica o protocolo de comunicao (jdbc), indica que o protocolo utiliza um
subprotocolo especfico para o MySQL (mysql), e tambm contm a localizao do banco de dados
(localhost:3306/biblioteca ). Veja:
jdbc:mysql://localhost:3306/biblioteca

Na linha
conexao.close();

realizado o fechamento da conexo com o banco de dados. Vale enfatizar que efetuar o
fechamento da conexo de extrema importncia para a segurana da aplicao e liberao de
recursos JDBC.
5. Efetuando uma consulta simples
O cdigo fornecido a seguir permite a consulta e impresso de informaes da tabela Aluno.
Pr-requisitos:
a) Criao do banco de dados Escola.
Utilize o MySQL Workbench para criar o novo banco de dados.
b) Criao da tabela Aluno no banco de dados Escola.
Observao: a tabela Curso criada somente para permitir que a tabela Aluno contenha a coluna
codCurso como chave estrangeira.
CREATE TABLE Curso(
codCurso
INT AUTO_INCREMENT,
nomeCurso
VARCHAR(30),
depto
VARCHAR(30),
PRIMARY KEY(codCurso)
);
CREATE TABLE Aluno(
codAluno
int auto_increment,
nome
VARCHAR(40),
cpf
VARCHAR(11),
fone
VARCHAR(13),
codCurso
INT,
PRIMARY KEY(codAluno),
FOREIGN KEY (codCurso) REFERENCES Curso (codCurso)
);

c) Insero de dados na tabela Aluno.


INSERT INTO Curso (nomeCurso, depto)
VALUES('Computao', 'Cincias Exatas'),
('Direito', 'Cincias Humanas');
INSERT INTO Aluno (nome, cpf, fone, codCurso)
VALUES('Joozinho', '1234', '8118', 2),
('Carla', '4567', '8117', 1),
('Priscila', '8901', '9275', 1);

Cdigo Java:
package br.edu.ifsp.nomeaplicacao;
import java.sql.*;
public class ConexaoBD
public static void
Connection con
Statement st =
ResultSet rs =

{
main(String[] args) {
= null;
null;
null;

String url = "jdbc:mysql://localhost:3306/universidade";


String usuario = "root";
String senha = "root";

try {
con = DriverManager.getConnection(url, usuario, senha);
st = con.createStatement();
rs = st.executeQuery("select * from aluno;");
while (rs.next()) {
int codigo = rs.Int("codAluno");
String nome = rs.getString("nome");
String cpf = rs.getString("cpf");
String fone = rs.getString("fone");
int codCurso = rs.Int("codCurso");
System.out.println("Cdigo Aluno: " + codigo + ", Nome: " +
nome + ", CPF: " + cpf + ", Fone: " + fone + ", Cdigo Curso: " +
codCurso);
}
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
try {
if (rs != null) {
rs.close();
}
if (st != null) {
st.close();
}
if (con != null) {
con.close();
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
}

5.1. Entenda o Cdigo


Interface Statement
O programa utiliza o objeto Statement para enviar instrues SQL ao banco de dados e obter os
resultados produzidos por elas. O mtodo executeQuery() utilizado para executar a instruo SQL.
Mtodo executeQuery()
O mtodo executeQuery() utilizado para submeter uma consulta SQL que seleciona as
informaes sobre os alunos.
Interface ResultSet
A interface ResultSet fornece mtodos para recuperar e manipular os resultados das consultas
SQL. Existem mtodos especficos (getString, getInt, etc) para recuperar os valores das colunas de
uma linha. possvel recuperar as informaes utilizando-se o nmero da coluna ou o alias (nome)
da coluna. Vale ressaltar que a recuperao por meio do ndice mais eficiente. Quando um
ResultSet criado, o cursor posicionado antes da primeira linha. O cursor movido para prxima
linha atravs do mtodo next(). Esse mtodo retorna verdadeiro se o cursor estiver posicionado em
uma linha e falso, caso o cursor esteja posicionado aps a ltima linha.
6. Exerccios
6.1. Escreva um programa que permita a consulta de informaes utilizando um menu com as
seguintes opes:

1) Listar Cursos
2) Listar Alunos
3) Listar Departamentos
Observao: As informaes do departamento devem ser armazenadas em uma nova tabela.
6.2. Escreva um programa que, baseando-se nas tabelas Marinheiro, Barco e Reserva, liste todas
as reservas de barcos, contendo as seguintes colunas:
Nome do Marinheiro
Descrio do Barco
Cor do Barco
Desafio: Tente listar tambm a data da reserva.
6.3. Elabore um conjunto de tabelas para a seguinte situao: Luiz Felipe comprou um conjunto
de casas em um condomnio. Agora ele quer criar um sistema que seja capaz de ajud-lo no
controle do aluguel e avarias (problemas) das casas. Alm do nome, endereo (rua, nmero,
cep, cidade) e telefone do condomnio, ele quer armazenar o endereo da casa (rua, lote,
nmero), o valor do aluguel e a data na qual ela foi alugada. Um cliente (nome, cpf, salario,
data de nascimento) pode alugar vrias casas ao mesmo tempo. No caso das avarias,
existem trs tipos: eltrica, estrutural ou hidrulica. Deve existir um campo que contenha a
descrio da avaria, a data na qual ela ocorreu e a data na qual foi solucionada.

Вам также может понравиться