C# – Usando o NHibernate 2.1 com SharpDevelop 3.1 e MySQL/SQL Server – Parte 02
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:
<br /><br /><br /><strong><br /> name="hibernate-configuration" <br />type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" /></strong><br /><br /><strong><br /> xmlns="urn:nhibernate-configuration-2.2"></strong><br /><br /><br /> name="connection.provider"><br /><br />NHibernate.Connection.DriverConnectionProvider<br /><br /> name="connection.driver_class"><br /><strong> <br /></strong><br /><br />NHibernate.Driver.MySqlDataDriver<br /><br />name="connection.connection_string"><br /><strong> <br /></strong><br /><br />Server=localhost;Database=alomundo;User ID=root;Password=gpxpst<br /><br /> name="dialect"><br /><strong> <br /></strong><br /><br />NHibernate.Dialect.MySQLDialect<br /><br />name="show_sql"><br /> false<br /><br />name="hbm2ddl.keywords"><br /> none<br /><br /> name="proxyfactory.factory_class"><br /><br />NHibernate.ByteCode.Castle.ProxyFactoryFactory, <br />NHibernate.ByteCode.Castle<br /><br />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<br />static ISession OpenSession()<br />{<br /><br />if(factory == null)<br /> {<br /> try{<br /> Configuration c = <br />new Configuration();<br /><br />c.AddAssembly(Assembly.GetCallingAssembly());<br /> factory = <br />c.BuildSessionFactory();<br /> }<br /> catch (Exception ex)<br /><br /> {<br /> MessageBox.Show(" Erro : " + <br />ex.Message.ToString());<br /> Application.Exit();<br /> }<br /><br /> }<br /> return factory.OpenSession(); <br />}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<br />void BtnExibirClick(object sender, <br />EventArgs e)<br />{<br /><strong>using (ISession session = OpenSession())</strong><br /><br /> {<br /> try{<br /><strong>IQuery query = session.CreateQuery("from <br />Empregado as emp order by emp.nome asc");</strong><br /><br />IList procuraEmpregados = <br />query.List();<br /> lstEmpregados.Items.Clear();<br /><br />lstEmpregados.Items.Add("Empregado(s) encontrado(s) : " + <br />procuraEmpregados.Count);<br /><br /> foreach( Empregado empregado in <br />procuraEmpregados )<br /><br />lstEmpregados.Items.Add(empregado.empregadoID());<br /> }<br /><br />catch (Exception ex)<br /> {<br /> MessageBox.Show(" Erro : " + <br />ex.Message.ToString());<br /> }<br /> } <br />} 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 )








