YZAAC GONÇALVES DA SILVA

Tamanho: px
Começar a partir da página:

Download "YZAAC GONÇALVES DA SILVA"

Transcrição

1 YZAAC GONÇALVES DA SILVA DESENVOLVIMENTO DE UM GERENCIADOR DE NOTÍCIAS UTILIZANDO AS FERRAMENTAS NHIBERNATE E GENTLE.NET NO MAPEAMENTO DE OBJETOS PARA BANCO DE DADOS RELACIONAL Palmas 2006

2 ii YZAAC GONÇALVES DA SILVA DESENVOLVIMENTO DE UM GERENCIADOR DE NOTÍCIAS UTILIZANDO AS FERRAMENTAS NHIBERNATE E GENTLE.NET NO MAPEAMENTO DE OBJETOS PARA BANCO DE DADOS RELACIONAL Monografia apresentada como requisitos parciais das disciplinas de Trabalho de Conclusão de Curso em Sistemas de Informação I (TCC I) e Trabalho de Conclusão de Curso em Sistemas de Informação II (TCC II) do curso de Sistemas de Informação, orientado pelo Profº. MSc. Fernando Luiz de Oliveira. Palmas 2006

3 iii YZAAC GONÇALVES DA SILVA DESENVOLVIMENTO DE UM GERENCIADOR DE NOTÍCIAS UTILIZANDO AS FERRAMENTAS NHIBERNATE E GENTLE.NET NO MAPEAMENTO DE OBJETOS PARA BANCO DE DADOS RELACIONAL Monografia apresentada como requisitos parciais das disciplinas de Trabalho de Conclusão de Curso em Sistemas de Informação I (TCC I) e Trabalho de Conclusão de Curso em Sistemas de Informação II (TCC II) do curso de Sistemas de Informação, orientado pelo Profº. MSc. Fernando Luiz de Oliveira. Aprovada em / / BANCA EXAMINADORA Profº. M.Sc. Fernando Luiz de Oliveira - Orientador Centro Universitário Luterano de Palmas Profª. Cristina D'Ornellas Filipakis Souza Centro Universitário Luterano de Palmas Profº. M.Sc. Parcilene Fernandes de Brito Centro Universitário Luterano de Palmas Palmas 2006

4 iv AGRADECIMENTOS Agradeço primeiramente a Deus por ter me colocado em uma família linda cujos meus pais, irmãs, sobrinho, tios entre outros parentes, me apóiam e apoiaram contribuindo assim, para uma boa formação escolar e universitária. Em segundo lugar o meu tio Edivaldo Gonçalves da Silva, que é o principal responsável por eu estar nessa faculdade, cujos recursos financeiros me foram dados por ele. Em terceiro lugar, a todos que me ajudaram e ajudam no dia-a-dia me dando conselhos primorosos, me mostrando o caminho certo a seguir, em especial meu orientador Fernando Luiz de Oliveira pela paciência em me ajudar nesse e em outros trabalhos, disciplinas, entre outras ajudas. Outro agradecimento especial a todos que não citei nomes, mas, que contribuíram e contribuem muito no meu dia-a-dia para um crescimento pessoal e profissional.

5 v RESUMO Dentro do contexto de desenvolvimento de sistemas, o grande problema enfrentado pelos desenvolvedores refere-se a questão de modelar e implementar seguindo o paradigma orientado a objetos e ter que trabalhar com um banco de dados relacional na camada de persistência. Apesar de já existirem Sistemas de Gerenciamento de Banco de Dados (SGBDs) Orientados a Objetos, quer seja por questões culturais, quer seja por questões técnicas (performance, por exemplo), estes SGBDs ainda são pouco utilizados dentro do processo de desenvolvimento de software. Por isto, uma alternativa para contornar este problema refere-se à utilização de ferramentas que façam o trabalho de converter os objetos provenientes da lógica de negócio para o banco de dados relacional, tema este abordado neste trabalho. Palavras-chave: Banco de Dados, Mapeamento de Objetos.

6 vi SUMÁRIO 1 INTRODUÇÃO REVISÃO DE LITERATURA Banco de Dados Relacional Hibernate Query Language (HQL) Persistência de Dados Persistência Tradicional Persistência Prevalência Mapeamento Objeto/Relacional Formas de Mapeamento Etapas para fazer o O/RM Ferramentas para Mapeamento Objeto/Relacional NextGeneration CodeCharge MyGeneration MATERIAIS E MÉTODOS Local e Período Materiais Fontes Bibliográficas Hardwares Softwares Metodologia Visual Studio Microsoft SQL Server

7 vii NHibernate Localizando e configurando o NHibernate Utilizando o NHibernate para manipular o O/RM Gentle.Net Localizando e configurando o Gentle.Net Utilizando o Gentle.Net para manipular o O/RM MyGeneration Localizando e instalando o MyGeneration Utilizando o MyGeneration para fazer o Mapeamento de Objetos 49 4 RESULTADOS E DISCUSSÕES Utilização do MyGeneration no O/RM Gerenciador de Notícias Diagrama de banco de dados do gerenciador de notícias Web config do Gerenciador de Notícias Áreas de gerenciamento da aplicação Área de Notícias Análise de Performance Comparação entre NHibernate e Gentle.Net Análise de Performance entre NHibernate e Gentle.NET CONSIDERAÇÕES FINAIS REFERÊNCIAS BIBLIOGRÁFICAS... 75

8 viii LISTA DE TABELAS Tabela 1: Cronograma de atividades desenvolvidas Tabela 2: Comparativo das características entre os frameworks Tabela 3: Resultado do comparativo de performance entre o Gentle.NET e o NHibernate... 70

9 ix LISTA DE FIGURAS Figura 1: Exemplo de uma consulta utilizando HQL no lugar de SQL Figura 2: Exemplo de uma consulta HQL com restrição Figura 3: Exemplo de uma consulta utilizando SQL Figura 4: Classe utilizada para manipular ações no banco de dados Figura 5: Classe que abre e fecha a conexão com o banco de dados Figura 6: Classe Pessoa Serializada Figura 7: Conexão entre os objetos persistentes e a biblioteca de prevalência. Exemplo modificado de (SANTOS, MACEDO, CITRANGULO & VISCONTI, 2003) Figura 8: Método de inserção utilizando prevalência Figura 9: Método de Alteração utilizando prevalência Figura 10: Método de Exclusão utilizando prevalência Figura 11: Método que realiza a consulta de pessoa utilizando prevalência Figura 12: Mapeamento feito da classe Noticia para a tabela TbNoticia Figura 13: Mapeamento feito da tabela TbNoticia para a classe Noticia Figura 14: Mapeamento de uma tabela TbNoticia para uma classe Noticia Figura 15: Efetuando download do NHibernate Figura 16: Classe TbPessoa Figura 17: Arquivo de mapeamento da classe TbPessoa para sua tabela correspondente39 Figura 18: Configurando o web.config da aplicação exemplo para utilizar o NHibernate Figura 19: Formulário para inserção de dados Figura 20: Classe NHibernateHelper Figura 21: Código RetornaPessoas() da classe PessoaDAO Figura 22: Método responsável por inserir um registro de uma nova pessoa no banco Figura 23: Método que retorna um registro da tabela TbPessoa Figura 24: Exemplo da classe TbNoticia e do mapeamento dos objetos da classe... 46

10 x Figura 25: Exemplo de inserção de dados utilizando o Gentle.NET Figura 26: Exemplo de consulta utilizando o Gentle Figura 27: Template Browser do MyGeneration Figura 28: Lista de Template Library Figura 29: Ação para gerar os códigos utilizando o Gentle.NET Figura 30: Tela de configuração do que será gerado Figura 31: Mapeamento da classe TbNoticia para o NHibernate Figura 32: Exemplo de Herança utilizando o NHibernate Figura 33: Mapeamento da classe TbNoticia para o Gentle.NET (Parte 1) Figura 34: Mapeamento da classe TbNoticia para o Gentle.NET (Parte 2) Figura 35: Mapeamento da classe TbNoticia para o Gentle.NET (Parte 3) Figura 36: Mapeamento da classe TbNoticia para o Gentle.NET (Parte 4) Figura 37: Mapeamento da classe TbNoticia para o Gentle.NET (Parte 5) Figura 38: Diagrama do banco do gerenciador de notícias Figura 39: O arquivo web.config da aplicação para utilizar o NHibernate Figura 40: O arquivo web.config da aplicação para utilizar o Gentle.NET Figura 41: Utilizando o NHibernate para salvar uma notícia Figura 42: Utilizando o NHibernate para alterar uma notícia Figura 43: Inserindo uma notícia no banco utilizando o Gentle.NET... 66

11 xi LISTA DE ABREVIATURAS BD BDR O/R O/RM SGBD Banco de Dados Banco de Dados Relacional Objeto/Relacional Mapeamento Objeto/Relacional Sistema Gerenciador de Banco de Dados

12 12 1 INTRODUÇÃO Dentro do contexto de desenvolvimento de sistemas um grande problema enfrentado pelos desenvolvedores refere-se à questão de modelar e implementar seguindo o paradigma orientado a objetos e ter que trabalhar com um Sistema de Gerenciamento de Banco de Dados (SGBD) relacional na camada de persistência. Uma alternativa para contornar este problema refere-se à utilização de ferramentas que façam o trabalho de converter os objetos provenientes da lógica de negócio para o banco de dados relacional, e vise-versa. Atualmente, as ferramentas mais utilizadas para fazer este mapeamento, dadas às necessidades dos desenvolvedores em ganhar tempo na hora de mapear e persistir os dados são: Hibernate (desenvolvida para trabalhar com a linguagem de programação Java), Gentle.Net (desenvolvida para o.net), NHibernate (desenvolvida para o.net), entre outras. O NHibernate, ferramenta utilizada neste trabalho juntamente com o Gentle.NET, assim como as outras ferramentas, é um framework ou biblioteca desenvolvida para o.net para persistir e mapear objetos para um banco de dados relacional (AÉCE, 2004). O NHibernate é uma ferramenta derivada do Hibernate (Java) para o.net sendo sua finalidade basicamente a mesma, ou seja, mapear objetos e persistir os mesmos em um SGBD relacional, onde as instruções Struct Query Language (SQL) de gerenciamento dos dados são criadas pelo próprio NHibernate e não pelo desenvolvedor. O Gentle.NET, também tem a mesma finalidade, tendo como principal diferença a forma como são definidos os arquivos de mapeamento. Por exemplo, no NHibernate as configurações do mapeamento são realizadas através de arquivos extensible Markup Language (XML), onde é definido e especificado os atributos das classes, bem como seu tipo de dado. Já no Gentle.NET, o mapeamento é feito direto nas classes de dados, onde é descrito o tipo do atributo, se é chave primária, estrangeira, se pode ser nula, entre outra coisas, assim como é feito no NHibernate no arquivo de mapeamento de cada classe.

13 13 Este trabalho tem como objetivo estudar os conceitos relacionados ao mapeamento de objetos para banco de dados relacionais e realizar um comparativo de performance entre o NHibernate e o Gentle.Net nos quesitos: velocidade de inserção, alteração, pesquisa e exclusão de dados, envolvendo um objeto e, posteriormente, envolvendo vários objetos. Para tanto, será desenvolvido um gerenciador de notícias utilizando estas duas ferramentas para que os objetivos deste trabalho sejam atendidos. Estas ferramentas foram selecionadas porque se optou por trabalhar com a plataforma de desenvolvimento.net. Esta plataforma foi selecionada por causa das facilidades oferecidas no desenvolvimento de aplicações orientadas a objetos, dentre outros benefícios advindos com a programação em ASP.NET. Assim sendo, para atender os objetivos deste trabalho, a seção 2 deste trabalho irá abordar os estudos realizados sobre mapeamento de objetos e persistência de dados utilizando as ferramentas NHibernate e Gentle.NET. A seção 3 apresenta os materiais e métodos, bem como um manual de configuração e utilização das ferramentas utilizadas neste trabalho. Por fim, a seção 4 apresenta os resultados e discussões produzidas nesse trabalho, na seção 5 é apresentado as considerações finais a respeito do trabalho desenvolvido e a seção 6 apresenta as referências bibliográficas utilizadas nesse trabalho.

14 14 2 REVISÃO DE LITERATURA Para que os objetivos deste trabalho fossem atingidos, foram realizadas pesquisas envolvendo o tema a ser estudado, sendo que os mesmos serviram de suporte para o desenvolvimento do gerenciador de notícias, assim como forneceu subsídios para a comparação entre as ferramentas selecionadas e analisadas. 2.1 Banco de Dados Relacional Para que se possa realizar um mapeamento de objetos para um banco de dados relacional, é necessário, antes de qualquer coisa, escolher a ferramenta que será utilizada para mapear os objetos, assim como o Sistema de Gerenciamento de Banco de Dados (SGBD) que gerenciará a base de dados. Ao escolher o SGBD, seja ele Relacional, Objeto Relacional (O/R) ou Orientado a Objetos (OO), uma das maiores preocupações na utilização do banco escolhido refere-se à necessidade de se ter um banco que consiga identificar, organizar, otimizar e suportar comandos do tipo SQL e HQL, que são tipos de comandos que permitem a manipulação das ações sobre o banco de dados, tais como: inserção, alteração, pesquisa e exclusão de dados Hibernate Query Language (HQL) HQL é uma poderosa linguagem de manipulação de dados, similar ao SQL, cujo objetivo é trabalhar sobre as classes de dados e suas propriedades, onde são montadas instruções HQL através das propriedades das classes e, conseqüentemente, são executadas ações no banco de dados utilizado (ROSEINDIA, 2006). Esta linguagem foi criada para ser utilizada pelo Hibernate (Java), que foi expandido para o NHibernate, versão do Hibernate para ser executado com o ASP.NET, e que tem como objetivo ajudar os desenvolvedores.net na codificação de suas aplicações, manipulando os dados do banco, facilitando, assim, o

15 15 trabalho dos desenvolvedores, pois os livra da necessidade de criar as instruções SQL, pois tanto o NHibernate, como Hibernate já fazem isso através da utilização do HQL. Para entender melhor o funcionamento de uma HQL a Figura 1 ilustra um exemplo de consulta que retorna todas as notícias de um banco de dados. Figura 1: Exemplo de uma consulta utilizando HQL no lugar de SQL No exemplo ilustrado acima (Figura 1), a variável hql recebe uma string referente à tabela TbNoticiaCategoria onde, logo após a referência da tabela, a mesma é renomeada para noticia, cujo objetivo é de não precisar utilizar o nome da tabela por inteiro na hora de ordenar os dados. Após a atribuição da string à variável hql, é verificado se a variável column passada como parâmetro é nula. Caso não seja, é acrescentada à variável hql uma outra string que tem a finalidade de ordenar os dados de retorno da consulta realizada segundo o nome da coluna passada pelo parâmetro. Utilizando a HQL é possível realizar diversas formas de consultas como, por exemplo, uma consulta onde serão listadas todas as notícias que estejam dentro do prazo de validade, conforme ilustra a Figura 2.

16 16 Figura 2: Exemplo de uma consulta HQL com restrição No exemplo ilustrado na figura acima, nas linhas 27 e 28, é feita uma restrição na consulta onde estão sendo buscadas somente notícias cuja data de vencimento da mesma seja maior do que a data atual do servidor. Observando a consulta realizada em comparação com uma consulta SQL é notável a semelhança entre as linguagens HQL e SQL, pois as mesmas utilizam cláusulas parecidas e em muitas vezes iguais como é o caso do exemplo ilustrado na Figura 2 nas clausulas FROM e WHERE. Diferentemente da HQL, a SQL utiliza as tabelas do banco de dados e suas colunas para executar uma consulta, inserção, alteração e exclusão de dados, conforme ilustra a Figura 3.

17 17 Figura 3: Exemplo de uma consulta utilizando SQL No exemplo ilustrado na Figura 3, para se fazer uma consulta, diferente da HQL, é necessário fazer o mapeando de todas as tabelas e campos que serão necessários para o retorno da consulta. Comparando as instruções contidas na Figura 1 e 2 com as contidas na Figura 3, observa-se que na Figura 1 e 2 as únicas clausulas utilizadas foram: FROM, WHERE e ORDER BY. Já na Figura 3 foram utilizadas as clausulas: SELECT, FROM e ORDER BY, o que significa que, tanto a linguagem HQL, quanto a SQL compartilham praticamente as mesmas cláusulas ao realizar uma consulta de dados. Porém, a utilização da linguagem HQL e/ou SQL, dá-se de acordo com o contexto ao qual o desenvolvedor está trabalhando. Caso o desenvolvedor esteja trabalhando com o framework NHibernate é mais aconselhável utilizar a HQL, por ser uma linguagem própria do framework que trabalha com as classes de dados e suas propriedades, mas, caso queira utilizar SQL, tanto o NHibernate quanto o Gentle.NET permite utilizar SQL para manipulação dos dados, portanto, a escolha em utilizar SQL ou HQL fica a caráter da necessidade do momento onde a utilização de uma das duas linguagens seja complicada de usar ao invés da outra. 2.2 Persistência de Dados Dentro do contexto de desenvolvimento de sistemas, a persistência de dados é uma forma de manter as informações das aplicações em um meio do qual possam ser recuperadas para

18 18 consultas, entre outras finalidades. Assim sendo, a persistência de dados, segundo DIAS (2005), pode ser definida como sendo: uma forma de manter a existência da informação mesmo fora da aplicação, podendo persistir a informação em um banco de dados, em um arquivo de dados ou qualquer outro meio existente e o fato da informação existir também fora da aplicação faz com que essas informações possam ser compartilhadas por outras aplicações. No geral, existem duas formas de persistência: a tradicional e a prevalência (DIAS, 2005). As próximas seções irão abordar estas duas formas de persistência de dados Persistência Tradicional Esse tipo de persistência é á mais utilizada pelos desenvolvedores, embora seja mais trabalhosa de usar, pois os comandos SQL devem ser montados pelos desenvolvedores e enviados ao banco de dados através de um provider 1 (DIAS, 2005). Para melhorar a utilização desse tipo de persistência, os desenvolvedores web costumam utilizar um framework de persistência. Com a utilização de um framework de persistência, os desenvolvedores não precisam preocupar-se em criar as instruções SQL para realizar as operações de inserção, alteração, pesquisa e exclusão. Isto ocorre porque o próprio framework se encarrega de realizar esta tarefa através de uma classe de manipulação que executa diversas operações no banco de dados. A classe de manipulações é composta por um conjunto de métodos que realiza as ações sobre o banco de dados. Esta classe será ilustrada na seção Para exemplificar o funcionamento da persistência tradicional, a Figura 4 representará a classe Pessoa de uma aplicação qualquer, cuja finalidade é manipular as ações sobre o banco de dados através de comandos SQL, desenvolvidos pelo(s) desenvolvedor(es) da aplicação. 1 Provider é a variável aonde é declarado qual tipo de vinculação de dados será realizado na sua conexão (BASSI, 2006), como, por exemplo, se será utilizado um banco Microsoft Access, ou um SGBD MYSQL, SQLSERVER, entre outros, para a conexão e execução de comandos no banco de dados escolhido.

19 19 Figura 4: Classe utilizada para manipular ações no banco de dados No exemplo da Figura 4 são apresentados os métodos GravarPessoa e GetPessoa da classe Pessoa, que possuem as funções de gravar uma nova pessoa e retornar uma pessoa específica do banco de dados. Observa-se também que é criada uma instância da classe banco, que é a responsável por abrir e fechar uma conexão com o banco de dados. A Figura 5, ilustrada abaixo, refere-se à classe banco, citada acima, que é utilizada por todas as classes desta aplicação utilizada como exemplo.

20 20 Figura 5: Classe que abre e fecha a conexão com o banco de dados A classe ilustrada acima é a responsável por abrir e fechar a conexão com o banco de dados, assim como executar a leitura no mesmo, através do método ler, que recebe uma instrução SQL como parâmetro, abre a conexão com o banco e executa a instrução. Após a execução da instrução SQL, o retorno da consulta é armazenando na variável reader, que será utilizada em todas as classes de dados nos métodos Get das mesmas, que são métodos de busca com retorno e que utiliza o método ler da classe banco para acessar e retornar dados da(s) tabela(s) do banco de dados.

21 21 A próxima seção irá ilustrar o funcionamento de outro tipo de persistência, chamada de persistência prevalência, explicando o que é esse tipo de persistência de dados e exemplificando o seu funcionamento Persistência Prevalência Esse tipo de persistência trabalha com a memória RAM do computador, onde ficam armazenados todos os objetos e dados da aplicação. O fato desse tipo de persistência trabalhar com a memória do computador e não com um banco de dados é por causa do valor da licença de um SGBD ser bastante cara, além de outros quesitos (DIAS, 2005). Pelo fato desse tipo de persistência não utilizar um banco de dados para armazenar e recuperar as informações contidas no mesmo faz os desenvolvedores pensarem que se algumas situações ocorrerem como, por exemplo, a energia acabar, os dados serão perdidos (DIAS, 2005). Porém, esse pensamento não é correto, pois, a prevalência trabalha com os conceitos de PrevalenceEngine, PrevalentSystem, Snapshots e Operation, descritos a seguir (MENDES, 2006): PrevalenceEngine é o responsável pela execução, recuperação e registro de alterações decorridas no PrevalentSystem. PrevalentSystem trata-se de uma classe definida pelo usuário onde serão colocadas as referências de todos os objetos que serão persistidos da aplicação. Snapshots é um tipo de backup das informações e objetos da aplicação onde o PrevalenceEngine serializa os objetos e o Snapshots armazena, em forma de log no disco rígido do computador, os dados da aplicação e os objetos para uma possível recuperação após uma queda de energia, por exemplo. Operation é uma classe de operações utilizada pelo PrevalenceEngine para executar operações sobre os objetos da aplicação. Para o melhor entendimento deste mecanismo de persistência, observam-se os trechos de códigos apresentados nas Figuras 6 e 7, onde são mostrados desde a criação das classes serializadas 2, até as operações de inserção, alteração, pesquisa e exclusão de objetos prevalentes. 2 Classes serializadas é uma forma de acesso aos dados de uma aplicação através de um arquivo XML onde um usuário, após logar no site web e realizar uma consulta, ou automaticamente a consulta tiver sido inicializada, a forma de acesso aos dados será feita em cima de um documento XML carregado com os dados da aplicação.

22 22 Figura 6: Classe Pessoa Serializada Conforme ilustra a Figura 6, sempre que for utilizada prevalência, as classes de negócios devem ser serializadas para que os objetos possam ser persistidos. Após a criação das classes de negócios, o próximo passo é fazer a conexão entre os objetos de persistência e a biblioteca de prevalência na hora de executar a aplicação, conforme ilustra a Figura 7. Figura 7: Conexão entre os objetos persistentes e a biblioteca de prevalência. Exemplo modificado de (SANTOS, MACEDO, CITRANGULO & VISCONTI, 2003).

23 23 A Figura 7 ilustra um método que é invocado para a inicialização da aplicação, onde uma instância de PrevalenceEngine é criada para que sejam utilizadas as funções de prevalência. Logo após, é utilizado uma instância do objeto SystemDatabase para verificar a existência de algum log gravado na pasta ProjetoTCC do servidor da aplicação, onde serão recuperados os dados da aplicação do último log gravado em disco na memória do servidor. As duas últimas linhas de comandos adicionam na aplicação os dois objetos instanciados para que possam ser utilizadas as funções contidas nos mesmos. A Figura 8 apresenta o método que realiza uma inserção utilizando a prevalência. Figura 8: Método de inserção utilizando prevalência Conforme ilustra a Figura 8, a execução de uma inserção é feita utilizando uma interface chamada ICommand onde, através da mesma, o método Execute é invocado e utilizado pela biblioteca de prevalência para fazer uma inserção. A Figura 9 ilustra o método que realiza a alteração utilizando a prevalência.

24 24 Figura 9: Método de Alteração utilizando prevalência A execução do método de atualização é semelhante ao de inserção, ou seja, é invocado a interface ICommand para que a execução da atualização possa ocorrer. O método que realiza a exclusão é mostrado na Figura 10. Figura 10: Método de Exclusão utilizando prevalência Assim como os outros métodos apresentados, o método que realiza a exclusão também utiliza a interface ICommand para executar a exclusão utilizando a biblioteca de prevalência. A execução desse método é bastante simples, ao executar o método Execute é feita uma busca pela pessoa que contenha o _id correspondente e, logo em seguida, caso a pessoa tenha sido encontrada, é feita à exclusão da mesma. Por fim, o que realiza a busca de pessoa é ilustrado na Figura 11.

25 25 Figura 11: Método que realiza a consulta de pessoa utilizando prevalência Todos os métodos apresentados anteriormente utilizam a interface ICommand para executar os métodos da biblioteca de prevalência. Já o método de consulta é um pouco diferente, pois a interface que utiliza a biblioteca de prevalência que faz a consulta de dados é a IQuery onde é passado o id do objeto Pessoa para a interface IQuery, responsável por fazer uma busca binária dentro de um vetor de objetos persistidos e retornar o objeto pesquisado. Assim, de acordo com o que foi apresentado sobre prevalência, pode-se concluir que a mesma tem um ganho em desempenho devido ao não acesso a disco para, por exemplo, consultar dados. No entanto, esse tipo de persistência é desvantajoso quando se tem uma aplicação que tenha que fazer acesso a milhares de dados onde, simultaneamente, muitos usuários estejam acessando. Como os dados ficam em memória, a mesma ficaria sobrecarregada com tantos acessos fazendo com que a aplicação pare de funcionar (DIAS, 2005). As próximas seções deste trabalho abordarão alternativas para persistir dados das aplicações como, por exemplo, utilizando framework de persistência de dados, técnicas estas que estão sendo utilizadas por muitos desenvolvedores por ser mais fácil e simples de trabalhar com mapeamento de dados e a persistência dos mesmos. 2.3 Mapeamento Objeto/Relacional Mapeamento Objeto/Relacional ou O/RM é uma camada a mais que o desenvolvedor codifica cuja finalidade é a de mapear as classes e seus atributos para o banco de dados ou fazer o inverso, mapear das tabelas e colunas para as classes de dados e seus atributos.

26 26 Existem várias formas de se fazer tal tipo de mapeamento, dentre as quais se destaca o uso de frameworks que utilizam arquivos XML para mapear e persistir os objetos de uma aplicação. Ao utilizar um framework, os comandos SQL para as inserções, alterações, pesquisas e exclusões de dados não serão mais criados pelo desenvolvedor, pois tal responsabilidade passará a ser do framework utilizado (DIAS, 2005). A utilização de um framework de persistência, além de gerar os comandos SQL que realizam as operações de inserção, alteração, seleção e exclusão, é um mecanismo de segurança capaz de eliminar os problemas ocasionados com os comandos de SQL injection. Por exemplo, em um formulário de autenticação de usuários, supondo que o desenvolvedor não trate a apóstrofe ( ), ao tentar logar com um login fictício, tal como: testa ndo, a SQL de autenticação irá retornar um erro do tipo incorrect Sintax, no qual será uma das diversas formas de entrada para o hacker invadir o sistema e fazer o que quiser, como, por exemplo, excluir tabelas entre outras coisas.assim, ao retornar um erro de SQL, se o hacker quiser excluir uma tabela do banco de dados, bastará fazer o seguinte código no campo login: login = '; drop table users-- senha =, Em geral existem vários tipos de frameworks de persistência que trabalham com o C#, Java, entre outras linguagens, cuja finalidade é basicamente a mesma, ou seja, mapear e persistir os objetos da aplicação para um banco de dados relacional. Para que o mapeamento de objetos possa ocorrer, existem algumas formas a serem seguidas pelo desenvolvedor, formas estas abordadas na próxima seção Formas de Mapeamento Existem, em geral, duas formas de se mapear objetos. A primeira forma é mapear as classes de negócios para as tabelas do banco de dados. A segunda forma corresponde ao inverso, ou seja, mapear as tabelas do banco de dados, bem como seus atributos, para as classes de dados. Na primeira forma, os atributos das classes são mapeados para as colunas de uma ou várias tabelas do banco de dados, assim como os relacionamentos entre as tabelas serão feitos com base nas referências contidas nas classes mapeadas. Quanto à persistência desses dados, nem todos os atributos das classes precisam ser persistidos, como, por exemplo, atributos que podem ser calculados dinamicamente, como

27 27 idade, valor total de uma compra, e etc. Dentre os exemplos citados, o atributo idade não precisa ser persistido porque se pode calculá-lo subtraindo a data atual da sua data de nascimento. Além do fato de nem todo atributo precisar ser persistido, nem todas as classes de dados de uma aplicação é necessariamente uma tabela e vice-versa (QUICOLI, 2006). Um exemplo desta situação refere-se a uma tabela de tipos, por exemplo, PessoaTipo (classe utilizada para dar permissão aos usuários de uma aplicação de acordo com seu tipo) onde ao mapear essa tabela a mesma não corresponderá a uma classe igual as demais, ou seja, só conterá Enum referenciando os tipos contidos na tabela onde uma outra classe poderá utilizar da classe de Enum referente a esta classe PessoaTipo para realizar comparações de tipo, entre outras situações. Para exemplificar essa primeira forma, foi criada uma classe chamada Notícia e uma tabela chamada TbNotícia, conforme ilustra a Figura 12. Figura 12: Mapeamento feito da classe Noticia para a tabela TbNoticia A Figura 12 apresenta o mapeamento da classe Noticia para a tabela TbNoticia. Observa-se que os atributos, assim como seus tipos de dados foram mantidos, com exceção do atributo id_noticia_categoria, que ao ser mapeado para a tabela TbNoticia, virou uma chave estrangeira da tabela TbNoticiaCategoria devido a sua referência contida na classe Noticia.

28 28 Para ilustrar a segunda forma de mapear objetos (do banco de dados para as classes de dados), foi utilizada a tabela TbNoticia e sua respectiva classe de dados, conforme ilustra a Figura 13. Figura 13: Mapeamento feito da tabela TbNoticia para a classe Noticia Conforme mostra a Figura 13, ao mapear tabelas para as classes, ocorreu um inverso da primeira forma, ou seja, as tabelas do banco viraram as classes, e as colunas de cada tabela viraram atributos da classe correspondente, além de serem mantidos os tipos de dados, com exceção das chaves estrangeiras da tabela TbNoticia, responsáveis por manter as referências às tabelas TbNoticiaCategoria e TbPessoa, que viraram objetos das suas respectivas classes. Além das duas formas de Mapeamento Objeto-Relacional, algumas etapas são necessárias e devem ser seguidas para que o mapeamento seja feito corretamente. A próxima seção irá abordar estas etapas.

29 Etapas para fazer o O/RM Para fazer o mapeamento de objetos, antes de qualquer coisa, é necessário ter, ou o banco de dados cujas tabelas correspondem a 100% das necessidades de uma aplicação, ou as classes de dados da aplicação criadas para, a partir daí, iniciar o mapeamento dos objetos, seja das classes para o banco de dados ou vice-versa. Tendo o usuário um banco de dados e tendo ou não as classes de dados correspondentes da aplicação, o mapeamento dos objetos a partir das tabelas e colunas do banco para as classes poderá ser feito manualmente ou com o auxílio de ferramentas de mapeamento como, por exemplo, o MyGeneration (seção 3.3.3) que utiliza o NHibernate para mapear os objetos. Esta ferramenta será apresentada na seção Ao escolher fazer o mapeamento de forma manual dos objetos, o desenvolvedor deverá utilizar um arquivo para cada classe e tabela(s) que a classe representará. Este arquivo deverá ter a terminação hbm.xml, pois é esta a extensão que designa que este é um arquivo XML e corresponde ao mapeamento dos objetos. O desenvolvedor, além de criar estes arquivos, deverá implementar também às classes de dados correspondentes. A Figura 14 ilustra o mapeamento feito de uma tabela TbNoticia para uma classe Noticia. Figura 14: Mapeamento de uma tabela TbNoticia para uma classe Noticia

30 30 A Figura 14 apresenta o mapeamento através das configurações realizadas em um arquivo XML onde, na primeira linha (1) a tag <hibernate-mapping xmlns= urn:nhibernatemapping-2.0 > corresponde a referência a ferramenta utilizada para mapear os objetos. Nesse caso a ferramenta utilizada foi a NHibernate (seção 3.3.1) onde todo o mapeamento dos atributos da classe está entre a tag ilustrada na linha 1. Na linha 2, a tag class representa a referência ao projeto a qual a classe pertence e de qual tabela a classe foi mapeada. Nesse caso, conforme ilustra a Figura 14, a classe TbNoticia foi mapeada da tabela TbNoticia e está contida no projeto MapeamentoOR onde, para que a classe Noticia, assim como qualquer outra classe pertencente ao projeto MapeamentoOR, possa ser acessada, basta gerar uma dll do projeto MapeamentoOR clicando com o botão direito do mouse sobre o projeto MapeamentoOR e, em seguida, no botão Build, e importar a dll no projeto principal, através da diretiva using MapeamentoOR, liberando as propriedades da classe Noticia e das demais classes contidas no projeto MapeamentoOR para serem utilizadas. Na linha 3, a tag id representa a coluna auto-incremental da tabela TbNoticia que, nesse caso, é a id_noticia, cujo tipo de dado desse atributo é o Int32, que representa na classe Noticia o tipo int. Nas linhas 4 e 5, as tags many-to-one representam as referências que a tabela TbNoticia tem com outras duas tabelas que são as TbNoticiaCategoria e TbPessoa. No caso de se ter outra tabela com contenha mais de duas referências a outras tabelas, basta acrescentar outra tag many-to-one e referenciar a classe que a tabela em questão está ligada, conforme ilustra as linhas 4 e 5 da Figura 14. Por último, nas linhas 6 a 9 a tag property representa as colunas da tabela do banco de dados cujos tipos de dados de cada coluna são representados por um determinado tipo de dado no arquivo XML. A tag property, através do campo column, referência à mesma coluna da tabela do banco de dados, além do seu tipo de dado e de seu tamanho, assim como se pode ser nula ou não, se é chave única, se é chave estrangeira e se é auto-incrementada. Já para fazer um mapeamento automático, o desenvolvedor deverá utilizar uma ferramenta conforme mencionado nos primeiros parágrafos desta seção para gerar os códigos de mapeamento de forma que o desenvolvedor não precise mudar caso o código tenha sido gerado corretamente pela ferramenta. A ferramenta utilizada deve ser um framework como, por exemplo, o NHibernate para gerar o mapeamento automático que irá criar para o desenvolvedor os arquivos XML de mapeamento e as classes de dados. Um

31 31 exemplo de ferramenta que faz este mapeamento automático é a MyGeneration, ferramenta esta que será descrita na seção Contudo, um mapeamento feito de forma automática é, praticamente, o mesmo feito de forma manual, com a diferença do ganho de tempo que o desenvolvedor terá no momento que for fazer o mapeamento. Fazendo o mapeamento de forma manual o desenvolvedor deverá criar os dois arquivos, as classes de dados e o arquivo XML de mapeamento, o que acarretará em um tempo considerável, que poderia estar sendo aproveitado para codificar outros módulos da aplicação. Já no mapeamento de forma automática, a ferramenta de mapeamento gera os arquivos para o desenvolvedor em poucos segundos fazendo com que sua aplicação possa ser desenvolvida em um espaço de tempo menor, pois as classes de dados e os mapeamentos já estão criados. Para a utilização de ferramentas na geração automática de um mapeamento de objetos, é utilizado um framework especifico que é escolhido na hora de gerar o mapeamento. A próxima seção irá abordar algumas ferramentas que utilizam frameworks para a geração do mapeamento automático dos objetos Ferramentas para Mapeamento Objeto/Relacional Atualmente existem diversas ferramentas que realizam o mapeamento Objeto/Relacional onde, em muitos casos, uma é mais completa que a outra em determinados quesitos, como, por exemplo, na geração não só do mapeamento dos objetos e classes, mas também na geração da interface bruta do sistema, dada as classes de dados geradas. Dentre as ferramentas existentes encontradas para a realização deste trabalho, foi escolhida a ferramenta chamada MyGeneration, que foi a única capaz de realizar o mapeamento dos objetos, tanto do banco de dados para as classes, como o contrário. Nas seções seguintes, serão apresentadas três ferramentas encontradas e testadas, bem como uma breve descrição sobre cada uma NextGeneration O NextGeneration é uma ferramenta free cuja funcionalidade vai além de gerar os objetos mapeados e suas classes de dados (sem usar framework), essa ferramenta gera, além do

32 32 mapeamento dos objetos e das classes, a interface do sistema de acordo com as classes e mapeamentos gerados, onde a geração de todo o conjunto resulta em uma aplicação já em estado de funcionamento. Assim, após a geração feita por essa ferramenta, será preciso mudar somente o designer das páginas e alguns detalhes, como, por exemplo, os nomes nos formulários que são gerados em inglês. Esta ferramenta não foi escolhida para ser utilizada neste trabalho porque a mesma é um gerador de códigos que não mapeia objetos provenientes da lógica de negócios para o banco. Porém, para outras situações, como por exemplo, no desenvolvimento de sistemas sem a necessidade de se mapear objetos das classes para o banco, esta ferramenta pode agregar maior agilidade no processo de desenvolvimento de software uma vez que essa ferramenta gera tudo (classes, triggers, procedures e interface) a partir de um banco de dados. Outras informações podem ser encontradas em (RADSOFTWARE, 2004) CodeCharge O CodeCharge é uma ferramenta de auxílio aos desenvolvedores de ASP.NET, PHP4/PHP5, PERL5, JSP e ASP, pois gera de forma automática todo o código de mapeamento nas linguagens mencionadas a partir do banco de dados. É uma ferramenta free e pode ser baixada em (YESSOFTWARE, ). Esta ferramenta não foi escolhida pelo mesmo da anterior, ou seja, por não mapear os objetos das classes de dados para o banco. Porém, caso se queira conhecer mais detalhe acerca desta ferramenta, busque em (YESSOFTWARE, ) MyGeneration Essa ferramenta é muito fácil de utilizar e pode ser baixada gratuitamente em (MYGENERATION, ). Diferente das outras duas ferramentas citadas nas seções anteriores, a MyGeneration requer a utilização de um framework de persistência para realizar o mapeamento dos objetos. Por exemplo, no caso de se estar trabalhando com a plataforma.net para a geração do mapeamento dos objetos e das classes de dados, o framework utilizado poderia ser o NHibernate. Além de gerar códigos para a plataforma.net, o MyGeneration gera códigos para outras linguagens como, o PHP4, entre outras. Essa ferramenta suporta os frameworks:

33 33 doodads, Gentle.NET, Opf3, NHibernate, Microsoft s DAAB, EasyObjects/EntLib, DotNetNuke e ibatis. Além dos frameworks mencionadas o MyGeneration suporta os bancos de dados: MicrosoftSQL, Oracle, IBM DB2, PostgreSQL, Microsoft Access, FireBird, Interbase, BistaDB, SQLLite, MySQL, Advantage e Pervasive. Um melhor detalhamento sobre como utilizar essa ferramenta pode ser visto em (MYGENERATION, ), ou na seção 3.3.5, no qual serão apresentados alguns detalhes de utilização desta ferramenta. A próxima seção relata os materiais e métodos utilizados para que os objetivos estabelecidos na proposta do presente trabalho fossem atingidos onde será relatado sobre as ferramentas utilizadas para o desenvolvimento do gerenciador de notícias bem como adquirir e configurar cada ferramenta.

34 34 3 MATERIAIS E MÉTODOS Para o desenvolvimento deste trabalho foram utilizados vários recursos bibliográficos, além de hardware e software que, unidos, permitiram a finalização deste trabalho. 3.1 Local e Período Este trabalho foi realizado nos laboratórios de informática do Centro Universitário Luterano de Palmas (CEULP/ULBRA) e na Fundação Universidade do Tocantins (UNITINS). Este trabalho teve início no primeiro semestre de 2006, como requisitos parciais das disciplinas Trabalho de Conclusão de Curso em Sistemas de Informação I e Trabalho de Conclusão de Curso em Sistemas de Informação II. 3.2 Materiais Para o desenvolvimento deste trabalho, os materiais (recursos) utilizados, tais como software e hardware licenciados, foram disponibilizados pelo curso de Sistemas de Informação do CEULP/ULBRA em seus laboratórios e pela Fundação Universidade do Tocantins (UNITINS) no setor de desenvolvimento de software. Os materiais estão separados em três categorias: software, hardware e fontes bibliográficas disponibilizadas pelo orientador e por consultas feitas na Internet Fontes Bibliográficas Sites diversos Artigos Tutoriais

35 Hardwares Pentium IV, 3.2 Mhz e 1 Gb de RAM; Pentium III, 900 Mhz e 512 Mb de RAM; Softwares Microsoft Windows 2000 Professional ( Microsoft Windows XP Professional ( Microsoft Office 2003 Professional ( Microsoft Visual Estúdio 2005 ( Microsoft SQL Server 2000 ( MyGeneration ( Internet Explorer 6.0 ( Adobe Acrobat Reader 7.0 ( 3.3 Metodologia Para o desenvolvimento deste trabalho foram realizadas pesquisas sobre o tema que foi crucial para o desenvolvimento da proposta: comparativo de performance entre as ferramentas NHibernate e Gentle.NET no mapeamento de objetos para banco de dados relacionais. Para isso foi realizado um estudo sobre as ferramentas: NHibernate, Gentle.NET e MyGeneration, de forma a fornecer subsídios para o desenvolvimento de um gerenciador de notícias através dos códigos gerados pela ferramenta MyGeneration que, junto com o NHibernate e o Gentle.NET, geraram os códigos de mapeamento dos objetos para a camada de persistência de objetos. A seguir será apresentado o cronograma de estudos seguido neste trabalho (Tabela 1). Tabela 1: Cronograma de atividades desenvolvidas Período Atividades desenvolvidas Fevereiro-06 Realização de pesquisas e coleta de informações (artigos, sites, tutoriais, etc) sobre o tema deste trabalho.

36 36 Março-06 Março-06/Abril-06 Abril-06/Mario-06 Junho-06 Estudo dos materiais coletados nas pesquisas realizadas e o desenvolvimento do gerenciador de notícia. Elaboração da monografia: revisão de literatura e materiais e métodos. Elaboração da monografia: resultados e discussões. Revisão da monografia produzida neste trabalho Visual Studio 2005 Para o desenvolvimento da aplicação de gerenciamento de notícias foi utilizado o Visual Studio 2005 uma vez que o desenvolvimento da aplicação foi em ASP.NET. O Visual Studio na versão 2005 veio integrado com outras ferramentas como, por exemplo, Visual Studio Team System que é um conjunto de ferramentas integradas, produtivas e com um ciclo de vida extensível que aumenta a linha de produtos do Visual Studio para permitir maior comunicação e colaboração entre as equipes de desenvolvimento de software (MSDN, 2004) entre outras ferramentas que faz com que uma pessoa com poucos conhecimentos em ASP.NET consiga desenvolver uma aplicação web sem muitas dificuldades Microsoft SQL Server 2000 Para realizar a persistência dos dados, dadas as manipulações realizadas pelo NHibernate e Gentle.NET, foi utilizado o Sistema de Gerenciamento de Banco de Dados (SGBD) SQL Server Este SGBD foi escolhido devido às máquinas utilizadas para realizar este trabalho já possuírem a licença do SGBD mencionado (MICROSOFT, 2006) NHibernate NHibernate é um framework convertido para o.net a partir framework Hibernate (desenvolvido para Java), cujas funcionalidades são basicamente as mesmas, com a diferença das plataformas que cada um trabalha.

37 Localizando e configurando o NHibernate Diferente de outras ferramentas que precisam ser instaladas e depois configuradas para, a partir daí, serem utilizadas, o NHibernate é uma ferramenta free cuja instalação não é necessária, mas apenas configurada Essa ferramenta pode ser baixada no endereço < e sua configuração e utilização é ilustrada na próxima seção Utilizando o NHibernate para manipular o O/RM Para utilizar esse framework serão apresentados alguns passos, exemplificando desde sua aquisição (download), até a utilização do mesmo em uma aplicação exemplo. O primeiro passo a ser feito trata-se da aquisição (download) do NHibernate e, para isso, basta acessar o endereço < e clicar sobre o arquivo nhibernate zip, conforme ilustra a Figura 15. Figura 15: Efetuando download do NHibernate Após ter baixado o arquivo, descompacte-o em uma pasta qualquer (exemplo: C:\NHibernate ) para poder utilizar o NHibernate no desenvolvimento de aplicações. Para demonstrar sua utilização no desenvolvimento de uma aplicação exemplo, o próximo passo será fazer as classes de dados e os arquivos de mapeamento. Para isso, abra um novo

38 38 projeto e atribua ao mesmo um nome qualquer como, por exemplo, MapeamentoOR. A codificação das classes e dos arquivos de mapeamento pode ser feitos de forma manual, ou de forma automática. Caso se opte pela forma automática, será necessário o apoio de uma ferramenta que gere os códigos de mapeamento, como, por exemplo, a ferramenta MyGeneration, descrita na seção Porém, independente da forma escolhida, esses arquivos devem ser os primeiros a serem criados devido a sua utilização no projeto da aplicação, onde se é necessário à utilização das classes e dos arquivos de mapeamentos (feitos ou gerados) para manipulação dos dados contidos na aplicação e no banco. Conforme ilustra a figura abaixo (Figura 16), a classe TbPessoa é composta por apenas um construtor, além dos atributos e propriedades. Figura 16: Classe TbPessoa

39 39 A classe desenvolvida e apresentada na Figura 16 pode ser considerada padrão no sentido de que todas as outras classes seguirão a mesma estrutura, ou seja, também possuirão um construtor, propriedades e atributos. Para cada atributo contido na classe é criada uma propriedade com o nome do atributo, composta pelos métodos get e set, utilizados para atribuir um valor ou para obter o valor do atributo. Após a criação ou geração das classes de dados, o próximo passo será fazer o arquivo de mapeamento. Estes arquivos terão a extensão.hbm.xmo, como, por exemplo: nome_da_classe.hbm.xml. A Figura 16 apresenta o mapeamento da classe TbPessoa para sua tabela correspondente. Figura 17: Arquivo de mapeamento da classe TbPessoa para sua tabela correspondente O arquivo de mapeamento, ilustrado na Figura 17, faz na linha 2 a referência para o framework utilizado para realizar o mapeamento, nesse caso, o NHibernate. Na linha 3 o arquivo de mapeamento da classe Pessoa informa quais os atributos da classe são mapeados para a tabela TbPessoa. Na linha 5 é informada a chave primária da tabela TbPessoa e nas demais linhas são mapeados todos os atributos da classe TbPessoa, assim como suas propriedade: tipo de dado, se pode ou não ser vazio, tamanho do atributo e se é chave estrangeira ou não. O próximo passo será compilar o projeto. Para isto, caso seja utilizado o Visual Stutdio como neste trabalho, basta clicar com o botão direito do mouse sobre o nome do projeto e, em seguida, clicar em Build para gerar a dll do projeto, onde a mesma será

40 40 referenciada na aplicação desenvolvida como exemplo. Caso não, é necessário gerar a dll correspondente na ferramenta utilizada. Após a criação das classes e dos arquivos de mapeamento, assim como da geração da dll do projeto, assim como sua importação no projeto da aplicação exemplo, o próximo passo a ser feito refere-se à configuração do arquivo web.config da aplicação para que se possa utilizar as funcionalidades do NHibernate como, por exemplo, conectar ao banco de dados, conforme ilustra a Figura 18. Figura 18: Configurando o web.config da aplicação exemplo para utilizar o NHibernate Conforme ilustra a Figura 18, nas linhas é especificado que a aplicação exemplo irá ter uma sessão com o NHibernate, ou seja, uma sessão corresponde a utilização das funcionalidades do tipo conexão com o banco e manipulação das ações sobre o banco de dados através do NHibernate. Já nas linhas 22 e 23 é especificado o provider do NHibernate que será utilizado na aplicação exemplo para que, em conjunto com as outras informações de configuração ilustradas nas linhas seguintes, a aplicação exemplo possa conectar-se ao banco e realizar as manipulações dos dados das tabelas do banco. Nas linhas seguintes (25 e 26) é especificado qual o banco será utilizado pela aplicação exemplo que, nesse caso, conforme ilustrado na linha 26 o SGBD a ser utilizado é o SQL Server 2000.

41 41 As linhas 28 e 29 especificam o driver que será utilizado para realizar a conexão com o SQL Server 2000 que, nesse caso, é o driver SqlClientDriver que corresponde ao driver mais próprio para fazer conexão com o SQL Server Para finalizar o arquivo de configuração da aplicação exemplo utilizando as funcionalidades do NHibernate, nas linhas 31 e 32 é especificada a string de conexão com o banco, onde é referenciado o local onde está o banco, o nome da base de dados, o usuário do banco e a senha de acesso. O arquivo de configuração ilustrado na Figura 18 é interessante, pois caso o SGBD utilizado for trocado, basta mudar as linhas de configuração setando o novo SGBD da aplicação. Finalizado este passo, o próximo passo será fazer o formulário para inclusão de dados, conforme ilustra a Figura 19. Figura 19: Formulário para inserção de dados Após ter sido criado o formulário onde serão incluídos os dados de uma nova pessoa, o próximo passo é adicionar a referência NHibernate.dll na pasta bin do projeto da aplicação e criar o arquivo NHibernateHelper, que corresponde ao arquivo onde a aplicação exemplo chama o NHibernate e suas funcionalidades para executar alguma ação sobre o banco, como, por exemplo, uma inserção A figura abaixo (Figura 20), demonstra o conteúdo desta classe, que faz somente uma referência ao NHibernate, correspondente a

42 42 uma conexão com o banco de dados. Neste ponto é utilizado o Padrão de Projeto Singleton, que garante que apenas uma instância de uma determinada classe esteja em memória. Figura 20: Classe NHibernateHelper A Figura 20 ilustra a classe NHibernateHelper que é a responsável por abrir uma sessão com o NHibernate, que corresponde a uma conexão com o banco de dados para a manipulação dos dados na hora de inserir, alterar, pesquisa e deletar dados da aplicação exemplo. Essa classe é utilizada em todas as classes com terminação DAO (nomenclatura atribuída para diferenciar das demais classes, mas que poderia ser qualquer outra terminação) onde é verificada uma sessão ativa com o banco e executada uma ação sobre o mesmo. Adicionada a referência NHibernte.dll ao projeto da aplicação exemplo e criado a classe NHibernateHelper, o próximo passo será fazer as classes com terminação

43 43 DAO ou qualquer outra terminação, que serão as responsáveis por chamar a classe NHibernateHelper para a partir daí manipular os dados da aplicação com o banco. Essa classe PessoaDAO é composta pelos métodos: RetornaPessoas(string column, int maximumrows, int startrowindex), SalvaPessoa(TbPessoa pessoa), RetornaPessoa(int id), ExcluiPessoa(TbPessoa pessoa) e AtualizaPessoa(TbPessoa pessoa). Na Figura 21 (abaixo) é ilustrado o código referente ao método RetornaPessoas() cujo objetivo é de retornar do banco uma lista de pessoas cadastradas. Figura 21: Código RetornaPessoas() da classe PessoaDAO O código ilustrado acima (Figura 21), assim como todos os outros ilustrados nas figuras posteriores desta seção, utilizam um atributo do tipo ISession para receber o retorno do método NHibernateHelper.GetSession(), responsável por verificar a existência de uma conexão com o banco de dados através do NHibernate. Na linha 29 desta mesma figura é verificado se o atributo column não é vazio, para que a ordenação dos dados possa ocorrer de acordo com a coluna selecionada na aplicação após o retorno dos dados. Esse método utiliza a interface IQuery para executar a consulta no banco onde logo após a realização da consulta, é definida a paginação do resultado. O próximo método (SalvaPessoa()) é o responsável por fazer uma inserção no banco, conforme ilustra a Figura 22.

44 44 Figura 22: Método responsável por inserir um registro de uma nova pessoa no banco O método ilustrado acima (Figura 22) utiliza o método NHibernateHelper.GetSession() para verificar a existência de uma conexão com o banco onde, a partir daí, é inserido os dados de uma nova pessoa no banco. Os métodos AtualizaPessoa() e ExcluiPessoa() funcionam da mesma forma que o método mencionado na figura acima, com uma diferença, no lugar do método session.save(pessoa) (linha 56), será utilizado o método de atualização session.update(pessoa) e o de excluir session.delete(pessoa). Por fim, o método RetornaPessoa(), que é responsável pelo retorno de um único registro do banco dado de acordo com o atributo de identificação do registro pesquisado, será apresentado na Figura 23. Figura 23: Método que retorna um registro da tabela TbPessoa Assim como todos os outros métodos ilustrados nas figuras anteriores desta seção, este último também possui a variável session, que recebe uma sessão do NHibernate, que faz a conexão com o banco de dados onde, a partir daí, são executadas as ações. Nesse caso é realizada uma consulta, a qual oferecerá como retorno um registro específico. Por fim, desenvolvidos todos os passos mencionados, basta executar o projeto e ver o resultado. É importante ressaltar que em nenhum momento foi criada uma SQL para realizar a manipulação dos dados, pois o framework é o responsável em fazer as instruções SQL para o desenvolvedor.

45 Gentle.Net O Gentle.NET, assim como o NHibernate, é um framework de persistência, diferenciandose por fazer o mapeamento dos objetos diretamente nas classes de dados, ao contrário do primeiro, que define o mapeamento através de arquivos XML (conforme já mencionado na seção anterior) Localizando e configurando o Gentle.Net O Gentle.Net é uma ferramenta free que pode ser adquirida em (GENTLE.NET, 2006). Sua configuração é um pouco mais complexa do que a do NHibernate, pois o mesmo contém uma chave pública que deve ser instalada para que o arquivo de configuração do Gentle.NET reconheça a chave do mesmo para que possa realizar uma conexão com o banco para manipulação dos dados. Uma alternativa para não ficar dependente da configuração padrão do Gentle é o desenvolvedor fazer a sua própria configuração de acesso ao banco e utilizar o Gentle apenas para manipular os dados. Os arquivos de configuração do Gentle, conforme já mencionado, é padrão no sentido de que a única alteração a ser feita trata-se da string de conexão com o banco e a escolha do provider a ser utilizado. Os arquivos XML de configuração podem ser encontrados em (MERTNER, 2006). Uma vez baixado o Gentle e os arquivos de configuração, o primeiro passo para configurá-lo é descompactar o arquivo do Gentle que foi baixado e copiar o arquivo gentle.snk da pasta Source (Ex.: C:\Gentle-1.2.8\Source) para a pasta C:\Arquivos de programas\microsoft Visual Studio 8\SDK\v2.0\Bin. É importante ressaltar que essa configuração só é possível caso esteja sendo utilizado o Visual Studio devido a instalação da chave do Gentle.NET só poder ser instalada através do arquivo sn.exe (ferramenta do Visual Studio responsável por instalar e gerar chaves para assinar um ou vários módulos assembly) específico do Visual Studio. Após copiar o arquivo para o local acima mencionado, basta acessar o prompt do MSDOS no mesmo endereço da pasta mencionada e digitar o comando sn.exe -i Gentle.snk Gentle para instalar a chave do Gentle onde, após a execução desse comando, deve-se

46 46 copiar o arquivo gentle.snk para o projeto que será desenvolvido a aplicação e importar as dll: Gentle.Common.dll, Gentle.Framework.dll, Gentle.Provider.SQLServer.dll (no caso de está utilizando o SQL Server) e log4net.dll, para o projeto Utilizando o Gentle.Net para manipular o O/RM Conforme já foi dito, o Gentle.NET mapeia os objetos diretamente nas classes de dados da aplicação, não sendo necessário o uso de um arquivo XML de mapeamento, tal como é feito no NHibernate. A Figura 24 ilustra a classe TbNoticia da aplicação exemplo. Figura 24: Exemplo da classe TbNoticia e do mapeamento dos objetos da classe A Figura 24 demonstra que o mapeamento dos objetos no Gentle.NET é feito diretamente na classe onde, para cada coluna da tabela TbNotícia, é definido o nome do atributo, assim como suas características: se pode ser nulo ou não e se é chave estrangeira. Os códigos de uma aplicação que utiliza o Gentle pode ser feito manualmente ou através da ferramenta MyGeneration (seção 3.3.5), tal como ocorre com o NHibernate. A Figura 25 apresenta a utilização do código apresentado na Figura 24 na aplicação exemplo.

47 47 Figura 25: Exemplo de inserção de dados utilizando o Gentle.NET Conforme mostra a figura acima (Figura 25) das linhas 20 a 23 é chamado o método TbNoticiaCategoria.ListAll() cujo objetivo é de preencher um DropDownList para escolha da categoria da notícia onde a categoria é escolhida na hora de inserir ou alterar uma notícia. Na linha 32 é feita uma instância da classe TbNoticia para setar os valores do formulário que serão inseridos no banco. Para os métodos de inserção, alteração e exclusão de dados sempre é invocado o objeto Broker do Gentle.NET onde depois de invocado o objeto, basta atribuir à ação que será executada pelo mesmo, ou seja, conforme ilustra a Figura 25 para inserir uma notícia é feito o seguinte código Broker.Insert(noticia). Assim, para fazer uma alteração ou exclusão basta mudar a ação que o objeto Broker irá executar, como, por exemplo, para alterar utilize: Broker.Update(noticia); e para excluir: Broker.Remove(noticia). Para fazer uma consulta utilizando o Gentle.NET pode-se utilizar

48 48 uma SQL ou um dos métodos gerados pela MyGeneration, conforme ilustra a Figura 26, utilizando um dos métodos gerados pela MyGeneration. Figura 26: Exemplo de consulta utilizando o Gentle A figura 26 ilustra uma busca para alteração de dados, onde antes de alterar é feita uma busca do registro especifico através de um id passado como parâmetro (linha 65). Portanto, diferente dos métodos de inserção, alteração e exclusão, para fazer uma busca não é necessário utilizar o objeto Broker, mas sim chamar a classe.nome_do_metodo, como, por exemplo, TbNoticia.Retrieve(id), conforme ilustrado na Figura 26, no ponto circulado (linha 65) MyGeneration MyGeneration é uma ferramenta que auxilia na geração automática das classes de negócios e dos arquivos de mapeamento objeto/relacional. Essa ferramenta utiliza alguns frameworks como: Gentle.NET, NHibernate, entre outros; para realizar o mapeamento dos objetos ao gerar os códigos das classes de dados. A próxima seção irá abordar alguns detalhes de configuração desta ferramenta.

49 Localizando e instalando o MyGeneration MyGeneration é uma ferramenta free cuja finalidade é gerar arquivos de mapeamento e ou classes de dados para serem utilizadas em sistemas web. Essa ferramenta pode ser baixada no endereço < html?tag=list>. Para utilizar a ferramenta, basta instalá-la, executando o arquivo baixado Utilizando o MyGeneration para fazer o Mapeamento de Objetos Para fazer o mapeamento, a primeira coisa a fazer, após a instalação e inicialização do software, é escolher no Template Browser, localizado através do menu File->New, o que se deseja gerar dentre as opções que aparecem, conforme ilustra a Figura 27. Figura 27: Template Browser do MyGeneration

50 50 A Figura 27 apresenta as opções para a geração de códigos. Vale ressaltar que na lista somente aparece o Gentle.NET, sendo necessário adicionar o NHibernate. Para isto, basta clicar sobre o ícone Online Template Library localizado na barra do Template Browser (terceiro ícone da esquerda para a direita) e, na janela aberta, selecionar o NHibernate, conforme ilustra a Figura 28. Figura 28: Lista de Template Library Após ter localizado o NHibernate, conforme ilustrado acima, basta clicar no ícone parecido com um disquete, localizado na parte superior da janela do Template Library e, em seguida, fechar a janela. Após a inclusão do NHibernate na lista do Template Browser, o próximo passo será gerar os arquivos tanto para o NHibernate quanto para o Gentle.NET. Para isso, basta abrir a aba do framework correspondente, no caso, do Gentle.NET, onde aparecerá outra aba com o nome C#, que também deverá ser aberta, e depois clicar no arquivo Gentle.NET Business Entily $Rev: 942 $. Feito isso o próximo passo será clicar sobre a seta de cor verde, conforme ilustra a Figura 29.

51 51 Figura 29: Ação para gerar os códigos utilizando o Gentle.NET Após o clique sobre a seta verde, ilustrada na Figura 29, será aberta uma janela de configuração, onde se poderá definir: o nome da namespace 3 das classes, o local onde será gerado as mesmas, o que será gerado como, por exemplo, se será gerada classes abstratas entre outras, qual ao base de dados utilizada, assim como quais tabelas serão utilizadas, conforme ilustra a Figura 30. Figura 30: Tela de configuração do que será gerado 3 Namespace é um pacote ou biblioteca composto de todas as classes de uma aplicação.

52 52 Após as escolhas apresentadas na Figura 30, o próximo passo é clicar no botão OK para que os arquivos sejam gerados. Os mesmos passos são feitos para gerar os códigos utilizando o NHibernate, com a diferença na escolha no Template Browser, que não será mais Gentle.NET e sim o NHibernate.

53 53 4 RESULTADOS E DISCUSSÕES Neste trabalho foram estudadas as ferramentas MyGeneration, Gentle.NET e NHibernate para a realização de mapeamentos de objetos para banco de dados relacional. Foi desenvolvida uma aplicação de gerenciamento de notícias utilizando estas ferramentas para que, posteriormente, fosse feito um comparativo de performance entre as ferramentas de mapeamento citadas acima. Os resultados deste trabalho serão apresentados nas seções seguintes. 4.1 Utilização do MyGeneration no O/RM Primeiramente foi gerado o mapeamento para o framework NHibernate, o qual utiliza documentos XML para definir as configurações necessárias, onde, para cada atributo, é descrito o seu tipo de dados (integer, float, string, e etc), assim como suas características: se pode ser nulo, se é chave primária (auto-incremental ou não) e se é chave estrangeira. Desta forma, para todas as classes de dados do gerenciador de notícias foi gerado um arquivo XML correspondente. A Figura 31 representa um dos mapeamentos gerados pela MyGeneration, a qual corresponde a classe TbNoticia.

54 54 Figura 31: Mapeamento da classe TbNoticia para o NHibernate A figura acima (Figura 31) ilustra a representação do mapeamento da classe TbNoticia, gerada pela MyGeneration para o framework NHibernate, tendo como base a tabela TbNoticia. A estrutura do XML de mapeamento é igual para todas as outras classes

55 55 mapeadas, ou seja, um nó raiz correspondente à configuração do mapeamento que é apresentado na linha 2 e as tags property que representam as propriedades do objeto, como, por exemplo, a coluna do banco (atributo da classe), seu tipo de dado entre outras informações apresentadas entre as linhas 20 e 41. As linhas 9 e 14 contêm uma tag chamada many-to-one que significa um relacionamento de um para muitos (1-n), que a tabela TbNoticia e sua classe correspondente tem com outras classes e tabelas. As tags que definem os relacionamentos entre tabelas são: one-to-one, que significa um para um (1-1) e many-to-many, que significa muitos para muitos (n-n). Além das tags de relacionamentos, é possível trabalhar com o conceito de herança nos arquivos de mapeamento, como, por exemplo, pode-se definir que uma classe Pessoa seja a superclasse da classe Aluno, sendo que esta herda todas as características e comportamentos da classe Pessoa, conforme ilustra a Figura 32. Figura 32: Exemplo de Herança utilizando o NHibernate Para utilizar herança em um arquivo de mapeamento, basta acrescentar a tag ilustrada na linha 46, designando que uma classe herda de outra (no caso, Professor herda de Pessoa). Nas linhas 48 e 52 a tag key indica que ambas as colunas (id_pessoa e Pessoa_Pofessor_id) são chaves primárias. Os demais arquivos de mapeamento gerados pela MyGeneration, utilizando o NHibernate, podem ser vistos no Anexo I. O segundo mapeamento gerado pelo MyGeneration foi para o framework Gentle.NET, sendo que o mapeamento feito para este framework é realizado diretamente nas classes de negócios, ou seja, todo o mapeamento necessário para o NHibernate e representado em um arquivo XML, para o Gentle.NET é feito diretamente nas classes. A

56 56 Figura 33 ilustra a primeira parte do mapeamento realizado para o Gentle.NET da classe TbNoticia do sistema gerenciador de notícias. Figura 33: Mapeamento da classe TbNoticia para o Gentle.NET (Parte 1) A Figura 33 ilustra a primeira parte do mapeamento para a classe TbNoticia, que refere-se ao mapeamento da tabela TbNoticia, onde cada atributo da classe é uma coluna da tabela, sendo especificado para cada coluna da tabela o nome da coluna e seu tipo de dado, além de outras características, tais como: se pode ser nulo ou não, se é chave primária ou

57 57 estrangeira e se é auto-incrementada ou não, conforme ilustra a Figura 33 nas linhas 18, 21, 22, 25, 28, 31, 34 e 37. A segunda parte do mapeamento refere-se aos construtores da classe TbNoticia, sendo gerado pelo MyGeneration três construtores: um sem parâmetros e outros dois com parâmetros, diferenciando-se por ter um recebe que possui todos os atributos como parâmetro, incluindo o id auto-incremental da tabela TbNoticia (id_noticia), conforme ilustra a Figura 34. Figura 34: Mapeamento da classe TbNoticia para o Gentle.NET (Parte 2) A terceira parte do mapeamento da classe TbNoticia refere-se as propriedades da classe, conforme ilustra a Figura 35.

58 58 Figura 35: Mapeamento da classe TbNoticia para o Gentle.NET (Parte 3) Conforme ilustra a Figura 35, com exceção da propriedade Id_noticia, ilustrada na linha 85, todas as outras possuem os métodos Get e Set, onde o método Get retorna o valor contido na propriedade correspondente, e o Set atribui um valor ao atributo que poderá ser utilizado em uma inserção ou alteração de dados. O motivo da propriedade mostrada na linha 85 não ter um método Set deve-se por se tratar de um atributo auto-incrementado na tabela TbNoticia, não necessitando ser modificado, pois é de responsabilidade do SGBD a inserção do valor correspondente.

59 59 A quarta parte do mapeamento gerado refere-se à pesquisa de dados no banco onde são feitas basicamente duas formas de consultas, sendo que uma retorna uma lista de dados e a outra retorna um registro específico, conforme ilustra a Figura 36. Essas formas de pesquisas são padrões, ou seja, ou é retornado uma lista ou um único registro. Figura 36: Mapeamento da classe TbNoticia para o Gentle.NET (Parte 4) Conforme ilustra a Figura 36, foram gerados dois métodos de pesquisa, os quais também foram gerados para todas as demais classes do gerenciador de notícias. O objetivo da primeira pesquisa, ilustrada na linha 134, é de retornar uma lista de notícias para ser apresentada na interface para o usuário. Já na segunda pesquisa (linhas 139 e 140) o objetivo é buscar e retornar um registro específico, a partir de um parâmetro que, nesse caso, é o id da notícia, mas que poderia ser um outro parâmetro como, por exemplo, a data de vencimento da notícia. Por fim, a quinta e última parte do mapeamento da classe TbNoticia diz respeito as relações que a classe tem com outras classes, conforme ilustra a Figura 37.

60 60 Figura 37: Mapeamento da classe TbNoticia para o Gentle.NET (Parte 5) Conforme ilustra a Figura 37 a classe TbNoticia se relaciona com as classes TbNoticiaCategoria e TbPessoa. Isso quer dizer que se for preciso saber qual a categoria de uma notícia X e quem a cadastrou, basta utilizar estes métodos, como, por exemplo, para saber a categoria de uma notícia X: ((MyGentle.TbNoticia)Container.DataItem).ReferencedTbNoticiaCategoria().D escricao. Todas as demais classes ilustradas no Anexo II possuem as cinco partes de mapeamento, sendo os mesmos específicos para cada classe gerada para a aplicação. 4.2 Gerenciador de Notícias A idéia de desenvolver um gerenciador de notícias veio a partir do já existente gerenciador de notícias na Fundação Universidade do Tocantins. Com o intuito de fazer algo semelhante ao sistema existente, mas utilizando dois frameworks distintos para realizar testes de performance, o sistema de notícias é o ideal entre outras várias aplicações que poderiam ter sido feitas, pois um sistema de notícias é algo onde se tem um razoável volume de informações armazenadas e que se é constantemente atualizado, ideal para realizar os testes de performance Diagrama de banco de dados do gerenciador de notícias Para o desenvolvimento da aplicação foi criado um banco de dados com base nas necessidades da aplicação, ou seja, como o sistema é de gerenciamento de notícias foram

61 61 criadas as tabelas: TbNoticia (para armazenar as notícias), TbNoticiaCategoria (para armazenar as categorias de notícias), TbPessoa (para gerenciar os usuários da aplicação e identificar o que postou determinada notícia) e TbNoticiaAnexo (para armazenar os anexos das notícias cadastradas), conforme ilustra a Figura 38. Figura 38: Diagrama do banco do gerenciador de notícias Para a aplicação desenvolvida, os esquemas relacionais acima (Figura 38) foram suficientes para armazenar todas as informações necessárias, para atender o que se foi proposto Web config do Gerenciador de Notícias O web.config do gerenciador de notícias foi uma alternativa de configuração para acesso a base de dados do sistema, uma vez que a configuração poderia ter sido feita de maneira tradicional, ou seja, criada a classe de conexão com o banco de dados, conforme ilustrado na Figura 5 da seção A escolha pelo web.config deve-se ao fato da não preocupação com instruções SQL para a manipulação dos dados, pois os dois frameworks utilizados (NHibernate e Gentle.NET) fazem a manipulação das instruções SQL de forma

62 62 transparente, ou seja, cria e manipula as instruções SQL dinamicamente sem que seja percebido pelo usuário. Conforme ilustra a Figura 39, o web.config abaixo é configurado para utilizar o NHibernate na aplicação. Figura 39: O arquivo web.config da aplicação para utilizar o NHibernate Conforme ilustra a Figura 39, o web.config da aplicação está configurado para utilizar o NHibernate, e é composto por cinco partes: definição da sessão que será utilizada, onde, nesse caso, conforme ilustrado nas linhas 14-17, será o NHibernate quem fará a conexão com o banco de dados; definição do provider que será utilizado (linhas 22 e 23); definição do banco que contém as tabelas da aplicação (linhas 25 e 26); especificação do driver de conexão referente ao banco definido (linhas 28 e 29); e a string de conexão com o banco (linhas 31 e 32). Feita a configuração acima (Figura 39), caso seja necessário mudar de SGBD, basta modificar a linha 26, onde será especificado o novo banco para acesso, a linha 29, para especificar o novo driver de conexão referente ao novo banco e a linha 32 para especificar a nova string de conexão com a base de dados. Alterando o web.config para trabalhar com o Gentle.NET, o arquivo de configuração fica um pouco diferente, uma vez que o Gentle.NET possui uma chave de assinatura que

63 63 deve ser instalada para que a configuração funcione. A instalação dessa chave é ilustrada na seção e o arquivo de configuração web.config é ilustrado na Figura 40. Figura 40: O arquivo web.config da aplicação para utilizar o Gentle.NET Conforme mostra a figura acima (Figura 40), o arquivo de configuração para a utilização do Gentle.NET é bastante simples, sendo que as linhas 6 e 7 indicam as sessões que serão utilizadas, correspondente a uma conexão com o banco. Nas linhas é especificada a string de conexão com o banco e na linha 17 indica qual banco de dados contém as tabelas para o armazenamento das informações da aplicação. Por fim, comparando os web.config s, observa-se que a estrutura básica é a mesma, ou seja, é configurado uma sessão com o framework que será utilizado na aplicação e é definidas as propriedades para conexão como, por exemplo, qual o banco que será utilizado e a string de conexão com o mesmo Áreas de gerenciamento da aplicação O gerenciador de notícias é dividido em três áreas: notícias, anexos e categorias de notícias. Para cada área, com exceção da de anexos, é feito cadastros, alterações, pesquisas

64 64 e exclusões de dados. A área de anexos é diferente porque não existe alteração de anexo devido à ideologia adotada, onde um anexo não pode ser alterado, sendo que caso se tenha postado um anexo errado o mesmo deverá ser excluído. Dentre as três áreas será apresentada apenas uma, mas precisamente a área de notícias. As demais podem ser vistas nos anexos I e II. A aplicação, desenvolvida para trabalhar com o NHibernate, assim como o Gentle.NET, mostra que, com a utilização destes frameworks, fica mais rápido e fácil a implementação de uma aplicação, uma vez que os dois frameworks se encarregam de manipular instruções SQL s ao invés do desenvolvedor preocupar-se em realizá-las entre outras facilidades que os frameworks utilizados oferecem ao desenvolvedor Área de Notícias A área de notícias, assim como as demais áreas de gerenciamento do sistema desenvolvido, foi codificada com auxílio dos dois frameworks de mapeamento estudados, que são: Gentle.NET e NHibernate. A funcionalidade de gerenciamento de notícias utilizando o NHibernate deu origem aos códigos ilustrados na Figura 41, sendo que todas as demais áreas de gerenciamento seguem o mesmo padrão, diferenciando-se apenas pelos objetos que serão manipulados. Figura 41: Utilizando o NHibernate para salvar uma notícia

65 65 Conforme ilustra a Figura 41, para salvar uma notícia no banco, basta setar os atributos da classe TbNoticia com os valores do formulário (interface) definidos pelo usuário, e chamar o método NoticiaDAO.SalvarNoticia(noticia) (linha 41) da classe NoticiaDAO, passando o objeto noticia (linha 30). As demais atividades será desenvolvida pelo próprio NHibernate, o qual se encarregará de montar a SQL de inserção na tabela correspondente que, nesse caso, é a TbNoticia. O método ilustrado na Figura 41 é parte de um conjunto de métodos de gerenciamento dos dados da aplicação, onde são incluídos outros três métodos que são de alteração, pesquisa e exclusão de dados. A próxima figura (Figura 42) ilustra o código responsável por alterar os dados da tabela TbNoticia, utilizando ainda o NHibernate. Figura 42: Utilizando o NHibernate para alterar uma notícia A figura acima (Figura 42) é basicamente uma cópia do método apresentado na Figura 41 com uma única diferença, que é no método chamado da classe NoticiaDAO onde, nesse caso, é chamado o AtualizaNoticia(noticia) ao invés do SalvaNoticia(noticia). Da mesma forma que o método apresentado na Figura 41 e 42, o método que realiza uma exclusão seque basicamente a mesma estrutura que os outros dois métodos apresentados, ou seja, muda-se apenas o método (NoticiaDAO.ExcluirNoticia(noticia)) para realizar a tarefa desejada. Como visto nos exemplos apresentados anteriormente, para utilizar o NHibernate faz-se necessário a criação de uma classe controladora para cada classe da aplicação. No caso dos métodos exibidos nas Figuras 41 e 42, essa classe possui a terminação DAO

66 66 (NoticiaDAO) e é nela que ficam os métodos de manipulação como, inserção, alteração, pesquisa e exclusão da classe correspondente. A mesma aplicação foi desenvolvida utilizando o Gentle.NET, no qual existem grandes diferenças com relação aos arquivos de mapeamento (conforme ilustrados na seção 4.1) e nas próprias classes de negócios. Uma das principais diferenças entre as duas ferramentas de persistência analisada refere-se a forma de manipulação dos dados, sendo que o NHibernate utiliza uma classe controladora para cada classe de dados que contenha os métodos que realizarão as manipulações dos dados (sem a necessidade do desenvolvedor usar SQL). Já o Gentle.NET não precisa de uma classe controladora para manipular os dados, sendo necessário apenas importar na classe correspondente à lógica de negócio correspondente à página aspx a dll Gentle.Framework. Posteriormente, para inserir, alterar ou excluir um dado, basta chamar o objeto Broker e dizer qual a ação deverá ser executada. A Figura 43 ilustra um exemplo da utilização do objeto Broker onde o mesmo é utilizado para inserir uma notícia no banco. Figura 43: Inserindo uma notícia no banco utilizando o Gentle.NET No exemplo ilustrado na Figura 43, em específico na linha 40, nota-se que a utilização do objeto Broker é bastante simples, ou seja, basta dizer qual a ação o mesmo deverá executar e passar como parâmetro o objeto sobre o qual a ação irá ser executada. Nesse caso a ação é uma inserção (Broker.Insert(noticia)) e o objeto a ser inserido é uma notícia.

67 67 A mesma coisa pode ser feita para, por exemplo, alterar uma notícia ou excluí-la. A diferença entre a inserção, alteração e a exclusão de uma notícia correspondem à ação que o objeto Broker irá executar. No caso de uma alteração será Broker.Update(noticia) e no caso de uma exclusão será Broker.Remove(noticia). Por não necessitar desta classe controladora, o Gentle.NET, neste requisito, possui uma certa vantagem com relação ao NHibernate na manipulação dos dados. No entanto, essa foi uma das poucas vantagens descobertas que o Gentle.NET possui sobre o NHibernate, pois, ao realizar o teste de performance, o Gentle.NET foi um tanto mais lento que o NHibernate na manipulação de muitos dados. Por exemplo, na tentativa de se recuperar quarenta mil registros, o mesmo demorou um tempo considerável em relação ao NHibernate. Tal comparativo de performance é ilustrado na próxima seção. 4.3 Análise de Performance Os quesitos da análise de performance foram definidos com base na manipulação de dados como inserção, alteração, pesquisa e exclusão de dados. Dentre os quesitos mencionados foram acrescidas algumas características para o comparativo como, se a ferramenta é free, código open-source, entre outras características descritas na próxima seção Comparação entre NHibernate e Gentle.Net Conforme quesitos definidos para o comparativo, a Tabela 2 apresenta algumas características dos frameworks utilizados. Tabela 2: Comparativo das características entre os frameworks Características Gentle.NET NHibernate Licença free Sim Sim Código Open-Source Sim Sim Suporte a SQL Sim Sim Suporta relações entre objetos Sim Sim Suporte para associações muitos-muitos e muitos-um Sim Sim Suporte a associações um-um Sim Sim Suporte a Herança Sim Sim

68 68 Suporte a Associações Ternárias Não Sim Observa-se pela Tabela 2 que o framework NHibernate oferece suporte a todas as características analisadas. Porém, o Gentle.NET não oferece suporte a última característica, ou seja, ele não suporta o tratamento a associações ternárias, ou melhor, não consegue trabalhar com associações entre três entidades. A tabela de características apresentada foi o primeiro passo para a realização do comparativo. Posteriormente, foi desenvolvida uma aplicação onde fosse analisado o desempenho dos frameworks quando os mesmo fossem submetidos na manipulação de muitos dados e mais de um objeto Análise de Performance entre NHibernate e Gentle.NET Para fazer a análise de performance, após a verificação das características mencionadas na Tabela 2, foi montado um ambiente Windows em uma máquina Pentium IV com 1GB de RAM para utilizar as ferramentas Visual Studio 2005, SQL Server 2000 e MyGeneration, NHibernate e Gentle.NET para que o sistema pudesse ser desenvolvido e a análise entre as ferramentas efetuada. A análise entre as ferramentas NHibernate e Gentle.NET foi feita utilizando um arquivo chamado teste.aspx no projeto em que foi desenvolvido o gerenciado de notícias para simular um ambiente de manipulação de dados, inserindo, alterando, excluindo e pesquisando vários dados utilizando um e três objetos. No processo de inclusão de dados utilizando o NHIbernate envolveu quarenta mil registros e um objeto (TbNoticia) a aplicação demorou em média 35 segundos 407 milésimos e envolvendo três objetos (TbNoticia, TbPessoa e TbNoticiaCategoria) a aplicação demorou em média 1 minuto 42 segundos 004 milésimos. Já para a exclusão de todos os registros, a aplicação não chegou a concluir devido ao tempo de processamento das páginas da aplicação e da quantidade de registros na tabela TbNoticia. No entanto, quando ampliado o tempo de processamento da página, na exclusão de quarenta mil registros utilizando um objeto (TbNoticia) a aplicação demorou em média 39 segundos 142 milésimos. Na exclusão envolvendo três objetos (TbNoticia, TbPessoa e TbNoticiaCategoria) a aplicação demorou em média 3 minutos 036 milésimos. Nos testes de alteração, a primeira bateria de testes não obteve êxito, pois, da mesma forma que na

69 69 exclusão, após certo tempo, a aplicação gera um erro de tempo de processamento expirado, não sendo alterados os demais registros do banco. Neste caso, foram alterados apenas cento e poucos registros. Na segunda tentativa, o tempo de processamento da página foi alterado, assim como na exclusão, e o NHibernate demorou em média 1 minuto 15 segundos 108 milésimos envolvendo três objetos (TbPessoa, TbNoticiaCategoria e TbNoticia) e envolvendo um objeto (TbNoticia) demorou em média 35 segundos 383 milésimos. Já com a pesquisa dos dados, o Nhibernate portou-se bem quando pesquisou quarenta mil registros, sendo que o mesmo demorou em média 1 segundo 356 milésimos utilizando um objeto (TbNoticia) e utilizando três objetos (TbNoticia, TbPessoa e TbNoticiaCategoria) o mesmo demorou em média 3 segundos 120 milésimos. Quando foram acrescentados mais quarenta mil registros, totalizando assim oitenta mil registros, o NHibernate demorou, em média, 3 segundos 752 milésimos utilizando um objeto (TbNoticia) e utilizando três objetos (TbNoticia, TbPessoa e TbNoticiaCategoria) o mesmo demorou em média 6 segundos 825 milésimos. Esta mesma bateria de testes foi realizada com o Gentle.NET, sendo que o mesmo portou-se de maneira diferente ao NHibernate. No processo de inserção de quarenta mil registros, o mesmo demorou mais tempo que o NHibernate, em média, 58 segundos 196 milésimos utilizando um objeto (TbNoticia) e utilizando três objetos (TbNoticia, TbPessoa e TbCategoria) o mesmo demorou em média 2 minutos 02 segundos 052 milésimos. Para acrescentar mais quarenta mil registros, totalizando os oitenta mil registros, foram necessários, em média, 1 minuto 18 segundos 132 milésimos utilizando um objeto (TbNoticia) e utilizando três objetos (TbNoticia, TbPessoa e TbCategoria) o mesmo demorou em média 4 minutos 12 segundos 106 milésimos. No processo das alterações utilizando apenas um objeto (TbNoticia) o Gentle.NET demorou, em média, 53 segundos 399 milésimos e utilizando três objetos (TbNoticia, TbPessoa e TbCategoria) o mesmo demorou, em média, 1 minuto 44 segundos 041 milésimos. Já no processo de exclusão utilizando um objeto (TbNoticia), o Gentle.NET demorou, em média, 1 minuto 43 segundos 026 milésimos e utilizando três objetos (TbNoticia, TbPessoa e TbCategoria) forma necessários, em média, 4 minutos 07 segundos 005 milésimos. O processo das pesquisas de dados do Gentle.NET utilizando um objeto (TbNoticia) a aplicação demorou em média 14 segundos 032 milésimos e utilizando três objetos (TbNoticia, TbPessoa e TbCategoria) a aplicação demorou em média 27 segundos 619 milésimos.

70 70 Nos testes de performance envolvendo pesquisa de dados, os resultados foram bem diferentes entre os frameworks, uma vez que o tempo de retorno de uma consulta de quarenta mil registro teve uma diferença considerável ao usar o NHibernate e o Gentle.NET. Essa diferença chegou a dobrar quando acrescidos mais quarenta mil registros. Como consultas são a base de qualquer sistema de informação, sendo uma das operações mais realizada em uma aplicação, pode-se concluir que o NHibernate é um framework melhor que o Gentle.NET para persistir dados, pois o mesmo mostrou-se mais rápido no processo de consulta e em todos os demais (inserção, alteração e exclusão). Por ser assim, no geral, o NHibernate mostrou-se melhor que o Gentle.NET em todos os pontos do comparativo realizados nesse trabalho. A Tabela 3, ilustrada abaixo, mostra um resumo de todos os testes de performance realizados na aplicação desenvolvida (gerenciador de notícias) envolvendo um e três objetos e a manipulação de quarenta mil registros, que foram inseridos por meio de um laço de repetição no código do arquivo teste.aspx criado para realizar os testes de manipulações de vários registros do banco de dados através dos frameworks utilizados nesse trabalho. Tabela 3: Resultado do comparativo de performance entre o Gentle.NET e o NHibernate Tipo de Operação (Qtde. de Objetos envolvidos) Tempo - Gentle.NET Tempo - NHibernate Inserção (1 objeto) 58 segundos segundos 407 milésimos milésimos Alteração (1 objeto) 53 segundos segundos 383 milésimos milésimos Pesquisa (1 objeto) 14 segundos segundo 356 milésimos milésimos Exclusão (1 objeto) 1 minuto 43 segundos segundos 142 milésimos milésimos Inserção (3 objetos) 2 minutos 02 segundos 1 minuto 42 segundos 052 milésimos 004 milésimos Alteração (3objetos) 1 minuto 44 segundos minuto 15 segundos milésimos 108 milésimos Pesquisa (3 objetos) 27 segundos segundos 120 milésimos milésimos

71 71 Exclusão (3 objetos) 4 minutos 07 segundos 005 milésimos 3 minutos 036 milésimos A Tabela 3 é um resumo unificado dos resultados obtidos dos testes de performance entre as ferramentas NHibernate e Gentle.NET. Tais resultados mostra que o NHibernate é um framework muito bom para ser utilizado no desenvolvimento de sistemas, sejam eles pequenos ou grandes devido ao seu bom desempenho ao trabalhar com poucos e muitos dados bem como poucos e vários objetos. Já o Gentle.NET não saiuse muito bem, mas, não quer dizer que não deva ser utilizado. O Gentle.NET apesar de ter tido pouco desempenho, se for melhorado para que as manipulações de dados sejam feitas em um tempo similar ou melhor que do NHibernate, é melhor de ser utilizado para codificar uma aplicação devido a utilização do mesmo ter menos códigos para serem criados e ser mais fácil utilizar sua estrutura para realizar manipulações sobre os dados de uma aplicação que o NHibernate.

72 72 5 CONSIDERAÇÕES FINAIS A utilização de um framework no desenvolvimento de uma aplicação é interessante uma vez que transfere a responsabilidade por manipular instruções SQL do desenvolvedor para o framework responsável pela persistência. Outra vantagem corresponde ao gerenciamento do acesso ao banco de dados, que será feito apenas pelo framework, o qual se torna o responsável pelo acesso e manipulação dos dados. Nesse trabalho foram estudados dois frameworks, mais precisamente o NHibernate e o Gentle.NET no qual o processo de aprendizagem, por causa da pouca documentação existente, ou da documentação imprecisa, foi um pouco lenta. No caso do NHibernate, por vezes é necessário recorrer a documentação do framework Hibernate, seu precursor, para a utilização de recursos mais complexos, como, por exemplo, a utilização do HQL. Contudo, uma vez entendido o funcionamento básico de cada um dos frameworks, o desenvolvimento de uma aplicação torna-se simples e rápida de ser codificada. O gerenciador de notícias desenvolvido neste trabalho foi codificado primeiramente utilizando o NHibernate e depois utilizando o Gentle.NET. A implementação utilizando o Gentle.NET demorou menos devido ao entendimento adquirido no desenvolvimento utilizando o NHibernate e que, apesar dos frameworks trabalharem de forma diferente, as telas que tendem a monopolizar parte do tempo de desenvolvimento de um sistema já estavam prontas, sendo as mesmas somente reutilizadas. A utilização de um framework para a persistência dos dados, tais como os utilizados nesse trabalho, agrega muitos benefícios ao processo de desenvolvimento de software. Por exemplo, além da divisão de responsabilidades, o NHibernate e o Gentle.NET impedem que um usuário inclua alguma expressão que gere o que é chamado de SQL Injection, fechando uma das portas de entrada utilizadas pelos hackers para invadir sites, pois estes frameworks de persistência passam a validar toda a aplicação contra a entrada de comandos SQL maliciosos. Outro benefício refere-se à não preocupação do desenvolvedor em manipular instruções SQL de inserção, alteração, pesquisa e exclusão de

73 73 dados, pois os dois frameworks utilizados realizam essas manipulações para o desenvolvedor. Apesar do desenvolvedor não precisar preocupar-se com instruções SQL, os frameworks utilizados nesse trabalho permitem que o desenvolvedor realize, por exemplo, consultas construídas pelo desenvolvedor em forma de SQL, o que torna os frameworks em uma ferramenta flexível para manipulação de dados, deixando à escolha da forma que o mesmo irá manipular as informações do site para o próprio desenvolvedor. No caso do gerenciador de notícias desenvolvido, a manipulação dos dados foi deixado a caráter do NHibernate e do Gentle.NET. Esta aplicação, a princípio, correspondeu a um sistema para a realização de testes, cujo objetivo maior foi o de verificar o comportamento dos dois frameworks utilizados, levando-se em conta a facilidade de codificação de cada um e como o NHibernate e o Gentle.NET se comportariam trabalhando com muitos dados. Para tanto, foi montado um comparativo de performance onde foram avaliadas algumas características sobre as duas ferramentas utilizadas, nas quais as mesmas apresentaram características praticamente iguais, onde as principais diferenças obtidas foram nos testes de inserção, alteração, pesquisa e exclusão de dados. No caso da inserção, foi analisada a performance ao se tentar inserir quarenta mil registros. Para as demais operações, como: alteração, exclusão e pesquisa; foram utilizados todos os dados contidos no banco, dados esses que chegaram até duzentos mil registros, sendo os mesmos inseridos de quarenta em quarenta mil. Nos testes de alteração e exclusão nenhuma das duas ferramentas conseguiu alterar ou excluir todos os registros, pois quando atingido certo limite de tempo, a aplicação gera erro informando que o tempo limite esgotou e, ao ser verificado no banco, observou-se que alguns registros haviam sido alterados, e, no caso da exclusão, removidos. Para solucionar o problema do tempo de processamento da página, foi acrescido um tempo maior de processamento para que os testes de alteração e exclusão pudessem ocorrer. Já a consulta de dados, desde o início com quarenta mil registro, o NHibernate mostrou-se melhor que o Gentle.NET demorando bem menos tempo para retornar os dados. Por ser assim, no geral, tanto o NHIbernate, como o Gentle.NET ainda precisam ser melhorados em alguns quesitos. Por exemplo, no caso do Gentle.NET é necessário otimizar as consultas que o mesmo faz para que sejam executadas e tenham um tempo de retorno menor do que o apresentado nos testes realizados. No caso do NHibernate é necessário tentar trabalhar com o mapeamento dos objetos diretamente

74 74 nas classes, tal como utilizado no Gentle.NET, pois, assim, não seria necessário utilizar um arquivo a parte que verifica-se a consistência no sentido de modificação do tipo de dado ou nome entre os atributos das classes com os valores das colunas das tabelas do banco. Por fim, como trabalhos futuros a meta é desenvolver um novo framework baseado nos que foram estudados, realizando melhorias nas partes mais falhas do NHibernate e do Gentle.NET, além de serem realizados testes comparativos para averiguar se o novo framework oferecerá melhores resultados do que os apresentados pelas ferramentas analisadas. Outra meta é desenvolver um sistema maior utilizando as ferramentas estudadas e a nova ferramenta que será desenvolvida, e, colocá-lo em produção com vários usuários acessando para realizar testes mais reais como, por exemplo, de performance em relação a controle de concorrência entre os quesitos comparados nesse trabalho.

75 75 6 REFERÊNCIAS BIBLIOGRÁFICAS (AÉCE, 2004) AÉCE, Israel..NET: Guia Inicial do NHibernate. 14 de Dezembro de Disponível em: < >. Acessado em: 21 de Abril de (BASSI, 2006) BASSI, André Luiz. Criando uma conexão usando provider. 3 de Maio de Disponível em: < Acessado em: 03 de Maio de (DIAS, 2005) DIAS, André. Persistência de Dados com o NHibernate Parte I. 10 de Abril de Disponível em: < Acessado em: 04 de Abril de (GENTLE.NET, 2006) Gentle.NET Object Persistence Framework. 04 de Março de Disponível em: < Acessado em: 25 de Março de (HQL, 2006) Hibernate Query Linguage. 25 de Fevereiro de Disponível em: < Acessado em 25 de Fevereiro de (JÚNIOR, 2006) JÚNIOR, Herval Freire de A. Mapeando Objetos para Banco de Dados Relacionais: técnicas e implementações. Semestre de Disponível em: < Acessado em: 07 de Março de (MACORATTI, 2004) MACORATTI, José Carlos. Previna-se contra a Injeção SQL. 14 de Outubro de Disponível em: < Acessado em: 04 de Maio de 2006.

76 76 (MERTNER, 2006) Getting Started. 04 de Março de Disponível em: < Acessado em: 25 de Março de (MENDES, 2006) MENDES, Fernando Vasconcelos. Conheça o XPrevail. 14 de Abril de Disponível em: < aspx>. Acessado em: 22 de Abril de (MICROSOFT, 2006) SQL Server Copyright Disponível em: < Acessado em 16 de Junho de (MSDN, 2004) Visual Studio Developer Center. Copyright Disponível em: < Acessado em 16 de Junho de (MYGENERATION, ) MyGeneration - Code Generation, O/R Mapping, and Architectures. Copyright Disponível em: < Acessado em: 06 de Fevereiro de (NHIBERNATE, 2006) NHibernate for.net. 15 de Janeiro de Disponível em: < Acessado em 15 de Fevereiro de (QUICOLI, 2006) QUICOLI, Paulo Roberto. Mapeamento Objeto-Relacional. 13 de Fevereiro de Disponível em: < Acessado em: 22 de Abril de (RADSOFTWARE, 2004) NextGeneration -.NET Code Generator. Copyright Disponível em: < Acessado em: 22 de Março de (ROSEINDIA, 2006) Roseindia. Hibernate Query Language. Sem data de publicação. Disponível em: < >. Acessado em: 15 de Maio de (SANTOS, MACEDO, CITRANGULO & VISCONTI, 2003) SANTOS, Carlos Alberto Lins Gonçalves dos; MACEDO, Luiz Eduardo de Franco; CITRANGULO, Marcelo

77 77 Rosin; VISCONTI, Marco Aurélio Giovani. Prevalência Persistência Transparente de Objetos em Memória. Semestre de Disponível em: < Acessado em: 22 de Abril de (YESSOFTWARE, ) CodeCharge Studio 3.0 Download Information. Copyright Disponível em: < Acessado em: 06 de Fevereiro de 2006.

78 78 ANEXO I Arquivos de Mapeamento utilizando o NHibernate Arquivo de Mapeamento TbNoticiaAnexo <?xml version="1.0" encoding="utf-8"?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.0"> <class name="mapeamentoor.tbnoticiaanexo,mapeamentoor" table="tbnoticiaanexo"> <id name="idnoticiaanexo" column="id_noticia_anexo" type="int32" unsaved-value="0"> <generator class="native"/> </id> <many-to-one name="idnoticia" column="id_noticia" class="mapeamentoor.tbnoticia,mapeamentoor" /> /> <property column="anexo" type="string" name="anexo" length="50" /> <property column="descricao_anexo" type="string" name="descricaoanexo" length="100" </class> </hibernate-mapping> Arquivo de Mapeamento TbNoticiaCategoria <?xml version="1.0" encoding="utf-8"?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.0"> <class name="mapeamentoor.tbnoticiacategoria,mapeamentoor" table="tbnoticiacategoria"> <id name="idnoticiacategoria" column="id_noticia_categoria" type="int32" unsaved-value="0"> <generator class="native"/> </id> <property column="descricao" type="string" name="descricao" not-null="true" length="50" /> </class> </hibernate-mapping>

79 79 Arquivo de Mapeamento TbPessoa <?xml version="1.0" encoding="utf-8"?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.0"> <class name="mapeamentoor.tbpessoa,mapeamentoor" table="tbpessoa"> <id name="idpessoa" column="id_pessoa" type="int32" unsaved-value="0"> <generator class="native"/> </id> <property column="nome" type="string" name="nome" not-null="true" length="50" /> <property column="sexo" type="string" name="sexo" not-null="true" length="50" /> <property column="data_nascimento" type="datetime" name="datanascimento" /> <property column="cpf" type="string" name="cpf" length="15" /> <property column="rg" type="string" name="rg" length="30" /> <property column="endereco" type="string" name="endereco" length="70" /> <property column="bairro" type="string" name="bairro" length="50" /> <property column="cidade" type="string" name="cidade" length="50" /> <property column="uf" type="string" name="uf" length="2" /> <property column="login" type="string" name="login" not-null="true" length="20" /> <property column="senha" type="string" name="senha" not-null="true" length="50" /> </class> </hibernate-mapping>

80 80 Classes do gerenciador de notícias utilizando o NHibernate //Classe TbNoticia using System; namespace MapeamentoOR [Serializable] public sealed class TbNoticia private int _id_noticia; private TbNoticiaCategoria _id_noticia_categoria; private TbPessoa _id_pessoa; private string _titulo; private string _texto; private DateTime _data_cadastro; private DateTime _data_vencimento; public TbNoticia() _id_noticia = 0; _id_noticia_categoria = null; _id_pessoa = null; _titulo = null; _texto = null; _data_cadastro = DateTime.MinValue; _data_vencimento = DateTime.MinValue; public int IdNoticia get return _id_noticia; set _id_noticia = value; public TbNoticiaCategoria IdNoticiaCategoria get return _id_noticia_categoria; set _id_noticia_categoria = value; public TbPessoa IdPessoa get return _id_pessoa; set _id_pessoa = value; public string Titulo get return _titulo; set _titulo = value; public string Texto get return _texto; set _texto = value; public DateTime DataCadastro get return _data_cadastro; set _data_cadastro = value; public DateTime DataVencimento get return _data_vencimento; set _data_vencimento = value;

81 81 //Classe TbNoticiaAnexo using System; namespace MapeamentoOR [Serializable] public sealed class TbNoticiaAnexo private int _id_noticia_anexo; private TbNoticia _id_noticia; private string _anexo; private string _descricao_anexo; public TbNoticiaAnexo() _id_noticia_anexo = 0; _id_noticia = null; _anexo = null; _descricao_anexo = null; public int IdNoticiaAnexo get return _id_noticia_anexo; set _id_noticia_anexo = value; public TbNoticia IdNoticia get return _id_noticia; set _id_noticia = value; public string Anexo get return _anexo; set _anexo = value; public string DescricaoAnexo get return _descricao_anexo; set _descricao_anexo = value;

82 82 //Classe TbNoticiaCategoria using System; namespace MapeamentoOR [Serializable] public sealed class TbNoticiaCategoria private int _id_noticia_categoria; private string _descricao; public TbNoticiaCategoria() _id_noticia_categoria = 0; _descricao = null; public int IdNoticiaCategoria get return _id_noticia_categoria; set _id_noticia_categoria = value; public string Descricao get return _descricao; set _descricao = value;

83 83 //Classe TbPessoa using System; namespace MapeamentoOR [Serializable] public sealed class TbPessoa private int _id_pessoa; private string _nome; private string _sexo; private DateTime _data_nascimento; private string _cpf; private string _rg; private string _endereco; private string _bairro; private string _cidade; private string _uf; private string _login; private string _senha; public TbPessoa() _id_pessoa = 0; _nome = null; _sexo = null; _data_nascimento = DateTime.MinValue; _cpf = null; _rg = null; _endereco = null; _bairro = null; _cidade = null; _uf = null; _login = null; _senha = null; public int IdPessoa get return _id_pessoa; set _id_pessoa = value; public string Nome get return _nome; set _nome = value; public string Sexo get return _sexo; set _sexo = value; public DateTime DataNascimento get return _data_nascimento; set _data_nascimento = value; public string Cpf get return _cpf; set _cpf = value;

84 84 //Classe TbPessoa (Continuação) public string Rg get return _rg; set _rg = value; public string Endereco get return _endereco; set _endereco = value; public string Bairro get return _bairro; set _bairro = value; public string Cidade get return _cidade; set _cidade = value; public string Uf get return _uf; set _uf = value;

85 85 Classes controladoras (NhibernateHelper, NoticiaDAO, PessoaDAO, NoticiaCategoriaDAO e NoticiaAnexoDAO) do gerenciador de notícias // classe responsável por abrir uma conexão com o banco de dados public class NHibernateHelper private static ISessionFactory _sessionfactory; public static ISession GetSession() if (_sessionfactory == null) lock (typeof(nhibernatehelper)) if (_sessionfactory == null) Configuration cfg = new Configuration(); cfg.addassembly("mapeamentoor"); _sessionfactory = cfg.buildsessionfactory(); return _sessionfactory.opensession(); private NHibernateHelper() // Classe controladora de notícias public class NoticiaDAO public NoticiaDAO() public static IList RetornaNoticias(string column, int maximumrows, int startrowindex) ISession session = NHibernateHelper.GetSession(); string sql = "FROM TbNoticia AS noticia "+ "WHERE data_vencimento >= '"+DateTime.Now.ToString("MM/dd/yyyy")+"'"; // Sorting if (!String.IsNullOrEmpty(column)) sql += " ORDER BY noticia." + column; IQuery query = session.createquery(sql); // Paging query.setfirstresult(startrowindex); query.setmaxresults(maximumrows); return query.list();

86 86 // Continuação do código da classe controladora de notícias public static IList RetornaNoticias() ISession session = NHibernateHelper.GetSession(); string sql = "FROM TbNoticia AS noticia "; IQuery query = session.createquery(sql); return query.list(); public static void SalvaNoticia(TbNoticia noticia) ISession session = NHibernateHelper.GetSession(); session.save(noticia); session.flush(); session.close(); public static TbNoticia RetornaNoticia(int id) ISession session = NHibernateHelper.GetSession(); return (TbNoticia)session.Get(typeof(TbNoticia), id); public static void ExcluiNoticia(TbNoticia noticia) ISession session = NHibernateHelper.GetSession(); session.delete(noticia); session.flush(); session.close(); public static void AtualizaNoticia(TbNoticia noticia) ISession session = NHibernateHelper.GetSession(); session.update(noticia); session.flush(); session.close();

87 // Classe controladora de Pessoa public class PessoaDAO public PessoaDAO() public static IList RetornaPessoas(string column, int maximumrows, int startrowindex) ISession session = NHibernateHelper.GetSession(); string sql = "FROM TbPessoa AS pessoa"; // Sorting if (!String.IsNullOrEmpty(column)) sql += " ORDER BY pessoa." + column; IQuery query = session.createquery(sql); // Paging query.setfirstresult(startrowindex); query.setmaxresults(maximumrows); return query.list(); public static IList RetornaPessoas() ISession session = NHibernateHelper.GetSession(); string sql = "FROM TbPessoa AS pessoa"; IQuery query = session.createquery(sql); return query.list(); public static void SalvaPessoa(TbPessoa pessoa) ISession session = NHibernateHelper.GetSession(); session.save(pessoa); session.flush(); session.close(); public static TbPessoa RetornaPessoa(int id) ISession session = NHibernateHelper.GetSession(); return (TbPessoa)session.Get(typeof(TbPessoa), id); public static void ExcluiPessoa(TbPessoa pessoa) ISession session = NHibernateHelper.GetSession(); session.delete(pessoa); session.flush(); session.close(); public static void AtualizaPessoa(TbPessoa pessoa) ISession session = NHibernateHelper.GetSession(); session.update(pessoa); session.flush(); session.close(); 87

88 88 // Classe controladora de Categorias de Notícias public class NoticiaCategoriaDAO public NoticiaCategoriaDAO() public static IList RetornaNoticiaCategorias(string column, int maximumrows, int startrowindex) ISession session = NHibernateHelper.GetSession(); string sql = "FROM TbNoticiaCategoria AS noticia"; // Sorting if (!String.IsNullOrEmpty(column)) sql += " ORDER BY noticia." + column; IQuery query = session.createquery(sql); // Paging query.setfirstresult(startrowindex); query.setmaxresults(maximumrows); return query.list(); public static IList RetornaNoticiaCategorias() ISession session = NHibernateHelper.GetSession(); string sql = "FROM TbNoticiaCategoria AS noticia"; IQuery query = session.createquery(sql); return query.list(); public static void SalvaNoticiaCategoria(TbNoticiaCategoria noticia_categoria) ISession session = NHibernateHelper.GetSession(); session.save(noticia_categoria); session.flush(); session.close(); public static TbNoticiaCategoria RetornaNoticiaCategoria(int id) ISession session = NHibernateHelper.GetSession(); return (TbNoticiaCategoria)session.Get(typeof(TbNoticiaCategoria), id); public static void ExcluiNoticiaCategoria(TbNoticiaCategoria noticia_categoria) ISession session = NHibernateHelper.GetSession(); session.delete(noticia_categoria); session.flush(); session.close(); public static void AtualizaNoticiaCategoria(TbNoticiaCategoria noticia_categoria) ISession session = NHibernateHelper.GetSession(); session.update(noticia_categoria); session.flush(); session.close();

89 89 // Classe controladora de Anexos de Notícias public class NoticiaAnexoDAO public NoticiaAnexoDAO() public static IList RetornaNoticiaAnexos(string column,int maximumrows, int startrowindex) ISession session = NHibernateHelper.GetSession(); string sql = "FROM TbNoticiaAnexo AS noticiaanexo"; // Sorting if (!String.IsNullOrEmpty(column)) sql += " ORDER BY noticiaanexo." + column; IQuery query = session.createquery(sql); // Paging query.setfirstresult(startrowindex); query.setmaxresults(maximumrows); return query.list(); public static IList RetornaNoticiaAnexos() ISession session = NHibernateHelper.GetSession(); string sql = "FROM TbNoticiaAnexo AS noticiaaenxo"; IQuery query = session.createquery(sql); return query.list(); public static void SalvaNoticiaAnexo(TbNoticiaAnexo noticia) ISession session = NHibernateHelper.GetSession(); session.save(noticia); session.flush(); session.close(); public static TbNoticiaAnexo RetornaNoticiaAnexo(int id) ISession session = NHibernateHelper.GetSession(); return (TbNoticiaAnexo)session.Get(typeof(TbNoticiaAnexo), id); public static void ExcluiNoticiaAnexo(TbNoticiaAnexo noticia) ISession session = NHibernateHelper.GetSession(); session.delete(noticia); session.flush(); session.close(); public static void AtualizaNoticiaAnexo(TbNoticiaAnexo noticia) ISession session = NHibernateHelper.GetSession(); session.update(noticia); session.flush(); session.close();

90 90 Arquivo teste.aspx utilizado para a realização do teste de performance do Nhibernate public partial class teste : System.Web.UI.Page protected void Page_Load(object sender, EventArgs e) //Insere quarenta mil registros no banco utilizando três objetos tbpessoa pessoa2 = new tbpessoa(); pessoa2.idpessoa = 14; tbnoticiacategoria tbcategoria2 = new tbnoticiacategoria(); tbcategoria2.idnoticiacategoria = 80015; system.web.httpcontext.current.response.write("inicio: " + datetime.now.tostring("hh:mm:ss:fff")); for (int i = 0; i < 40000; i++) //pessoa tbpessoa pessoa = new tbpessoa(); pessoa.nome = "maria"; pessoa.sexo = "Feminino"; pessoa.login = "maria"; pessoa.senha = "123"; pessoadao.salvapessoa(pessoa); //categoria de notícia tbnoticiacategoria tbcategoria = new tbnoticiacategoria(); tbcategoria.descricao = "tcc " + i; noticiacategoriadao.salvanoticiacategoria(tbcategoria); //notícia tbnoticia noticia = new tbnoticia(); noticia.idnoticiacategoria = tbcategoria2; noticia.idpessoa = pessoa2; noticia.titulo = "blabla " + i; noticia.texto = "texto " + i; noticia.datacadastro = convert.todatetime(datetime.now.tostring("dd/mm/yyyy")); noticia.datavencimento = convert.todatetime(datetime.now.tostring("dd/mm/yyyy")); noticiadao.salvanoticia(noticia); system.web.httpcontext.current.response.write("<br />fim: " + datetime.now.tostring("hh:mm:ss:fff"));

91 91 //Continuação do Código da página anterior //Insere quarenta mil registros no banco utilizando 1 objeto System.Web.HttpContext.Current.Response.Write("inicio: " + DateTime.Now.ToString("HH:mm:ss:fff")); TbPessoa pessoa = new TbPessoa(); pessoa.idpessoa = 9; TbNoticiaCategoria tbcategoria = new TbNoticiaCategoria(); tbcategoria.idnoticiacategoria = 6; for (int i = 0; i < 40000; i++) TbNoticia noticia = new TbNoticia(); noticia.idnoticiacategoria = tbcategoria; noticia.idpessoa = pessoa; noticia.titulo = "blabla " + i; noticia.texto = "texto " + i; noticia.datacadastro = Convert.ToDateTime(DateTime.Now.ToString("dd/MM/yyyy")); noticia.datavencimento = Convert.ToDateTime(DateTime.Now.ToString("dd/MM/yyyy")); NoticiaDAO.SalvaNoticia(noticia); System.Web.HttpContext.Current.Response.Write("<br />Fim: " + DateTime.Now.ToString("HH:mm:ss:fff")); //Continuação do Código da página anterior //Exclui todas as notícias do banco utilizando um objeto System.Web.HttpContext.Current.Response.Write("inicio: " + DateTime.Now.ToString("HH:mm:ss:fff")); IList ilist2 = NoticiaDAO.RetornaNoticias(); foreach (TbNoticia noticia in ilist2) NoticiaDAO.ExcluiNoticia(noticia); System.Web.HttpContext.Current.Response.Write("<br />Fim: " + DateTime.Now.ToString("HH:mm:ss:fff"));

92 92 //Continuação do Código da página anterior //Exclui todas as notícias, pessoas e categorias System.Web.HttpContext.Current.Response.Write("inicio: " + DateTime.Now.ToString("HH:mm:ss:fff")); IList ilist2 = NoticiaDAO.RetornaNoticias(); foreach (TbNoticia noticia in ilist2) NoticiaDAO.ExcluiNoticia(noticia); IList ilist3 = PessoaDAO.RetornaPessoas(); foreach (TbPessoa pessoa in ilist3) PessoaDAO.ExcluiPessoa(pessoa); IList ilist4 = NoticiaCategoriaDAO.RetornaNoticiaCategorias(); foreach (TbNoticiaCategoria nt in ilist4) NoticiaCategoriaDAO.ExcluiNoticiaCategoria(nt); System.Web.HttpContext.Current.Response.Write("<br />Fim: " + DateTime.Now.ToString("HH:mm:ss:fff")); //Altera todas as notícias do banco utilizando três objeto System.Web.HttpContext.Current.Response.Write("inicio: " + DateTime.Now.ToString("HH:mm:ss:fff")); IList ilist3 = NoticiaDAO.RetornaNoticias(); int i = 0; foreach (TbNoticia noticia4 in ilist3) noticia4.titulo = "Festa " + i; noticia4.texto = "Hoje é Festa " + i; TbPessoa pessoa = PessoaDAO.RetornaPessoa(((TbPessoa)noticia4.IdPessoa).IdPessoa); pessoa.nome = "Yzaac G. da Silva"; PessoaDAO.AtualizaPessoa(pessoa); TbNoticiaCategoria tbcategoria = NoticiaCategoriaDAO.RetornaNoticiaCategoria(((TbNoticiaCategoria)noticia4.IdNoticiaCategori a).idnoticiacategoria); tbcategoria.descricao = "Pastoral"; NoticiaCategoriaDAO.AtualizaNoticiaCategoria(tbcategoria); NoticiaDAO.AtualizaNoticia(noticia4); i++; System.Web.HttpContext.Current.Response.Write("<br />Fim: " + DateTime.Now.ToString("HH:mm:ss:fff"));

93 93 //Continuação do Código da página anterior //Altera todas as notícias do banco (um objeto) System.Web.HttpContext.Current.Response.Write("inicio: " + DateTime.Now.ToString("HH:mm:ss:fff")); IList ilist3 = NoticiaDAO.RetornaNoticias(); int i = 0; foreach (TbNoticia noticia4 in ilist3) noticia4.texto = "TCC " + i; NoticiaDAO.AtualizaNoticia(noticia4); i++; System.Web.HttpContext.Current.Response.Write("<br />Fim: " + DateTime.Now.ToString("HH:mm:ss:fff")); // //Pesquisa todas as notícias do banco System.Web.HttpContext.Current.Response.Write("inicio: " + DateTime.Now.ToString("HH:mm:ss:fff")); IList ilist = NoticiaDAO.RetornaNoticias(); System.Web.HttpContext.Current.Response.Write("<br />Fim: " + DateTime.Now.ToString("HH:mm:ss:fff")); // //Pesquisa todas as notícias, pessoas e categorias System.Web.HttpContext.Current.Response.Write("inicio: " + DateTime.Now.ToString("HH:mm:ss:fff")); IList ilist = NoticiaDAO.RetornaNoticias(); IList ilist2 = PessoaDAO.RetornaPessoas(); IList ilist3 = NoticiaCategoriaDAO.RetornaNoticiaCategorias(); System.Web.HttpContext.Current.Response.Write("<br />Fim: " + DateTime.Now.ToString("HH:mm:ss:fff"));

94 94 ANEXO II Arquivos de Mapeamento e classes utilizando o Gentle.NET Arquivo de Mapeamento e classe TbNoticiaAnexo namespace MyGentle [TableName("TbNoticiaAnexo", CacheStrategy.Temporary)] public class TbNoticiaAnexo : Persistent #region Membros (mapeamento e atributos) [TableColumn("id_noticia_anexo", NotNull=true), PrimaryKey(AutoGenerated=true)] protected int id_noticia_anexo; [TableColumn("id_noticia", NotNull = true), ForeignKey("TbNoticia", "id_noticia")] protected int id_noticia; [TableColumn("anexo", NullValue="")] protected string anexo; [TableColumn("descricao_anexo", NullValue="")] protected string descricao_anexo; #endregion #region Contrutores public TbNoticiaAnexo() public TbNoticiaAnexo(int id_noticia) id_noticia_anexo = 0; this.id_noticia = id_noticia; public TbNoticiaAnexo(int id_noticia, string anexo, string descricao_anexo) this.id_noticia = id_noticia; this.anexo = anexo; this.descricao_anexo = descricao_anexo; public TbNoticiaAnexo(int id_noticia_anexo, int id_noticia, string anexo, string descricao_anexo) this.id_noticia_anexo = id_noticia_anexo; this.id_noticia = id_noticia; this.anexo = anexo; this.descricao_anexo = descricao_anexo; #endregion

95 95 Arquivo de Mapeamento e classe TbNoticiaAnexo (Continuação do código anterior) #region Propriedades public int Id_noticia_anexo get return id_noticia_anexo; public int Id_noticia get return id_noticia; set id_noticia = value; public string Anexo get return anexo; set anexo = value; public string Descricao_anexo get return descricao_anexo; set descricao_anexo = value; #endregion #region Métodos de Busca static public IList ListAll() return Broker.RetrieveList(typeof(TbNoticiaAnexo)); public static TbNoticiaAnexo Retrieve(int id) Key key = new Key(typeof(TbNoticiaAnexo), true, "id_noticia_anexo", id); return Broker.RetrieveInstance(typeof(TbNoticiaAnexo), key) as TbNoticiaAnexo; #endregion #region Relacionamentos public TbNoticia ReferencedTbNoticia() return TbNoticia.Retrieve(Id_noticia); #endregion

96 96 Arquivo de Mapeamento e classe TbNoticiaCategoria namespace MyGentle [TableName("TbNoticiaCategoria", CacheStrategy.Temporary)] public class TbNoticiaCategoria : Persistent #region Membros (mapeamento e atributos) [TableColumn("id_noticia_categoria", NotNull=true), PrimaryKey(AutoGenerated=true)] protected int id_noticia_categoria; [TableColumn("descricao", NotNull=true)] protected string descricao; #endregion #region Construtores public TbNoticiaCategoria() public TbNoticiaCategoria(string descricao) this.descricao = descricao; public TbNoticiaCategoria(int id_noticia_categoria, string descricao) this.id_noticia_categoria = id_noticia_categoria; this.descricao = descricao; #endregion #region Public Propriedades public int Id_noticia_categoria get return id_noticia_categoria; public string Descricao get return descricao; set descricao = value; #endregion #region Métodos de Busca static public IList ListAll() return Broker.RetrieveList(typeof(TbNoticiaCategoria)); public static TbNoticiaCategoria Retrieve(int id) Key key = new Key(typeof(TbNoticiaCategoria), true, "id_noticia_categoria", id); return Broker.RetrieveInstance(typeof(TbNoticiaCategoria), key) as TbNoticiaCategoria; #endregion

97 97 Arquivo de Mapeamento e classe TbNoticiaCategoria (Continuação do código anterior) #region Relacionamentos public IList ReferringTbNoticia() //select * from 'foreigntable' SqlBuilder sb = new SqlBuilder(StatementType.Select, typeof(tbnoticia)); id_noticia_categoria); primary key statement // where foreigntable.foreignkey = ourprimarykey sb.addconstraint(operator.equals, "id_noticia_categoria", // passing true indicates that we'd like a list of elements, i.e. that no // constraints from the type being retrieved should be added to the SqlStatement stmt = sb.getstatement(true); // execute the statement/query and create a collection of User instances from the result set return ObjectFactory.GetCollection(typeof(TbNoticia), stmt.execute()); #endregion Arquivo de Mapeamento e classe TbNoticia namespace MyGentle [TableName("TbNoticia", CacheStrategy.Temporary)] public class TbNoticia : Persistent #region Membros (mapeamento e atributos) [TableColumn("id_noticia", NotNull=true), PrimaryKey(AutoGenerated=true)] protected int id_noticia; [TableColumn("id_noticia_categoria", NotNull = true), ForeignKey("TbNoticiaCategoria", "id_noticia_categoria")] protected int id_noticia_categoria; [TableColumn("id_pessoa", NotNull = true), ForeignKey("TbPessoa", "id_pessoa")] protected int id_pessoa; [TableColumn("titulo", NotNull=true)] protected string titulo; [TableColumn("texto", NotNull=true)] protected string texto; [TableColumn("data_cadastro", NotNull=true)] protected DateTime data_cadastro; [TableColumn("data_vencimento", NotNull=true)] protected DateTime data_vencimento; #endregion

98 98 Arquivo de Mapeamento e classe TbNoticia (Continuação do código anterior) #region Construtores public TbNoticia() public TbNoticia(int id_noticia_categoria, int id_pessoa, string titulo, string texto, DateTime data_cadastro, DateTime data_vencimento) this.id_noticia_categoria = id_noticia_categoria; this.id_pessoa = id_pessoa; this.titulo = titulo; this.texto = texto; this.data_cadastro = data_cadastro; this.data_vencimento = data_vencimento; public TbNoticia(int id_noticia, int id_noticia_categoria, int id_pessoa, string titulo, string texto, DateTime data_cadastro, DateTime data_vencimento) this.id_noticia = id_noticia; this.id_noticia_categoria = id_noticia_categoria; this.id_pessoa = id_pessoa; this.titulo = titulo; this.texto = texto; this.data_cadastro = data_cadastro; this.data_vencimento = data_vencimento; #endregion #region Public Propriedades public int Id_noticia get return id_noticia; public int Id_noticia_categoria get return id_noticia_categoria; set id_noticia_categoria = value; public int Id_pessoa get return id_pessoa; set id_pessoa = value; public string Titulo get return titulo; set titulo = value; public string Texto get return texto; set texto = value;

99 99 Arquivo de Mapeamento e classe TbNoticia (Continuação do código anterior) public DateTime Data_cadastro get return data_cadastro; set data_cadastro = value; public DateTime Data_vencimento get return data_vencimento; set data_vencimento = value; #endregion #region Métodos de Busca static public IList ListAll() return Broker.RetrieveList(typeof(TbNoticia)); public static TbNoticia Retrieve(int id) Key key = new Key(typeof(TbNoticia), true, "id_noticia", id); return Broker.RetrieveInstance(typeof(TbNoticia), key) as TbNoticia; #endregion #region Relacionamentos public IList ReferringTbNoticiaAnexo() //select * from 'foreigntable' SqlBuilder sb = new SqlBuilder(StatementType.Select, typeof(tbnoticiaanexo)); // where foreigntable.foreignkey = ourprimarykey sb.addconstraint(operator.equals, "id_noticia", id_noticia); // passing true indicates that we'd like a list of elements, i.e. that no primary key // constraints from the type being retrieved should be added to the statement SqlStatement stmt = sb.getstatement(true); // execute the statement/query and create a collection of User instances from the result set return ObjectFactory.GetCollection(typeof(TbNoticiaAnexo), stmt.execute()); // TODO In the end, a GentleList should be returned instead of an arraylist //return new GentleList( typeof(tbnoticiaanexo), this ); public TbNoticiaCategoria ReferencedTbNoticiaCategoria() return TbNoticiaCategoria.Retrieve(Id_noticia_categoria); public TbPessoa ReferencedTbPessoa() return TbPessoa.Retrieve(Id_pessoa); #endregion

100 100 Arquivo de Mapeamento e classe TbPessoa namespace MyGentle [TableName("TbPessoa", CacheStrategy.Temporary)] public class TbPessoa : Persistent #region Membros (mapeamento e atributos) [TableColumn("id_pessoa", NotNull=true), PrimaryKey(AutoGenerated=true)] protected int id_pessoa; [TableColumn("nome", NotNull=true)] protected string nome; [TableColumn("sexo", NotNull=true)] protected string sexo; [TableColumn("data_nascimento")] protected DateTime data_nascimento; [TableColumn("cpf", NullValue="")] protected string cpf; [TableColumn("rg", NullValue="")] protected string rg; [TableColumn("endereco", NullValue="")] protected string endereco; [TableColumn("bairro", NullValue="")] protected string bairro; [TableColumn("cidade", NullValue="")] protected string cidade; [TableColumn("uf", NullValue="")] protected string uf; [TableColumn("login", NotNull=true)] protected string login; [TableColumn("senha", NotNull=true)] protected string senha; #endregion #region Construtores public TbPessoa() public TbPessoa(string nome, string sexo, string login, string senha) id_pessoa = 0; this.nome = nome; this.sexo = sexo; this.login = login; this.senha = senha;

101 101 Arquivo de Mapeamento e classe TbPessoa (Continuação do código anterior) public TbPessoa(int id_pessoa, string nome, string sexo, DateTime data_nascimento, string cpf, string rg, string endereco, string bairro, string cidade, string uf, string login, string senha) this.id_pessoa = id_pessoa; this.nome = nome; this.sexo = sexo; this.data_nascimento = data_nascimento; this.cpf = cpf; this.rg = rg; this.endereco = endereco; this.bairro = bairro; this.cidade = cidade; this.uf = uf; this.login = login; this.senha = senha; #endregion #region Propriedades public int Id_pessoa get return id_pessoa; public string Nome get return nome; set nome = value; public string Sexo get return sexo; set sexo = value; public DateTime Data_nascimento get return data_nascimento; set data_nascimento = value; public string Cpf get return cpf; set cpf = value; public string Rg get return rg; set rg = value; public string Endereco get return endereco; set endereco = value;

102 102 Arquivo de Mapeamento e classe TbPessoa (Continuação do código anterior) public string Bairro get return bairro; set bairro = value; public string Cidade get return cidade; set cidade = value; public string Uf get return uf; set uf = value; public string Login get return login; set login = value; public string Senha get return senha; set senha = value; #endregion #region Métodos de Busca static public IList ListAll() return Broker.RetrieveList(typeof(TbPessoa)); public static TbPessoa Retrieve(int id) Key key = new Key(typeof(TbPessoa), true, "id_pessoa", id); return Broker.RetrieveInstance(typeof(TbPessoa), key) as TbPessoa; #endregion #region Relacionamentos public IList ReferringTbNoticia() //select * from 'foreigntable' SqlBuilder sb = new SqlBuilder(StatementType.Select, typeof(tbnoticia)); // where foreigntable.foreignkey = ourprimarykey sb.addconstraint(operator.equals, "id_pessoa", id_pessoa); // passing true indicates that we'd like a list of elements, i.e. that no primary key // constraints from the type being retrieved should be added to the statement SqlStatement stmt = sb.getstatement(true); // execute the statement/query and create a collection of User instances from the result set return ObjectFactory.GetCollection(typeof(TbNoticia), stmt.execute()); // TODO In the end, a GentleList should be returned instead of an arraylist //return new GentleList( typeof(tbnoticia), this ); #endregion

103 103 Arquivo teste.aspx utilizado para a realização do teste de performance do Gentle.NET //Insere quarenta mil registros utilizando um objeto e depois três objetos public partial class teste : System.Web.UI.Page protected void Page_Load(object sender, EventArgs e) //Insere mil notícias utilizando um objeto System.Web.HttpContext.Current.Response.Write("inicio: " + DateTime.Now.ToString("HH:mm:ss:fff")); for (int i = 0; i < 40000; i++) TbNoticia noticia = new TbNoticia(); noticia.id_noticia_categoria = 6; noticia.id_pessoa = 9; noticia.titulo = "blabla " + i; noticia.texto = "texto " + i; noticia.data_cadastro = Convert.ToDateTime(DateTime.Now.ToString("dd/MM/yyyy")); noticia.data_vencimento = Convert.ToDateTime(DateTime.Now.ToString("dd/MM/yyyy")); Broker.Insert(noticia); System.Web.HttpContext.Current.Response.Write("<br />Fim: " + DateTime.Now.ToString("HH:mm:ss:fff")); //Insere mil notícias, pessoa, categoria (três Objetos) System.Web.HttpContext.Current.Response.Write("inicio: " + DateTime.Now.ToString("HH:mm:ss:fff")); for (int i = 0; i < 40000; i++) //notícia TbNoticia noticia = new TbNoticia(); noticia.id_noticia_categoria = 80015; noticia.id_pessoa = 14; noticia.titulo = "blabla " + i; noticia.texto = "texto " + i; noticia.data_cadastro = Convert.ToDateTime(DateTime.Now.ToString("dd/MM/yyyy")); noticia.data_vencimento = Convert.ToDateTime(DateTime.Now.ToString("dd/MM/yyyy")); Broker.Insert(noticia); //categoria TbNoticiaCategoria nt = new TbNoticiaCategoria(); nt.descricao = "Gentle"; Broker.Insert(nt); //pessoa TbPessoa pessoa = new TbPessoa(); pessoa.nome = "GentleTCC"; pessoa.sexo = "Masculino"; pessoa.login = "tccgentle"; pessoa.senha = "123"; Broker.Insert(pessoa); System.Web.HttpContext.Current.Response.Write("<br />Fim: " + DateTime.Now.ToString("HH:mm:ss:fff"));

104 104 //Continuação do código anterior (altera utilizando um objeto e depois três objetos) //Altera todas as notícias cadastradas (um Objeto) System.Web.HttpContext.Current.Response.Write("inicio: " + DateTime.Now.ToString("HH:mm:ss:fff")); IList noticia2 = TbNoticia.ListAll(); int i = 0; foreach (TbNoticia noticia1 in noticia2) noticia1.titulo = "Yzaac " + i; noticia1.texto = "Teste " + i; Broker.Update(noticia1); i++; System.Web.HttpContext.Current.Response.Write("<br />Fim: " + DateTime.Now.ToString("HH:mm:ss:fff")); //Altera todas as notícias, pessoas e categorias (três Objetos) System.Web.HttpContext.Current.Response.Write("inicio: " + DateTime.Now.ToString("HH:mm:ss:fff")); //notícias IList noticia2 = TbNoticia.ListAll(); int i = 0; foreach (TbNoticia noticia1 in noticia2) noticia1.titulo = "TCC " + i; noticia1.texto = "Tá Quase " + i; Broker.Update(noticia1); i++; //pessoa IList ilist2 = TbPessoa.ListAll(); foreach (TbPessoa pessoa in ilist2) pessoa.nome = "Yzaac TCC"; Broker.Update(pessoa); //categoria IList ilist3 = TbNoticiaCategoria.ListAll(); foreach (TbNoticiaCategoria nt in ilist3) nt.descricao = "Novela"; Broker.Update(nt); System.Web.HttpContext.Current.Response.Write("<br />Fim: " + DateTime.Now.ToString("HH:mm:ss:fff"));

105 105 //Continuação do código anterior (exclui e busca utilizando um objeto e depois três objetos) //Exclui todas as notícias cadastradas (um Objeto) System.Web.HttpContext.Current.Response.Write("inicio: " + DateTime.Now.ToString("HH:mm:ss:fff")); IList noticia3 = TbNoticia.ListAll(); foreach (TbNoticia noti2 in noticia3) Broker.Remove(noti2); System.Web.HttpContext.Current.Response.Write("<br />Fim: " + DateTime.Now.ToString("HH:mm:ss:fff")); //Exclui todas as notícias, pessoas e categorias (três Objetos) System.Web.HttpContext.Current.Response.Write("inicio: " + DateTime.Now.ToString("HH:mm:ss:fff")); //notícia IList noticia3 = TbNoticia.ListAll(); foreach (TbNoticia noti2 in noticia3) Broker.Remove(noti2); //pessoa IList ilist2 = TbPessoa.ListAll(); foreach (TbPessoa pessoa in ilist2) Broker.Remove(pessoa); //categoria IList ilist3 = TbNoticiaCategoria.ListAll(); foreach (TbNoticiaCategoria nt in ilist3) Broker.Remove(nt); System.Web.HttpContext.Current.Response.Write("<br />Fim: " + DateTime.Now.ToString("HH:mm:ss:fff")); //Busca todas as notícias cadastradas (um Objeto) System.Web.HttpContext.Current.Response.Write("inicio: " + DateTime.Now.ToString("HH:mm:ss:fff")); IList ilist = TbNoticia.ListAll(); System.Web.HttpContext.Current.Response.Write("<br />Fim: " + DateTime.Now.ToString("HH:mm:ss:fff")); //Busca todas as notícias, pessoas e categorias (três Objetos) System.Web.HttpContext.Current.Response.Write("inicio: " + DateTime.Now.ToString("HH:mm:ss:fff")); IList ilist = TbNoticia.ListAll(); IList ilist2 = TbNoticiaCategoria.ListAll(); IList ilist3 = TbPessoa.ListAll(); System.Web.HttpContext.Current.Response.Write("<br />Fim: " + DateTime.Now.ToString("HH:mm:ss:fff"));

Procedimentos para Reinstalação do Sisloc

Procedimentos para Reinstalação do Sisloc Procedimentos para Reinstalação do Sisloc Sumário: 1. Informações Gerais... 3 2. Criação de backups importantes... 3 3. Reinstalação do Sisloc... 4 Passo a passo... 4 4. Instalação da base de dados Sisloc...

Leia mais

Manual Captura S_Line

Manual Captura S_Line Sumário 1. Introdução... 2 2. Configuração Inicial... 2 2.1. Requisitos... 2 2.2. Downloads... 2 2.3. Instalação/Abrir... 3 3. Sistema... 4 3.1. Abrir Usuário... 4 3.2. Nova Senha... 4 3.3. Propriedades

Leia mais

ArpPrintServer. Sistema de Gerenciamento de Impressão By Netsource www.netsource.com.br Rev: 02

ArpPrintServer. Sistema de Gerenciamento de Impressão By Netsource www.netsource.com.br Rev: 02 ArpPrintServer Sistema de Gerenciamento de Impressão By Netsource www.netsource.com.br Rev: 02 1 Sumário INTRODUÇÃO... 3 CARACTERÍSTICAS PRINCIPAIS DO SISTEMA... 3 REQUISITOS DE SISTEMA... 4 INSTALAÇÃO

Leia mais

Despachante Express - Software para o despachante documentalista veicular DESPACHANTE EXPRESS MANUAL DO USUÁRIO VERSÃO 1.1

Despachante Express - Software para o despachante documentalista veicular DESPACHANTE EXPRESS MANUAL DO USUÁRIO VERSÃO 1.1 DESPACHANTE EXPRESS MANUAL DO USUÁRIO VERSÃO 1.1 1 Sumário 1 - Instalação Normal do Despachante Express... 3 2 - Instalação do Despachante Express em Rede... 5 3 - Registrando o Despachante Express...

Leia mais

Procedimentos para Instalação do SISLOC

Procedimentos para Instalação do SISLOC Procedimentos para Instalação do SISLOC Sumário 1. Informações Gerais...3 2. Instalação do SISLOC...3 Passo a passo...3 3. Instalação da Base de Dados SISLOC... 11 Passo a passo... 11 4. Instalação de

Leia mais

Procedimentos para Instalação do Sisloc

Procedimentos para Instalação do Sisloc Procedimentos para Instalação do Sisloc Sumário: 1. Informações Gerais... 3 2. Instalação do Sisloc... 3 Passo a passo... 3 3. Instalação da base de dados Sisloc... 16 Passo a passo... 16 4. Instalação

Leia mais

Orientação a Objetos

Orientação a Objetos 1. Domínio e Aplicação Orientação a Objetos Um domínio é composto pelas entidades, informações e processos relacionados a um determinado contexto. Uma aplicação pode ser desenvolvida para automatizar ou

Leia mais

1. Introdução pág.3 2. Apresentação do sistema Joomla! pág.4 3. Acessando a administração do site pág.4 4. Artigos 4.1. Criando um Artigo 4.2.

1. Introdução pág.3 2. Apresentação do sistema Joomla! pág.4 3. Acessando a administração do site pág.4 4. Artigos 4.1. Criando um Artigo 4.2. 1. Introdução pág.3 2. Apresentação do sistema Joomla! pág.4 3. Acessando a administração do site pág.4 4. Artigos 4.1. Criando um Artigo 4.2. Editando um Artigo 4.3. Excluindo um Artigo 4.4. Publicar

Leia mais

Programação Orientada a Objetos com PHP & MySQL Sistema Gerenciador de Banco de Dados: Introdução e configuração de bases de dados com Postgre e MySQL

Programação Orientada a Objetos com PHP & MySQL Sistema Gerenciador de Banco de Dados: Introdução e configuração de bases de dados com Postgre e MySQL Programação Orientada a Objetos com PHP & MySQL Sistema Gerenciador de Banco de Dados: Introdução e configuração de bases de dados com Postgre e MySQL Prof. MSc. Hugo Souza Iniciando nossas aulas sobre

Leia mais

Instalando software MÉDICO Online no servidor

Instalando software MÉDICO Online no servidor Instalando software MÉDICO Online no servidor A máquina denominada Servidora é a que armazenará o banco de dados do software (arquivo responsável pelas informações inseridas), compartilhando com as demais

Leia mais

UFG - Instituto de Informática

UFG - Instituto de Informática UFG - Instituto de Informática Especialização em Desenvolvimento de Aplicações Web com Interfaces Ricas EJB 3.0 Prof.: Fabrízzio A A M N Soares [email protected] Aula 10 Persistência de Dados

Leia mais

Desenvolvimento de aplicação web com framework JavaServer Faces e Hibernate

Desenvolvimento de aplicação web com framework JavaServer Faces e Hibernate Desenvolvimento de aplicação web com framework JavaServer Faces e Hibernate Tiago Peres Souza 1, Jaime Willian Dias 1,2 ¹Universidade paranaense (Unipar) Paranavaí PR Brasil [email protected] 2 Universidade

Leia mais

AP_ Conta Aplicativo para digitação e envio de contas médicas no padrão TISS

AP_ Conta Aplicativo para digitação e envio de contas médicas no padrão TISS AP_ Conta Aplicativo para digitação e envio de contas médicas no padrão TISS Manual de Instalação Tempro Software StavTISS Sumário 1. INTRODUÇÃO... 2 2. REQUISITOS DO SISTEMA... 3 3. INSTALAÇÃO... 4 4.

Leia mais

Principais Comandos SQL Usados no MySql

Principais Comandos SQL Usados no MySql Principais Comandos SQL Usados no MySql O que é um SGBD? Um Sistema Gerenciador de Banco de Dados (como no Brasil) ou Sistema Gestor de Base de Dados (SGBD) é o conjunto de programas de computador (softwares)

Leia mais

Acessando um Banco de Dados

Acessando um Banco de Dados Acessando um Banco de Dados Introdução Agora que você já está craque em JSP e já instalou seu servidor, vamos direto para a parte prática! Neste tutorial vamos aprender a acessar um banco de dados. Para

Leia mais

Programação Orientada a Objetos com PHP & MySQL Cookies e Sessões. Prof. MSc. Hugo Souza

Programação Orientada a Objetos com PHP & MySQL Cookies e Sessões. Prof. MSc. Hugo Souza Programação Orientada a Objetos com PHP & MySQL Cookies e Sessões Prof. MSc. Hugo Souza Se você precisar manter informações sobre seus usuários enquanto eles navegam pelo seu site, ou até quando eles saem

Leia mais

02 - Usando o SiteMaster - Informações importantes

02 - Usando o SiteMaster - Informações importantes 01 - Apresentação do SiteMaster - News Edition O SiteMaster foi desenvolvido para ser um sistema simples de gerenciamento de notícias, instalado em seu próprio computador e com configuração simplificada,

Leia mais

Google Drive. Passos. Configurando o Google Drive

Google Drive. Passos. Configurando o Google Drive Google Drive um sistema de armazenagem de arquivos ligado à sua conta Google e acessível via Internet, desta forma você pode acessar seus arquivos a partir de qualquer dispositivo que tenha acesso à Internet.

Leia mais

CONFIGURAÇÃO DE REDE SISTEMA IDEAGRI - FAQ CONCEITOS GERAIS

CONFIGURAÇÃO DE REDE SISTEMA IDEAGRI - FAQ CONCEITOS GERAIS CONFIGURAÇÃO DE REDE SISTEMA IDEAGRI - FAQ CONCEITOS GERAIS Servidor: O servidor é todo computador no qual um banco de dados ou um programa (aplicação) está instalado e será COMPARTILHADO para outros computadores,

Leia mais

Introdução a Java. Hélder Nunes

Introdução a Java. Hélder Nunes Introdução a Java Hélder Nunes 2 Exercício de Fixação Os 4 elementos básicos da OO são os objetos, as classes, os atributos e os métodos. A orientação a objetos consiste em considerar os sistemas computacionais

Leia mais

www.neteye.com.br NetEye Guia de Instalação

www.neteye.com.br NetEye Guia de Instalação www.neteye.com.br NetEye Guia de Instalação Índice 1. Introdução... 3 2. Funcionamento básico dos componentes do NetEye...... 3 3. Requisitos mínimos para a instalação dos componentes do NetEye... 4 4.

Leia mais

Manual de Instalação ProJuris8

Manual de Instalação ProJuris8 Manual de Instalação ProJuris8 Sumário 1 - Requisitos para a Instalação... 3 2 - Instalação do Firebird.... 4 3 - Instalação do Aplicativo ProJuris 8.... 8 4 - Conexão com o banco de dados.... 12 5 - Ativação

Leia mais

Índice. Manual Backup Online. 03 Capítulo 1: Visão Geral

Índice. Manual Backup Online. 03 Capítulo 1: Visão Geral Índice 03 Capítulo 1: Visão Geral 04 Capítulo 2: Conta de Usuário 04 Criação 08 Edição 09 Grupo de Usuários 10 Informações da Conta 12 Capítulo 3: Download do Backup Online Embratel 16 Capítulo 4: Cópia

Leia mais

Aplicação Prática de Lua para Web

Aplicação Prática de Lua para Web Aplicação Prática de Lua para Web Aluno: Diego Malone Orientador: Sérgio Lifschitz Introdução A linguagem Lua vem sendo desenvolvida desde 1993 por pesquisadores do Departamento de Informática da PUC-Rio

Leia mais

Manual de Instalação, Administração e Uso do Sistema Elétric

Manual de Instalação, Administração e Uso do Sistema Elétric Manual de Instalação, Administração e Uso do Sistema Elétric Versão 1.0 Autores Bruna Cirqueira Mariane Dantas Milton Alves Robson Prioli Nova Odessa, 10 de Setembro de 2013 Sumário Apoio 1. Licença deste

Leia mais

Manual de Instalação e Configuração do SQL Express

Manual de Instalação e Configuração do SQL Express Manual de Instalação e Configuração do SQL Express Data alteração: 19/07/11 Pré Requisitos: Acesse o seguinte endereço e faça o download gratuito do SQL SRVER EXPRESS, conforme a sua plataforma x32 ou

Leia mais

Como funcionam os comandos de SQL no Logic Basic Por Alan Oliveira

Como funcionam os comandos de SQL no Logic Basic Por Alan Oliveira Como funcionam os comandos de SQL no Logic Basic Por Alan Oliveira www.linksinfo.com.br Tutorial versão 1.0 Sobre o Logic basic: Parte 1 Sobre o Logic Basic e o SQL O Logic Basic é uma linguagem de programação

Leia mais

APOSTILA BANCO DE DADOS INTRODUÇÃO A LINGUAGEM SQL

APOSTILA BANCO DE DADOS INTRODUÇÃO A LINGUAGEM SQL 1. O que é Linguagem SQL 2. Instrução CREATE 3. CONSTRAINT 4. ALTER TABLE 5. RENAME TABLE 6. TRUCANTE TABLE 7. DROP TABLE 8. DROP DATABASE 1 1. O que é Linguagem SQL 2. O SQL (Structured Query Language)

Leia mais

Processo de Envio de email

Processo de Envio de email Processo de Envio de email Introdução O envio de documentos de forma eletrônica vem sendo muito utilizado, assim o envio de arquivos, relatórios, avisos, informações é realizado via e-mail. O sistema disponibiliza

Leia mais

MANUAL DO USUÁRIO SORE Sistema Online de Reservas de Equipamento. Toledo PR. Versão 2.0 - Atualização 26/01/2009 Depto de TI - FASUL Página 1

MANUAL DO USUÁRIO SORE Sistema Online de Reservas de Equipamento. Toledo PR. Versão 2.0 - Atualização 26/01/2009 Depto de TI - FASUL Página 1 MANUAL DO USUÁRIO SORE Sistema Online de Reservas de Equipamento Toledo PR Página 1 INDICE 1. O QUE É O SORE...3 2. COMO ACESSAR O SORE... 4 2.1. Obtendo um Usuário e Senha... 4 2.2. Acessando o SORE pelo

Leia mais

Manual do Visualizador NF e KEY BEST

Manual do Visualizador NF e KEY BEST Manual do Visualizador NF e KEY BEST Versão 1.0 Maio/2011 INDICE SOBRE O VISUALIZADOR...................................................... 02 RISCOS POSSÍVEIS PARA O EMITENTE DA NOTA FISCAL ELETRÔNICA.................

Leia mais

Sistema de Instalação e Criação da Estrutura do Banco de Dados MANUAL DO INSTALADOR. Julho/2007. Ministério da saúde

Sistema de Instalação e Criação da Estrutura do Banco de Dados MANUAL DO INSTALADOR. Julho/2007. Ministério da saúde Sistema de Instalação e Criação da Estrutura do Banco de Dados MANUAL DO INSTALADOR Julho/2007 Ministério da saúde SUMÁRIO Módulo 1. Instalação... 4 Introdução... 4 Configurações de equipamentos para instalação

Leia mais

Desenvolvendo Websites com PHP

Desenvolvendo Websites com PHP Desenvolvendo Websites com PHP Aprenda a criar Websites dinâmicos e interativos com PHP e bancos de dados Juliano Niederauer 19 Capítulo 1 O que é o PHP? O PHP é uma das linguagens mais utilizadas na Web.

Leia mais

Noções de. Microsoft SQL Server. Microsoft SQL Server

Noções de. Microsoft SQL Server. Microsoft SQL Server Noções de 1 Considerações Iniciais Basicamente existem dois tipos de usuários do SQL Server: Implementadores Administradores 2 1 Implementadores Utilizam o SQL Server para criar e alterar base de dados

Leia mais

Manual de Instalação SystemFarma AutoCred

Manual de Instalação SystemFarma AutoCred Manual de Instalação SystemFarma AutoCred Requisitos do Sistema Para iniciar a instalação é necessário antes verificar os seguintes requisitos do sistema: Windows 98 ou superior com no mínimo 32 MB de

Leia mais

DOCUMENTAÇÃO DO FRAMEWORK - versão 2.0

DOCUMENTAÇÃO DO FRAMEWORK - versão 2.0 DOCUMENTAÇÃO DO FRAMEWORK - versão 2.0 Índice 1 - Objetivo 2 - Descrição do ambiente 2.1. Tecnologias utilizadas 2.2. Estrutura de pastas 2.3. Bibliotecas já incluídas 3 - Características gerais 4 - Criando

Leia mais

Manual AGENDA DE BACKUP

Manual AGENDA DE BACKUP Gemelo Backup Online DESKTOP Manual AGENDA DE BACKUP Realiza seus backups de maneira automática. Você só programa os dias e horas em que serão efetuados. A única coisa que você deve fazer é manter seu

Leia mais

Sumário 1. SOBRE O NFGoiana DESKTOP... 3 1.1. Apresentação... 3 1.2. Informações do sistema... 3 1.3. Acessando o NFGoiana Desktop... 3 1.4.

Sumário 1. SOBRE O NFGoiana DESKTOP... 3 1.1. Apresentação... 3 1.2. Informações do sistema... 3 1.3. Acessando o NFGoiana Desktop... 3 1.4. 1 Sumário 1. SOBRE O NFGoiana DESKTOP... 3 1.1. Apresentação... 3 1.2. Informações do sistema... 3 1.3. Acessando o NFGoiana Desktop... 3 1.4. Interface do sistema... 4 1.4.1. Janela Principal... 4 1.5.

Leia mais

Manual de Instalação Flex

Manual de Instalação Flex Manual de Instalação Flex Sumário 1. Sobre este documento... 3 2. Suporte técnico... 3 3. Requisitos de hardware... 4 4. Instalação... 5 4.1. Instalação no servidor... 5 4.1.1. Instalação do sistema...

Leia mais

Microsoft Access XP Módulo Um

Microsoft Access XP Módulo Um Microsoft Access XP Módulo Um Neste primeiro módulo de aula do curso completo de Access XP vamos nos dedicar ao estudo de alguns termos relacionados com banco de dados e as principais novidades do novo

Leia mais

CONFIGURAÇÃO MINIMA EXIGIDA:

CONFIGURAÇÃO MINIMA EXIGIDA: Este tutorial parte do princípio que seu usuário já possua conhecimentos básicos sobre hardware, sistema operacional Windows XP ou superior, firewall, protocolo de rede TCP/IP e instalação de software.

Leia mais

Manual Integra S_Line

Manual Integra S_Line 1 Introdução O é uma ferramenta que permite a transmissão Eletrônica de Resultado de Exames, possibilitando aos Prestadores de Serviços (Rede Credenciada), integrarem seus sistemas com os das Operadoras

Leia mais

Manual de Instalação PIMSConnector em Windows

Manual de Instalação PIMSConnector em Windows Manual de Instalação PIMSConnector em Windows Julho/2015 Sumário 1. Contexto de negócio (Introdução)... 3 2. Pré-requisitos instalação/implantação/utilização... 4 3. JBOSS... 6 3.1. Instalação... 6 3.2.

Leia mais

ÍNDICE 1 INTRODUÇÃO. 04 2 ACESSO AOS SISTEMAS. 05 3 DOCUMENTOS MANUTENÇÃO. 08 08 3.2 10 3.3 OCR. 11 4 REGISTRO DE DOCUMENTOS. 13 5 GERANDO DOCUMENTOS

ÍNDICE 1 INTRODUÇÃO. 04 2 ACESSO AOS SISTEMAS. 05 3 DOCUMENTOS MANUTENÇÃO. 08 08 3.2 10 3.3 OCR. 11 4 REGISTRO DE DOCUMENTOS. 13 5 GERANDO DOCUMENTOS ÍNDICE 1 INTRODUÇÃO... 04 2 ACESSO AOS SISTEMAS... 05 3 DOCUMENTOS MANUTENÇÃO... 08 3.1Tipos de Documentos... 08 3.2 Relações entre Documentos... 10 3.3 OCR... 11 4 REGISTRO DE DOCUMENTOS... 13 5 GERANDO

Leia mais

GUIA INTEGRA SERVICES E STATUS MONITOR

GUIA INTEGRA SERVICES E STATUS MONITOR GUIA INTEGRA SERVICES E STATUS MONITOR 1 - Integra Services Atenção: o Integra Services está disponível a partir da versão 2.0 do software Urano Integra. O Integra Services é um aplicativo que faz parte

Leia mais

Guia Sphinx: instalação, reposição e renovação

Guia Sphinx: instalação, reposição e renovação Sphinx : software para coleta e análise de dados acadêmicos e gerenciais. Tecnologia e informação para a decisão! Copyright Sphinx Todos direitos reservados Guia Sphinx: instalação, reposição e renovação

Leia mais

UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE ESCOLA AGRÍCOLA DE JUNDIAÍ EAJ - PRONATEC / REDE etec MÓDULO III DESENVOLVIMENTO PROFESSOR ADDSON COSTA

UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE ESCOLA AGRÍCOLA DE JUNDIAÍ EAJ - PRONATEC / REDE etec MÓDULO III DESENVOLVIMENTO PROFESSOR ADDSON COSTA UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE ESCOLA AGRÍCOLA DE JUNDIAÍ EAJ - PRONATEC / REDE etec MÓDULO III DESENVOLVIMENTO PROFESSOR ADDSON COSTA RESUMO DE AULA CRIAÇÃO E MANIPULAÇÃO DO BANCO DE DADOS

Leia mais

Construtor de sites SoftPixel GUIA RÁPIDO - 1 -

Construtor de sites SoftPixel GUIA RÁPIDO - 1 - GUIA RÁPIDO - 1 - Sumário Introdução...3 Por que utilizar o Construtor de Sites?...3 Vantagens do Construtor de Sites...3 Conceitos básicos...3 Configuração básica do site...5 Definindo o layout/template

Leia mais

Evandro sistemas comerciais e web.

Evandro sistemas comerciais e web. Evandro sistemas comerciais e web. Sistema de Gerenciamento Comercial. Contatos: Site: www.evandropf.ubbi.com.br e-mail: [email protected] msn: [email protected] Tel. (19)9212-7827 O Sistema Este sistema

Leia mais

TRANSMISSOR ECF. Sistema de transmissão de arquivos Nota Fiscal Paulista. Manual de Utilização

TRANSMISSOR ECF. Sistema de transmissão de arquivos Nota Fiscal Paulista. Manual de Utilização TRANSMISSOR ECF Sistema de transmissão de arquivos Nota Fiscal Paulista Manual de Utilização 1. Histórico de alterações Data Versão Alteração 04/12/2012 1 Criação do documento 28/02/2013 2 Revisão 2. Proposta

Leia mais

1 REQUISITOS BÁSICOS PARA INSTALAR O SMS PC REMOTO

1 REQUISITOS BÁSICOS PARA INSTALAR O SMS PC REMOTO 1 ÍNDICE 1 REQUISITOS BÁSICOS PARA INSTALAR O SMS PC REMOTO... 3 1.1 REQUISITOS BASICOS DE SOFTWARE... 3 1.2 REQUISITOS BASICOS DE HARDWARE... 3 2 EXECUTANDO O INSTALADOR... 3 2.1 PASSO 01... 3 2.2 PASSO

Leia mais

Manual de Instalação PIMSConnector em Linux

Manual de Instalação PIMSConnector em Linux Manual de Instalação PIMSConnector em Linux Julho/2015 Sumário 1. Contexto de negócio (Introdução)... 3 2. Pré-requisitos instalação/implantação/utilização... 4 3. JBOSS... 6 3.1. Instalação... 6 3.2.

Leia mais

Manual de Utilização do PLONE (Gerenciador de página pessoal)

Manual de Utilização do PLONE (Gerenciador de página pessoal) Manual de Utilização do PLONE (Gerenciador de página pessoal) Acessando o Sistema Para acessar a interface de colaboração de conteúdo, entre no endereço http://paginapessoal.utfpr.edu.br. No formulário

Leia mais

SCIM 1.0. Guia Rápido. Instalando, Parametrizando e Utilizando o Sistema de Controle Interno Municipal. Introdução

SCIM 1.0. Guia Rápido. Instalando, Parametrizando e Utilizando o Sistema de Controle Interno Municipal. Introdução SCIM 1.0 Guia Rápido Instalando, Parametrizando e Utilizando o Sistema de Controle Interno Municipal Introdução Nesta Edição O sistema de Controle Interno administra o questionário que será usado no chek-list

Leia mais

3. No painel da direita, dê um clique com o botão direito do mouse em qualquer espaço livre (área em branco).

3. No painel da direita, dê um clique com o botão direito do mouse em qualquer espaço livre (área em branco). Permissões de compartilhamento e NTFS - Parte 2 Criando e compartilhando uma pasta - Prática Autor: Júlio Battisti - Site: www.juliobattisti.com.br Neste tópico vamos criar e compartilhar uma pasta chamada

Leia mais

HIBERNATE EM APLICAÇÃO JAVA WEB

HIBERNATE EM APLICAÇÃO JAVA WEB HIBERNATE EM APLICAÇÃO JAVA WEB Raul Victtor Barbosa Claudino¹, Ricardo Ribeiro Rufino¹ ¹Universidade Paranaense (Unipar) Paranavaí PR Brasil [email protected], [email protected] Resumo: Este

Leia mais

Introdução a Banco de Dados

Introdução a Banco de Dados Introdução a Banco de Dados Ricardo Henrique Tassi - Departamento de Replicação Índice 1- Introdução... 03 2- Quais são os bancos de dados mais conhecidos hoje em dia...04 3- Quais são os tipos de banco...05

Leia mais

Manual de Instalação

Manual de Instalação Manual de Instalação Sumário 1. Sobre este documento... 3 2. Suporte técnico... 3 3. Requisitos de hardware... 4 3.1. Estação... 4 3.2. Servidor... 4 4. Instalação... 5 4.1. Instalação no servidor... 5

Leia mais

Manual Q-Acadêmico 2.0 Módulo Web - Aluno

Manual Q-Acadêmico 2.0 Módulo Web - Aluno Manual Q-Acadêmico 2.0 Módulo Web - Aluno Índice 1 Acessando o sistema via internet...3 2 Funcionalidades...6 2.1 Horário Individual...7 2.2 Calendário Acadêmico...8 2.3 Biblioteca...9 2.3.1 Consultar

Leia mais

Módulo SAC Atendimento ao Cliente

Módulo SAC Atendimento ao Cliente Módulo SAC Atendimento ao Cliente Objetivo O Módulo SAC ou Serviço de Atendimento ao Cliente é uma ferramenta que gerencia, cria e administra informações num canal de comunicação informatizado entre a

Leia mais

MANUAL DE INSTRUÇÕES. Versão 1.0. Visão Transportador

MANUAL DE INSTRUÇÕES. Versão 1.0. Visão Transportador MANUAL DE INSTRUÇÕES Versão 1.0 Visão Transportador 2 Sumário Introdução... 3 Requisitos mínimos... 3 Acesso... 3 Primeiro acesso... 5 Navegando pelo sistema... 6 Menu Perfil... 7 Dados do Fornecedor...

Leia mais

Aula 03 - Projeto Java Web

Aula 03 - Projeto Java Web Aula 03 - Projeto Java Web Para criação de um projeto java web, vá em File/New. Escolha o projeto: Em seguida, na caixa Categorias selecione Java Web. Feito isso, na caixa à direita selecione Aplicação

Leia mais

CONTRA CONTROLE DE ACESSOS E MODULARIZADOR DE SISTEMAS

CONTRA CONTROLE DE ACESSOS E MODULARIZADOR DE SISTEMAS MINISTÉRIO DO DESENVOLVIMENTO AGRÁRIO SUBSECRETARIA DE PLANEJAMENTO, ORÇAMENTO E ADMINISTRAÇÃO COORDENAÇÃO-GERAL DE MODERNIZAÇÃO E INFORMÁTICA CONTRA CONTROLE DE ACESSOS E MODULARIZADOR DE SISTEMAS MANUAL

Leia mais

ROTEIRO PARA TREINAMENTO DO SAGRES DIÁRIO Guia do Docente

ROTEIRO PARA TREINAMENTO DO SAGRES DIÁRIO Guia do Docente Conceito ROTEIRO PARA TREINAMENTO DO SAGRES DIÁRIO Guia do Docente O Sagres Diário é uma ferramenta que disponibiliza rotinas que facilitam a comunicação entre a comunidade Docente e Discente de uma instituição,

Leia mais

Escritório Virtual Administrativo

Escritório Virtual Administrativo 1 Treinamento Módulos Escritório Virtual Administrativo Sistema Office Instruções para configuração e utilização do módulo Escritório Virtual e módulo Administrativo do sistema Office 2 3 1. Escritório

Leia mais

Programação para Internet Orientada a Objetos com PHP & MySQL Instalando e configurando um ambiente de ferramentas PHP e MySQL. Prof. MSc.

Programação para Internet Orientada a Objetos com PHP & MySQL Instalando e configurando um ambiente de ferramentas PHP e MySQL. Prof. MSc. Programação para Internet Orientada a Objetos com PHP & MySQL Instalando e configurando um ambiente de ferramentas PHP e MySQL Prof. MSc. Hugo Souza Na última aula falamos um pouco sobre as ferramentas

Leia mais

Apesar de existirem diversas implementações de MVC, em linhas gerais, o fluxo funciona geralmente da seguinte forma:

Apesar de existirem diversas implementações de MVC, em linhas gerais, o fluxo funciona geralmente da seguinte forma: 1 Introdução A utilização de frameworks como base para a construção de aplicativos tem sido adotada pelos desenvolvedores com três objetivos básicos. Primeiramente para adotar um padrão de projeto que

Leia mais

O programa Mysql acompanha o pacote de instalação padrão e será instalado juntamente com a execução do instalador.

O programa Mysql acompanha o pacote de instalação padrão e será instalado juntamente com a execução do instalador. INTRODUÇÃO O Programa pode ser instalado em qualquer equipamento que utilize o sistema operacional Windows 95 ou superior, e seu banco de dados foi desenvolvido em MySQL, sendo necessário sua pré-instalação

Leia mais

Uma Abordagem sobre Mapeamento Objeto Relacional com Hibernate

Uma Abordagem sobre Mapeamento Objeto Relacional com Hibernate Uma Abordagem sobre Mapeamento Objeto Relacional com Hibernate Luis Gustavo Zandarim Soares 1, Késsia Rita da Costa Marchi 1 1 Universidade Paranaense (Unipar) Paraná PR Brasil [email protected],

Leia mais

Instalação Cliente Notes 6.5

Instalação Cliente Notes 6.5 Instalação Cliente Notes 6.5 1/1 Instalação Cliente Notes 6.5 LCC.008.2005 Versão 1.0 Versão Autor ou Responsável Data 1.0 Fabiana J. Santos 18/11/2005 RESUMO Este documento apresenta um roteiro de instalação

Leia mais

CRIANDO BANCOS DE DADOS NO SQL SERVER 2008 R2 COM O SQL SERVER MANAGEMENT STUDIO

CRIANDO BANCOS DE DADOS NO SQL SERVER 2008 R2 COM O SQL SERVER MANAGEMENT STUDIO CRIANDO BANCOS DE DADOS NO SQL SERVER 2008 R2 COM O SQL SERVER MANAGEMENT STUDIO Antes de criarmos um novo Banco de Dados quero fazer um pequeno parênteses sobre segurança. Você deve ter notado que sempre

Leia mais

Conteúdo Programático de PHP

Conteúdo Programático de PHP Conteúdo Programático de PHP 1 Por que PHP? No mercado atual existem diversas tecnologias especializadas na integração de banco de dados com a WEB, sendo o PHP a linguagem que mais se desenvolve, tendo

Leia mais

Prevayler. Perola. André Luís Sales de Moraes Juliana Keiko Yamaguchi Tatiana Yuka Takaki

Prevayler. Perola. André Luís Sales de Moraes Juliana Keiko Yamaguchi Tatiana Yuka Takaki Prevayler Perola André Luís Sales de Moraes Juliana Keiko Yamaguchi Tatiana Yuka Takaki Prevayler Prevayler é a implementação em Java do conceito de Prevalência. É um framework que prega uma JVM invulnerável

Leia mais

Manual do usuário. Mobile Auto Download

Manual do usuário. Mobile Auto Download Manual do usuário Mobile Auto Download Mobile Auto Download Parabéns, você acaba de adquirir um produto com a qualidade e segurança Intelbras. Este manual serve como referência para a sua instalação e

Leia mais

2 de maio de 2014. Remote Scan

2 de maio de 2014. Remote Scan 2 de maio de 2014 Remote Scan 2014 Electronics For Imaging. As informações nesta publicação estão cobertas pelos termos dos Avisos de caráter legal deste produto. Conteúdo 3 Conteúdo...5 Acesso ao...5

Leia mais

Permissões de compartilhamento e NTFS - Parte 1

Permissões de compartilhamento e NTFS - Parte 1 Permissões de compartilhamento e NTFS - Parte 1 Autor: Júlio Battisti - Site: www.juliobattisti.com.br Segurança, sem dúvidas, é um dos temas mais debatidos hoje, no mundo da informática. Nesse tutorial

Leia mais

Manual Instalação, Configuração e Atualização FullCopyConvert Data FullCopyConvertService

Manual Instalação, Configuração e Atualização FullCopyConvert Data FullCopyConvertService Manual Instalação, Configuração e Atualização FullCopyConvert Data FullCopyConvertService Revisão: Maio / 2015 Sumário Bem-vindo ao FullCopyConvert! Estas instruções irá guiá-lo através da instalação do

Leia mais

MDaemon GroupWare. Versão 1 Manual do Usuário. plugin para o Microsoft Outlook. Trabalhe em Equipe Usando o Outlook e o MDaemon

MDaemon GroupWare. Versão 1 Manual do Usuário. plugin para o Microsoft Outlook. Trabalhe em Equipe Usando o Outlook e o MDaemon MDaemon GroupWare plugin para o Microsoft Outlook Trabalhe em Equipe Usando o Outlook e o MDaemon Versão 1 Manual do Usuário MDaemon GroupWare Plugin for Microsoft Outlook Conteúdo 2003 Alt-N Technologies.

Leia mais

Manual Administrador - Mídia System

Manual Administrador - Mídia System Manual Administrador - Mídia System Logo após cadastrarmos sua Empresa em nosso sistema, será enviado um e-mail confirmando as informações de acesso do Administrador do sistema. Obs: Caso não tenha recebido

Leia mais

Software Web para: Empresas, Governo, Organizações, Entidades de Classe, Sindicatos, ONG's e Profissionais Liberais

Software Web para: Empresas, Governo, Organizações, Entidades de Classe, Sindicatos, ONG's e Profissionais Liberais MANUAL DO USUÁRIO BITÁVEL GERENCIADOR ONLINE DE NEWSLETTERS (GOLNEWS) Software Web para: Empresas, Governo, Organizações, Entidades de Classe, Sindicatos, ONG's e Profissionais Liberais Versão 1.0 1 Índice

Leia mais

Manual SAGe Versão 1.2 (a partir da versão 12.08.01)

Manual SAGe Versão 1.2 (a partir da versão 12.08.01) Manual SAGe Versão 1.2 (a partir da versão 12.08.01) Submissão de Relatórios Científicos Sumário Introdução... 2 Elaboração do Relatório Científico... 3 Submissão do Relatório Científico... 14 Operação

Leia mais

Smart Laudos 1.9. A Forma Inteligente de Criar seus Laudos Médicos. Manual do Usuário

Smart Laudos 1.9. A Forma Inteligente de Criar seus Laudos Médicos. Manual do Usuário Smart Laudos 1.9 A Forma Inteligente de Criar seus Laudos Médicos Manual do Usuário Conteúdo 1. O que é o Smart Laudos?... 3 2. Características... 3 3. Instalação... 3 4. Menu do Sistema... 4 5. Configurando

Leia mais

MANUAL DE INSTALAÇÃO E CONFIGURAÇÃO. Motor Periférico Versão 8.0

MANUAL DE INSTALAÇÃO E CONFIGURAÇÃO. Motor Periférico Versão 8.0 MANUAL DE INSTALAÇÃO E CONFIGURAÇÃO Motor Periférico Versão 8.0 1. Apresentação... 3 2. Instalação do Java... 3 2.1 Download e Instalação... 3 2.2 Verificar Instalação... 3 3. Download do Motor Periférico...

Leia mais

Instruções para instalação do Virtual Lab (ChemLab 2.5 ou Physics 3.0)

Instruções para instalação do Virtual Lab (ChemLab 2.5 ou Physics 3.0) Instruções para instalação do Virtual Lab (ChemLab 2.5 ou Physics 3.0) 1. Pré-requisitos para instalação do Virtual Lab Windows XP, Windows Vista ou Windows 7 Adobe AIR instalado. Disponível em: http://get.adobe.com/br/air/

Leia mais

INSTALAÇÃO DO SISTEMA CONTROLGÁS

INSTALAÇÃO DO SISTEMA CONTROLGÁS INSTALAÇÃO DO SISTEMA CONTROLGÁS 1) Clique duas vezes no arquivo ControlGasSetup.exe. Será exibida a tela de boas vindas do instalador: 2) Clique em avançar e aparecerá a tela a seguir: Manual de Instalação

Leia mais

UNIVERSIDADE FEDERAL DO AMAPÁ NÚCLEO DE TECNOLOGIA DA INFORMAÇÃO. Manual de Avaliação de Desempenho Cadastro

UNIVERSIDADE FEDERAL DO AMAPÁ NÚCLEO DE TECNOLOGIA DA INFORMAÇÃO. Manual de Avaliação de Desempenho Cadastro UNIVERSIDADE FEDERAL DO AMAPÁ NÚCLEO DE TECNOLOGIA DA INFORMAÇÃO Manual de Avaliação de Desempenho Cadastro UNIFAP MACAPÁ-AP 2013 S U M Á R I O 1 Tela de Login...2 2 Acessando ao submenu cadastro de avaliação

Leia mais

MANUAL DE INSTALAÇÃO. LSoft Ponto Eletrônico

MANUAL DE INSTALAÇÃO. LSoft Ponto Eletrônico MANUAL DE INSTALAÇÃO LSoft Ponto Eletrônico SUPORTE TÉCNICO AO USUÁRIO: Atendimento On-line: www.lsoft.com.br E-Mail: [email protected] (37) 3237-8900 Versão 1.0-2014. Todos os direitos reservados.

Leia mais

Manual de Instalação. Windows XP. Desenvolvedores: Patrick Duarte, Rodrigo dos Santos. Setembro de 2014.

Manual de Instalação. Windows XP. Desenvolvedores: Patrick Duarte, Rodrigo dos Santos. Setembro de 2014. Manual de Instalação Windows XP Desenvolvedores: Patrick Duarte, Rodrigo dos Santos. Setembro de 2014. 1 SUMÁRIO OBJETIVO DO MANUAL:...03 REQUISITOS MÍNIMOS:...03 PROCESSO DE INSTALAÇÃO:...04 3.1 Documentos

Leia mais

MANUAL DE UTILIZAÇÃO SISTEMA DE CADASTRO INTRANET

MANUAL DE UTILIZAÇÃO SISTEMA DE CADASTRO INTRANET MANUAL DE UTILIZAÇÃO SISTEMA DE CADASTRO INTRANET I Sumário 1. Objetivo do Documento... 1 2. Início... 1 3. Cadastro de Pessoa Física... 3 3.1. Preenchimentos Obrigatórios.... 4 3.2. Acesso aos Campos

Leia mais

Satélite. Manual de instalação e configuração. CENPECT Informática www.cenpect.com.br [email protected]

Satélite. Manual de instalação e configuração. CENPECT Informática www.cenpect.com.br cenpect@cenpect.com.br Satélite Manual de instalação e configuração CENPECT Informática www.cenpect.com.br [email protected] Índice Índice 1.Informações gerais 1.1.Sobre este manual 1.2.Visão geral do sistema 1.3.História

Leia mais

SISTEMA TYR DIAGRAMAS DE CLASSE E SEQUÊNCIA Empresa: Academia Universitária

SISTEMA TYR DIAGRAMAS DE CLASSE E SEQUÊNCIA Empresa: Academia Universitária SISTEMA TYR DIAGRAMAS DE CLASSE E SEQUÊNCIA Empresa: Academia Universitária Cascavel Novembro de 2009 Pedro Patitucci Finamore Daniel Bordignon Cassanelli Marco Antonio da Rosa DIAGRAMAS DE CLASSE E SEQUÊNCIA

Leia mais

Manual de backup do banco de dados PostgreSQL - Versão 2. Setembro-2011

Manual de backup do banco de dados PostgreSQL - Versão 2. Setembro-2011 Manual de backup do banco de dados PostgreSQL - Versão 2 Setembro-2011 E-Sales Oobj Tecnologia da Informação Av. D, n. 246, Qd. A-04, Lt.02, Ap. 02, Jardim Goiás Goiânia/GO, CEP: 74805-090 Fone: (62) 3086-5750

Leia mais

TUTORIAL DO ALUNO. Olá, bem vindo à plataforma de cursos a distância da Uniapae!!!

TUTORIAL DO ALUNO. Olá, bem vindo à plataforma de cursos a distância da Uniapae!!! TUTORIAL DO ALUNO Olá, bem vindo à plataforma de cursos a distância da Uniapae!!! O Moodle é a plataforma de ensino a distância utilizada pela Uniapae sendo a unidade de ensino para rápida capacitação

Leia mais

Outlook XML Reader Versão 8.0.0. Manual de Instalação e Demonstração UNE Tecnologia

Outlook XML Reader Versão 8.0.0. Manual de Instalação e Demonstração UNE Tecnologia Outlook XML Reader Versão 8.0.0 Manual de Instalação e Demonstração UNE Tecnologia Add-in para o Outlook 2003, 2007 e 2010 responsável pela validação e armazenamento de notas fiscais eletrônicas. Atenção,

Leia mais

NOME SEXO CPF NASCIMENTO SALARIO

NOME SEXO CPF NASCIMENTO SALARIO Tutorial SQL Fonte: http://www.devmedia.com.br/articles/viewcomp.asp?comp=2973 Para começar Os Sistemas Gerenciadores de Bancos de Dados Relacionais (SGBDr) são o principal mecanismo de suporte ao armazenamento

Leia mais

Passo-a-Passo para Criação de Conta no site Griaule e Download do Programa SDK e da Licença Fingerprint SDK 2009

Passo-a-Passo para Criação de Conta no site Griaule e Download do Programa SDK e da Licença Fingerprint SDK 2009 1 Importante: Passo-a-Passo para Criação de Conta no site Griaule e Download do Programa SDK e da Licença Fingerprint SDK 2009 É importante salientar que a Licença SDK não trabalha sozinha. Para que que

Leia mais

MAPEAMENTO OBJETO RELACIONAL: UM ESTUDO DE CASO

MAPEAMENTO OBJETO RELACIONAL: UM ESTUDO DE CASO MAPEAMENTO OBJETO RELACIONAL: UM ESTUDO DE CASO UTILIZANDO O HIBERNATE Rafael Laurino GUERRA, Dra. Luciana Aparecida Martinez ZAINA Faculdade de Tecnologia de Indaiatuba FATEC-ID 1 RESUMO Este artigo apresenta

Leia mais

DESENVOLVENDO APLICAÇÃO UTILIZANDO JAVA SERVER FACES

DESENVOLVENDO APLICAÇÃO UTILIZANDO JAVA SERVER FACES DESENVOLVENDO APLICAÇÃO UTILIZANDO JAVA SERVER FACES Alexandre Egleilton Araújo, Jaime Willian Dias Universidade Paranaense (Unipar) Paranavaí PR Brasil [email protected], [email protected] Resumo.

Leia mais

CAPÍTULO 8 Conexões de banco de dados para programadores ASP.NET

CAPÍTULO 8 Conexões de banco de dados para programadores ASP.NET CAPÍTULO 8 Conexões de banco de dados para programadores ASP.NET Para utilizar um banco de dados com um aplicativo ASP.NET, é necessário criar uma conexão de banco de dados no Macromedia Dreamweaver MX.

Leia mais