UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). Prof. Robinson Vida Noronha Tema: Persistência de Classes e de seus Relacionamentos 1 Persistência de Classe e AutoRelacionamento em Tabelas de Banco de Dados 1) Introdução ! Em algumas situações, pode ser necessário preservar os objetos criados e seus relacionamentos em uma aplicação de maneira permanente. Ou seja, os dados fornecidos pelo usuário devem poder ser resgatados em uma outra oportunidade. Uma das maneiras de se “persistir” os dados é armazenar os seus valores em tabelas de um banco de dados. ! Pode-se considerar que existem basicamente dois tipos de banco de dados: i) os banco de dados orientados a objetos e ii) os banco de dados que não são orientados a objetos. Nesse material é considerado apenas o banco de dados não orientado a objetos. ! Normalmente, uma classe deverá ter o seu equivalente em forma de tabela. Nesse caso, cada atibuto será uma coluna na tabela, o nome da tabela será o nome da classe e o nome do banco de dados, o nome do pacote. ! Uma classe deverá ter o seu equivalente em forma de tabela. Nesse caso, cada atibuto será uma coluna na tabela e o nome da tabela será o nome da classe. ! O relacionamento é armazenado em uma tabela a parte. ! ! 2) Exemplo Prático - Como representar uma tabela e seu relacionamento. ! Como exemplo prático, a classe exemplificada na Figura 1 terá os seus parâmetros persistidos em uma tabela do banco de dados. Na Figura 1, apenas os atributos da classe estão representados. ! De maneira reduzida, os passos a serem seguidos são dois a saber: * criar uma base de dados * criar a(s) tabela(s) com os atributos da classe * criar tabelas que representem os relacionamentos UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). Prof. Robinson Vida Noronha Tema: Persistência de Classes e de seus Relacionamentos 2 Figura 1 - Exemplo de classe: Classe Disciplina ! ! A Base de Dados criada poderia ser denominada de Academico, conforme ilustram as Figuras 2 e 3. Figura 2 - Definição do DataBase ou Base de Dados. UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). Prof. Robinson Vida Noronha Tema: Persistência de Classes e de seus Relacionamentos 3 Figura 3 - DataBase Criado 3) Instrução SQL para a criação das Tabelas ! O Banco de Dados MySql disponibiliza a linguagem SQL para os desenvolvedores de Banco de Dados. A seguir, apresenta-se as instruções para a criação da tabela Disciplina ilustrada na Figura 1 e para a criação da tabela preRequisitoDisciplina. create table academico.disciplina ( codigo varchar(10) not null , nome varchar(200) not null , quantidadeAulasTeoricas int , quantidadeAulasPraticas int , quantidadeAulasDistancia int , primary key(codigo) , unique(nome) ); create table academico.preRequisitoDisciplina ( codigo varchar(10) not null , codigoPre varchar(10) not null , primary key(codigo, codigoPre) , foreign key (codigo) references ACADEMICO.Disciplina(codigo) , foreign key (codigoPre) references ACADEMICO.Disciplina(codigo) ,unique(codigo,codigoPre) ); 4) Instrução SQL para a Inserção de Dados nas Tabelas Criadas UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). Prof. Robinson Vida Noronha Tema: Persistência de Classes e de seus Relacionamentos ! 4 Na Figura 4, é apresentada a instrução SQL que permite inserir dados nas tabelas. Na primeira linha, o código “delete from Disciplina” limpa todos os registros anteriores na tabela. Essa instrução foi dada apenas por precaução. ! O segundo grupo de instrução da Figura 6, três disciplinas são inseridas no banco de dados. Destaca-se aqui que com uma instrução SQL, vários dados podem ser inseridos no Banco de dados. Finalizando, o terceiro grupo de instrução, registra apenas os pré-requisitos das disciplinas na tabela “preRequisitoDisciplina”. Figura 4 - Instruções para Inserção de Dados nas Tabelas “Disciplina” e “preRequisitoDisciplina”. 5) Tentativa de “quebrar” a chave ! Qualquer tentativa de inserir algum registro que viole as “keys” definidas para a tabela é interpretada como erro pelo Banco de Dados. ! Por exemplo, a tentativa de inserir na tabela “preRequisitoDisciplina” um registro no campo “codigo” ou “codigoPre” que não tenha sido previamente inserido na tabela Disciplina, conforme ilustra a Figura 5, é interpretada como erro, conforme ilustra a Figura 6. Figura 5 - Instrução SQL de inserção de registro no banco de dados. Ocorrerá um erro de execução. UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). Prof. Robinson Vida Noronha Tema: Persistência de Classes e de seus Relacionamentos 5 Figura 6 - Erro de tentativa de “quebra” de “foreign key”. ! Outro exemplo de tentativa de “quebra” de chave é ilustrada na Figura 9 a seguir. Nesse exemplo, tenta-se excluir de maneira indevida um registro. Na instrução ilustrada na Figura 7, o código ʻdelete from Disciplina where codigo = “FI63A”ʼ não pôde ser executado. A disciplina “FI63A” possui uma ocorrência também na tabela “preRequisitoDisciplina”, conforme ilustra a Figura 9. Figura 7 - Instrução SQL que tenta excluir de maneira indevida um registro no banco de dados. 6) Visualização dos Dados Armazenados ! Os dados armazenados nas Tabelas podem ser visualizados por meio de instrução SQL específica, conforme ilustram as Figuras 7 e 8 a seguir. Figura 8 - Instrução SQL que permite visualizar os dados armazenados na tabela Disciplina. UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). Prof. Robinson Vida Noronha Tema: Persistência de Classes e de seus Relacionamentos Figura 9 - Instrução SQL que permite visualizar os dados armazenados na tabela preRequisitoDisciplina. 7) Exercício a) Criar duas tabelas para armazenar os dados da classe Pessoa da Figura 9 e de seu auto-relacionamento “amizadeCom”. Defina como chave primária o campo “CPF”. 6 UTFPR – DAELN - Disciplina de Fundamentos de Programação II ( IF62C ). Prof. Robinson Vida Noronha Tema: Persistência de Classes e de seus Relacionamentos b) Para o Diagrama de Classes a seguir, defina tabelas no banco de dados que sejam capazes de armazenar os seus dados e seus relacionamentos. Dica: Para alterar a tabela Disciplina já criada, a seguinte instrução poderia ser usada: alter table academico.disciplina add codigoTurma varchar(10); alter table academico.disciplina add foreign key(codigoTurma) references academico.turma; 7