Nhibernate横空出世之一:快速启程(NHibernate+MySQL+WPF)
1. 新建工程
新建WPF应用程序工程SimpleNHibernateTour,做一些准备工作:
(1) 准备组件库
右键单击Solution,选择在Windows Explorer中打开,新建文件夹,这里命名为Lib,将我们下载的Nhibernate包(如NHibernate-3.0.0.GA-bin.zip)中的必要组件拷贝至改文件夹,为方便起见,这里将Required_Bins文件夹和Required_For_LazyLoading\Castle文件夹下的所有内容都拷贝进刚刚创建的Lib文件夹中,另外还需要添加MySql.Data.dll,以便接下来引用。
(2) 添加Schema
这里的工作可以使我们在编辑配置接下来的配置文件和映射文件时,可以自动提示。
右键单击Solution,选择Add>Add Solution Folder选项,创建Solution文件夹,并将其重命名,例如Schema。
右击Schema文件夹,选择Add> Existing Item,选择Lib下的两个xsd文件,即nhibernate-configuration.xsd和nhibernate-mapping.xsd。
在使用过程中,可以在XML文件属性中,为Schema选项添加上面相应的xsd文件。
2. 配置文件
有多种方法使用配置文件,比如通过configure文件,如App.config,web.config等,也可以通过代码,或者通过单独的配置文件hibernate.cfg.xml,我们选择使用单独的配置文件。
在工程中新建XML文件,命名为hibernate.cfg.xml,并指定相应Schema,如下图所示:
配置文件如下所示:
代码<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<!-- ISessionFactory实例 -->
<session-factory>
<!-- 属性 -->
<!-- 设置connection provider,NHibernate将用之连接数据库 -->
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<!-- 设置所用driver,在此,我们为MySQL数据库选择MySqlDataDriver -->
<property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property>
<!-- 设置连接到数据库的connection string -->
<property name="connection.connection_string">***********</property>
<!-- 为特定数据库选择Dialect,这里选择使用MySQL5Dialect -->
<property name="dialect">NHibernate.Dialect.MySQL5Dialect</property>
<!-- 映射文件 -->
<mapping resource="SimpleNHibernateTour.Employee.hbm.xml" assembly="SimpleNHibernateTour" />
</session-factory>
</hibernate-configuration>
3. 创建持久化类
namespace SimpleNHibernateTour
{
public class Employee
{
public Employee()
{ }
private int id;
public virtual int Id
{
get { return id; }
set { id = value; }
}
private string name;
public virtual string Name
{
get { return name; }
set { name = value; }
}
private int age;
public virtual int Age
{
get { return age; }
set { age = value; }
}
}
}
Company.cs包含3个属性,通过一定的的规则,可以与数据库中相应表的字段进行关联。在Nhibernate中,不仅仅是属性类型可以被映射,所有的.NET类型和原型(primitive)都可以被映射,包括命名空间System.Collections下的类。
在代码中,所有的pulic属性都被定义为virtual,具体原因可以参见文档(Documentation)。
4. 映射文件
在工程中建立Employee.hbm.xml,注意要与配置文件中的生命对应起来,此外,在映射文件属性栏中,更改Build Action选项为Embedded Resources(如下图所示),这样做可以使NHibernate在运行时进行解析,从而在使用映射时达到简化编码的目的。
也可以使用上面讲述的方法为映射文件选择Schema。
5. 创建数据表
CREATE TABLE `employee` (
`id` int(11) NOT NULL,
`name` varchar(100) NOT NULL,
`age` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
6. 测试
测试方法很多,这里使用WPF简单进行演示,这里只做最简单的演示,在以后的文章中可以做绑定,等等。
在主窗体中拖放一个Label、两个TextBox以及两个按钮,分别命名为labelId,textBoxName、textBoxAge和buttonUpdate、buttonDelete。
如下图所示(效果图):
同时添加事件,代码如下所示:
代码namespace SimpleNHibernateTour
{
public partial class MainWindow : Window
{
Employee emp;
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
// 加载数据,因此在数据表中默认情况下要有数据存在
IList employees;
ISessionFactory sf = new NHibernate.Cfg.Configuration().Configure().BuildSessionFactory();
using (ISession session = sf.OpenSession())
{
ICriteria criteria = session.CreateCriteria(typeof(Employee));
employees = criteria.List();
session.Close();
}
sf.Close();
emp = (Employee)employees[0];
labelId.Content = emp.Id;
textBoxName.Text = emp.Name;
textBoxAge.Text = emp.Age.ToString();
}
private void buttonUpdate_Click(object sender, RoutedEventArgs e)
{
// 对数据进行修改
ISessionFactory sf = new NHibernate.Cfg.Configuration().Configure().BuildSessionFactory();
using (ISession session = sf.OpenSession())
{
emp = (Employee)session.Load(typeof(Employee), int.Parse(labelId.Content.ToString()));
emp.Name = textBoxName.Text;
emp.Age = Convert.ToInt32(textBoxAge.Text);
session.SaveOrUpdate(emp);
session.Flush();
session.Close();
}
sf.Close();
}
private void buttonDelete_Click(object sender, RoutedEventArgs e)
{
// 删除数据
ISessionFactory sf = new NHibernate.Cfg.Configuration().Configure().BuildSessionFactory();
using (ISession session = sf.OpenSession())
{
emp = (Employee)session.Load(typeof(Employee), int.Parse(labelId.Content.ToString()));
session.Delete(emp);
session.Flush();
session.Close();
}
sf.Close();
}
}
}
至于什么时候该引用哪个组件,需要我们自己去探索,在探索中成长。
7. 总结
本片文章讲述了如何快速使用Nhibernate,一些细节难免有疏漏,在编写程序过程中,出于简洁和快捷的考虑,程序上难免会有不足之处,但如果达到“快速上手”Nhibernate的目的,那就成功了!
8. 参考文章
http://www.codeproject.com/KB/dotnet/mysqlnhibernate.aspx