Back-End

28 jan, 2010

C# – Usando o NHibernate 2.1 com SharpDevelop 3.1 e MySQL/SQL Server – Parte 02

Publicidade

Na primeira parte deste
artigo definimos o nosso
objetivo, os recursos que iríamos usar, criamos o banco de
dados e as tabelas no MySQL e no SQL Server, o projeto no SharpDevelop,
definimos as referências usadas no projeto, a classe
do nosso domínio e o arquivo de configuração para o
NHibernate. Hoje vamos
definir o arquivo de configuração da aplicação e realizar as
operações usando os recursos do NHibernate.

Definindo o
arquivo de
configuração da aplicação

Se você já criou aplicações na
plataforma .NET com acesso a dados usando DataSets ou DataReaders
deve estar familiarizado com o conceito de armazenar a string de
conexão em um arquivo de configuração App.Config ou
Web.Config.

Pois para o NHibernate
o conceito é
o mesmo. Você tem que definir em um arquivo de configuração
algumas informações que orientam o NHibernate quanto ao banco de
dados que está sendo usado, a string de conexão e outros
detalhes.

Como estamos trabalhando com uma
aplicação Windows Forms vamos criar um
arquivo app.config.

Com o projeto aberto no
SharpDevelop, no menu Projeto selecione -> Adicionar
Novo
Item;

Na janela Novo Arquivo selecione a
Categoria Misc e em Modelos selecione App.Config File e
clique
Criar:

A seguir defina no arquivo XML
criando o seguinte conteúdo:





name="hibernate-configuration"
type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />



xmlns="urn:nhibernate-configuration-2.2">



name="connection.provider">

NHibernate.Connection.DriverConnectionProvider

name="connection.driver_class">



NHibernate.Driver.MySqlDataDriver

name="connection.connection_string">



Server=localhost;Database=alomundo;User ID=root;Password=gpxpst

name="dialect">



NHibernate.Dialect.MySQLDialect

name="show_sql">
false

name="hbm2ddl.keywords">
none

name="proxyfactory.factory_class">

NHibernate.ByteCode.Castle.ProxyFactoryFactory,
NHibernate.ByteCode.Castle

Lembrando que esta configuração
vale para a versão 2.0 do NHiberante ou
superior.

O arquivo pode parecer complicado,
mas na verdade ele apenas define alguns parâmetros para a
aplicação, os quais são:

– define o
provedor usado pelo NHibernate

NHibernate.Connection.DriverConnectionProvider

– define o
driver usado para conexão com o banco de dados. Observe que
temos dois valores: um que está comentado e outro que está ativo.
Fizemos assim pois vamos usar dois banco de dados: o MySQL e o
SQL Server. Logo, para o banco de dados ativo usamos o driver
correspondente.

NHibernate.Driver.MySqlDataDriver


define a string de conexão com o banco de dados. Novamente temos
dois valores – um para o SQL Server e outro para o MySQL.


Server=localhost;Database=alomundo;User
ID=root;Password=xxxxxx

Define
se os comandos SQL serão exibidos ou não.
false


Define o proxy usado pelo NHibernate
NHibernate.ByteCode.Castle.ProxyFactoryFactory,
NHibernate.ByteCode.Castle

O NHibernate usa este arquivo para saber como tratar com o banco
de dados e como usá-lo.

Como eu já mencionei, uma das grandes
vantagens do NHibernate é poder abstrair os comandos SQL e a
independência do banco de dados. Quando usamos ADO .NET temos
todo um trabalho relacionado com a definição de objetos para
conexão e persistência de dados, bem como dos comandos SQL
envolvidos.

Apenas para ilustrar, a figura abaixo
mostra uma comparação de um exemplo de arquitetura usando a ADO
.NET e o NHibernate.

Pois bem, se com o NHibernate eu não
tenho que escrever comandos SQL, como tenho que fazer para
realizar operações de persistência?

O NHibernate utiliza as interface
ISession, ITransaction e IQuery
para realizar a
interação e a persistência com o banco de dados, portanto para
usar esses recursos do NHibernate temos que usar essas
interfaces. Onde:

  • ISession – representa uma
    conexão com a sua base de dados;
  • ITransacation – representa uma
    transação que o NHibernate controla;
  • IQuery – representa uma
    consulta com a base de dados;

Vamos então definir uma aplicação
Windows Forms bem simples onde iremos
realizar operações de
consulta e persistência de dados usando esses recursos.

Vamos definir uma pequena
aplicação que realiza o controle de funcionários de uma
empresa. Nela iremos realizar as seguintes operações: Consultar
e exibir empregados, criar, atualizar e excluir empregados. Para
isso defini no formulário padrão da aplicação o seguinte
leiaute para a interface:

Controles usados :

  • ListBox
  • Button
  • TextBox
  • GroupBox

Todas as operações que iremos
realizar devem usar a interface ISession e abrir uma sessão a
partir da qual o NHibernate obtém as informações que definimos
nos arquivos de configuração. Nosso primeiro passo será
definir um método que usa a interface ISession. Eu vou fazer
isso no próprio formulário da aplicação e não em uma camada
separada como seria o correto, pois quero focar em mostrar como
usar esses recursos básicos do NHibernate e não estou
preocupado com as boas práticas neste momento.

Definindo o
código da
aplicação

Então no próprio formulário vamos
primeiro definir os namespaces que vamos usar na aplicação:

  • using
    System;
  • using System.Collections.Generic;
  • using System.Drawing;
  • using System.Windows.Forms;
  • using NHibernate;
  • using NHibernate.Cfg;
  • using System.Reflection;
  • using MySql.Data.MySqlClient;
  • using MySql.Data;

A seguir vamos definir o método
estático OpenSession,que irá definir uma
sessão para o NHibernate conforme o código abaixo:

//define uma sessão
static ISession OpenSession()
{

if(factory == null)
{
try{
Configuration c =
new Configuration();

c.AddAssembly(Assembly.GetCallingAssembly());
factory =
c.BuildSessionFactory();
}
catch (Exception ex)

{
MessageBox.Show(" Erro : " +
ex.Message.ToString());
Application.Exit();
}

}
return factory.OpenSession();
}

O código deste método carrega as
informações dos arquivos hbml.xml definidos no projeto:

Configuration
c = new Configuration();
c.AddAssembly(Assembly.GetCallingAssembly());

e do arquivo App.Config da aplicação:

factory
= c.BuildSessionFactory();

criando uma sessão que será retornada e usada em nossa
aplicação:

return
factory.OpenSession();

Todas as operações que iremos
realizar vão usar esta sessão que foi criada.

Para começar vou mostrar como
acessar os dados dos empregados e exibi-los no formulário no
controle ListBox.

Isso é feito quando o usuário
clica no botão Exibir Empregados. O código associado ao evento
Click deste botão é o seguinte:

//exibe os empregados
void BtnExibirClick(object sender,
EventArgs e)
{
using (ISession session = OpenSession())

{
try{
IQuery query = session.CreateQuery("from
Empregado as emp order by emp.nome asc");


IList procuraEmpregados =
query.List();
lstEmpregados.Items.Clear();

lstEmpregados.Items.Add("Empregado(s) encontrado(s) : " +
procuraEmpregados.Count);

foreach( Empregado empregado in
procuraEmpregados )

lstEmpregados.Items.Add(empregado.empregadoID());
}

catch (Exception ex)
{
MessageBox.Show(" Erro : " +
ex.Message.ToString());
}
}
}

Neste código estamos usando a
linguagem de consulta do NHibernate chamada HQL-
Hibernate Query Language
. Ela é parecida com a SQL, mas
é orientada a objetos e possui recursos de herança,
polimorfismo e associação.

Nota:
para mais detalhes sobre a HQL consulte o site oficial do
NHibernate:
https://www.hibernate.org/hib_docs/nhibernate/html/queryhql.html

Primeiro obtemos a sessão que foi
criada e definimos a consulta para obter os empregados da
entidade Empregado que foi mapeada do banco
de dados.

IQuery query =
session.CreateQuery(“from Empregado as emp order by emp.nome
asc”);

Em seguida obtemos uma coleção dos
objetos Empregado:

IList
procuraEmpregados
= query.List();

Exibimos o total de
empregados encontrados:

lstEmpregados.Items.Add(“Empregado(s)
encontrado(s)
: ” + procuraEmpregados.Count);

Percorremos a coleção e exibimos o
ID e o nome do empregado no ListBox:

foreach(
Empregado empregado in procuraEmpregados )