Anda di halaman 1dari 9

Mapeamento Objeto-Relacional da Teoria Prtica

criado por Diego Botelho Martins em 29/07/2007 3:37pm Salve comunidade! Neste artigo irei falar resumidamente sobre mapeamento objeto-relacional que consiste em uma abordagem que permite a construo de sistemas utilizando o paradigma da orientao a objetos com a persistncia destes objetos em bancos de dados relacionais como o Mysql. Utilizando-se de tcnicas e estratgias especficas, possvel mapear classes com seus atributos e associaes para o modelo relacional. Os bancos de dados orientados a objeto so mais adequados para a persistncia de objetos manipulados por aplicaes orientadas a objeto, devido utilizao do mesmo paradigma. Porm a indisponibilidade atual destes bancos de dados, seja devido ao custo, diversidade ou amadurecimento do mercado, faz com que seja necessria a busca de alternativas para a realizao da persistncia. Desenvolvendo projetos desta maneira voc estar contribuindo para a reutilizao do seu cdigo em diferentes reas do seu sistema e at mesmo de projetos futuros, sem falar da legibilidade e do aspecto profissional agregados ao seu cdigo. Mais como seria esse mapeamento na prtica? Suponha que tenhamos as seguintes tabelas do DER abaixo no nosso banco de dados:
+------------------------+ |cli_clientes | +-------------------------+ +-----------------------+ |cat_categorias | |cli_id int(10) | +-------------------------+ |cli_idCategoria int(10) | n ------------- 1 |cat_id int(10) | |cli_nome varchar(50) | |cat_nome varchar(50) | |cli_cpf varchar(20) | +-------------------------+ |cli_email varchar(30) | +------------------------+

A partir delas iremos construir nossas classes, lembrando que a ordem no importa, conheo algumas pessoas que costumam fazer a modelagem do banco de dados primeiro, depois as tabelas e outras que modelam primeiro seus objetos para somente ento, partir para a construo do DER. Abaixo est o diagrama de classes que representa as tabelas do DER: Obs.: Sinais de visibilidade de atributos e mtodos utilizados seguindo os padres da UML Onde o sinal de "+" => private; "-" => public; "#" => protected

+----------------------------------+ | Cliente | ----------------+ +---------------------------------+ | Categoria | |+ int cli_id | ----------------+ |+ int cli_idCategoria | ----------------> cat_id | |+ Categoria objCategoria | cat_nome | |+ string cli_nome | ----------------+ |+ string cli_cpf | setId($intId) | |+ string cli_email | getId() | +----------------------------------+ setNome($strNome) | |- setId($intId) | getNome() | |- getId() | __construct() | |- setIdCategoria($intIdCategoria) | __destruct() | |- getIdCategoria() | cadastrar() | |- setCategoria($objCategoria) | alterar() | |- getCategoria() | excluir() | |- setNome($strNome) | carregar() | |- getNome() | listar() | |- setCpf($strCpf) | ----------------+ |- getCpf() | |- setEmail($strEmail) | |- getEmail() | |- __construct() | |- __destruct() | |- cadastrar() | |- alterar() | |- excluir() | |- carregar() | +----------------------------------+

+--------------

+-------------|+ |+ +-------------|||||||||||+--------------

No diagrama de classes, cada tabela do banco de dados foi mapeada para uma classe, onde o nome da classe o mesmo nome da tabela s que no singular e sem o prefixo. Os atributos possuem visibilidade private, ou seja, somente os mtodos internos a classe que podero acess-los diretamente, para objetos externos acessarem estes atributos, deve-se utilizar as propriedades modificadoras, os famosos get e set, se o atributo for somente de leitura voc pode omitir a propriedade set. O mtodo __construct pode ser utilizado para setar os valores default de cada atributo.

Relacionamentos: No DER temos o relacionamento 1 para n indicando que uma categoria pode conter nenhum ou vrios clientes, porm um cliente s est ligado a uma categoria. Para construir o relacionamento inserimos a chave estrangeira cli_idCategoria na tabela de clientes ligando-a com a chave primria cat_id da tabela de categorias. No diagrama de classes tambm temos os atributos cli_idCategoria e cat_id, s que como o objeto Cliente responsvel por conhecer a sua categoria, criamos o atributo objCategoria na classe Cliente, desta forma, assim que utilizarmos o mtodo $objCliente->carregar(), este ter que chamar o mtodo $this->objCategoria>carregar(). Estes mtodos devem recuperar os dados de um determinado registro no banco e setlos em cada atributo do objeto. Para que possamos identificar qual registro deve ser recuperado, setamos o id do objeto:
<?php $objCliente = new Cliente; $objCliente->setId('3'); $objCliente->carregar(); echo $objCliente->getNome(); echo $objCliente->getCpf(); echo $objCliente->getCategoria()->getNome(); ?>

A implementao dos mtodos CRUD (Create, Read, Update e Delete), ou seja, cadastrar, carregar, alterar e excluir, vai depender de quantas camadas sua aplicao estar dividida. O ideal que nas classes Cliente e Categoria voc s realize operaes envolvidas com a camada de negcios, fazendo com que estes mtodos chamem outros mtodos de uma camada de nvel mais baixo, como por exemplo DaoCliente::carregar() e DaoCategoria::carregar(). (Dao vem de Data Access Object) Estas classes sim que poderiam ter mtodos com clusulas SQL como SELECT, INSERT, UPDATE E DELETE. Da mesma forma, voc pode criar classes de nvel mais alto para gerenciar a camada de apresentao, nestas classes voc ir tratar cdigos HTML, Javascript, CSS e etc. Codificando desta forma seus objetos ficaro muito mais reutilizveis!! Ento chega de conversa e mos a obra! Na prxima pgina postei o cdigo fonte das classes...

Mapeamento Objeto-Relacional da Teoria Prtica


criado por Diego Botelho Martins em 29/07/2007 3:37pm class.Cliente.php:
<?php class ClienteException extends Exception { } /** * Classe responsvel pelo gerenciamento das informaes de um cliente * * @package MeuSistema * @subpackage Clientes * @author Diego Botelho <contato@diegobotelho.com> * @link http://www.diegobotelho.com * @date 2007-01-30 21:07:00 */ class Cliente { /** * @var int * @access private */ private $cli_id; /** * * @var int * @access private */ private $cli_idCategoria; /** * @var object * @access private */ private $objIdCategoria; /** * @var string * @access private */ private $cli_nome; /** * @var string * @access private */ private $cli_cpf; /** * @var string * @access private */ private $cli_email; //--------------------------------------------------------------------/**

* Seta o valor do atributo $cli_id * @param int $intId * @access public */ public function setId($intId) { $this->cli_id = $intId; } /** * Obtm o valor do atributo $cli_id * @access public */ public function getId() { return $this->cli_id; } //... A mesma coisa para os outros atributos //--------------------------------------------------------------------/** * Construtor da classe * @access public */ public function __construct() { $this->setId(""); $this->setIdCategoria(""); $this->setCategoria(new Categoria); $this->setNome(""); $this->setCpf(""); $this->setEmail(""); } /** * Destrutor da classe * @access public */ public function __destruct(){} /** * Cadastra um novo cliente * @access public */ public function cadastrar() { try { DaoCliente::insert($this); } catch(Exception $e) { throw new ClienteException($e->getMessage()); } } /** * Altera um cliente existente * @access public */ public function alterar()

{ try { DaoCliente::update($this); } catch(Exception $e) { throw new ClienteException($e->getMessage()); } } /** * Exclui um cliente existente * @access public */ public function excluir() { try { DaoCliente::delete($this); } catch(Exception $e) { throw new ClienteException($e->getMessage()); } } /** * Recupera um cliente armazenado em meio persistente * @access public */ public function carregar() { try { DaoCliente::load($this); // Carregando a categoria do cliente DaoCategoria::setId($this->idCategoria); DaoCategoria::load($this->objCategoria); } catch(Exception $e { throw new ClienteException($e->getMessage()); } } } ?>

Mapeamento Objeto-Relacional da Teoria Prtica


criado por Diego Botelho Martins em 29/07/2007 3:37pm class.Categoria.php
<?php class CategoriaException extends Exception { } /** * Classe responsvel pelo gerenciamento das informaes de uma categoria * * @package MeuSistema * @subpackage Categorias * @author Diego Botelho <contato@diegobotelho.com> * @link http://www.diegobotelho.com

* @date 2007-01-30 21:07:00 */ class Categoria { /** * @var int * @access private */ private $cat_id; /** * * @var string * @access private */ private $cat_nome; //--------------------------------------------------------------------/** * Seta o valor do atributo $cat_id * @param int $intId * @access public */ public function setId($intId) { $this->cat_id = $intId; } /** * Obtm o valor do atributo $cat_id * @access public */ public function getId() { return $this->cat_id; } /** * Seta o valor do atributo $cat_nome * @param int $strId * @access public */ public function setNome($strNome) { $this->cat_nome = $strNome; } /** * Obtm o valor do atributo $cat_nome * @access public */ public function getNome() { return $this->cat_nome; } //---------------------------------------------------------------------

/** * Construtor da classe * @access public */ public function __construct() { $this->setId(""); $this->setNome(""); } /** * Destrutor da classe * @access public */ public function __destruct() { } /** * * Cadastra um nova categoria * @access public */ public function cadastrar() { try { DaoCategoria::insert($this); } catch(Exception $e) { throw new CategoriaException($e->getMessage()); } } /** * Altera uma categoria existente * @access public */ public function alterar() { try { DaoCategoria::update($this); } catch(Exception $e) { throw new CategoriaException($e->getMessage()); } } /** * Exclui uma categoria existente * @access public */ public function excluir() { try { DaoCategoria::delete($this); } catch(Exception $e) { throw new CategoriaException($e->getMessage()); } } /** * Recupera uma categoria armazenado em meio persistente * @access public */ public function carregar()

{ try { DaoCategoria::load($this); } catch(Exception $e) { throw new CategoriaException($e->getMessage()); } } /** * Retorna uma lista com as categorias cadastradas * @access public */ public function listar() { try { return DaoCategoria::collection($this); } catch(Exception $e) { throw new CategoriaException($e->getMessage()); } } } ?>

Bom isso, apesar de ser bem superficial, espero que tenha ajudado. Quero dizer que voc deve ler mais sobre este assunto pois realmente muito importante e til. Vale a pena programar em PHP5! Um abrao!

Anda mungkin juga menyukai