时间:2021-07-01 10:21:17 帮助过:24人阅读
前面的两篇文章中,我们对NHibernate已经做了大致了解 《ORM利器:NHibernate(一)简介》Nhibernate的作用:解决了对象和数据库的转化问题 《ORM利器:NHibernate(二)使用CodeSmith快速生成映射文件和映射类 》利用CodeSmith由表导出映射类(就是通常所说
前面的两篇文章中,我们对NHibernate已经做了大致了解
《ORM利器:NHibernate(一)简介》Nhibernate的作用:解决了对象和数据库的转化问题
《ORM利器:NHibernate(二)使用CodeSmith快速生成映射文件和映射类 》利用CodeSmith由表导出映射类(就是通常所说的Entity)和映射文件(告诉你表和对象之间是如何建立一一对应的关系的)。
接下来将会对NHibernate的使用做Demo解析,分为五部曲:
如果你觉得配置文件很复杂、记不住,也没有关系。NH为我们提供了很多配置文件的模板以供参考,这里我们采用SQLServer,因此可以参照:Configuration_Templates—MSSQL.cfg.xmlNHibernate.Connection.ConnectionProvider,NHibernate NHibernate.Driver.SqlClientDriver Server=(local);initial catalog=NHibernate;Integrated Security=SSPI NHibernate.Dialect.MsSql2008Dialect False NHibernate.ByteCode.Linfu.ProcxyFactoryFactory,NHibernate.ByteCode.Linfu
第五部:使用NH提供的API。维护对象和库之间的关系,对对象的CRUD和对数据库的DML
1、目录结构如下:
外部引用NHibernate和NHibernate.ByteCode.Linfu.项目引用Test.dll1)新建类库Test:
用于存放所有的对象和.NET映射文件(如此处的Person.cs对象,Person.hbm.xml映射文件),为了让NHibernate能够找到所有的映射文件,必须设置为“嵌入资源”,生成Test.dll文件备用。
2)添加引用:
2、添加窗体Form1,如图所示:
3、窗体Form1中的代码如下所示:
首先,通过config读取配置文件,读取所有映射文件,加载程序集(必须是嵌入资源)
其次,通过SessionFactory创建session工厂,负责持久化的连接以及OR映射(该对象的开销比较大,一般建议用单例模式实现)
然后,通过session创建一个可以用于用户级别的操作对象。
开启事务对象trans = session.BeginTransaction();
上面的思路和我们曾经使用过的SQLServer是一个道理。接下来看一下不同点:
以前D层和数据库打交道的时候,我们通常使用sql语句,而后直接对数据库进行操作。而在NH中所有的操作(增删改查)全都是针对“对象”而言的,如果想要把对象保存在数据库中,就需要先将对象必须转化为数据库能识别的sql语句,由于在SessionFactory中已经保存了所有的OR映射,ISession能根据相应的方言实现sql语句。
下文的代码中已经实现了简单操作对象。主要是通过session的get、save、delete方法来实现。若要实现复杂的查询不免会比较繁琐。NHibernate提供了一种强大的查询语言HQL(Hibernate Query Language),它的语法非常类似于Sql,不同的是只能用于对数据进行查询操作,不能用于数据增、删、改。它是完全面向对象的,具备继承、多态和关联等特性。
using System;
using System.Collections;
using System.Collections.Generic;
using System.Windows.Forms;
using NHibernate;
using NHibernate.Cfg;
using Test.Model;
using System.Linq;
namespace WinFormTest
{
public partial class Form1 : Form
{
//创建session
ISession session = null;
//创建session工厂
ISessionFactory factory = null;
//创建事务
ITransaction trans = null;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//读取配置文件
//读取所有映射文件,加载程序集,必须是嵌入资源
Configuration config = new Configuration().AddAssembly("Test.Model");
//创建session工厂,负责持久化的连接以及OR映射,该对象的开销比较大,一般建议用单例模式实现
factory = config.BuildSessionFactory();
//创建一个可以用于用户级别的操作对象
session = factory.OpenSession();
}
//添加用户
private void btnAdd_Click(object sender, EventArgs e)
{
//开启事务对象
trans = session.BeginTransaction();
//使用NHibernate现有API
//体验过程
try
{
//对象的实例化方式
Person p = new Person();
p.Name = this.txtName.Text;
//把对象保存在数据库中
//将对象必须转化为数据库能识别的sql语句
//由于在SessionFactory中已经保存了所有的OR映射
//ISession能根据相应的方言实现sql语句
session.Save(p);
trans.Commit();
}
catch (Exception)
{
//出错后,事务回滚
trans.Rollback();
}
}
//查询用户
private void btnFind_Click(object sender, EventArgs e)
{
//trans = session.BeginTransaction();
//查找ID编号为2的人
//2-->ID属性——OR——>SQL的Where语句
Person p = (Person)session.Get(typeof(Person), int.Parse(this.txtID.Text));
//Console.WriteLine(p.ToString());
this.txtName.Text = p.Name;
}
//删除用户
private void btnDelete_Click(object sender, EventArgs e)
{
try
{
//开启事务
trans = session.BeginTransaction();
//根据提供的ID查找该对象
Person p = (Person)session.Get(typeof(Person), int.Parse(this.txtID.Text));
//对象删除
session.Delete(p);
trans.Commit();
}
catch (Exception)
{
trans.Rollback();
}
}
//更新用户
private void btnUp_Click(object sender, EventArgs e)
{
try
{
//开启事务
trans = session.BeginTransaction();
//根据提供的ID查找该对象
Person p = (Person)session.Get(typeof(Person), int.Parse(this.txtID.Text));
//修改对象属性
p.Name = this.txtName.Text;
session.Update(p);
trans.Commit();
}
catch (Exception)
{
trans.Rollback();
}
}
//IQuery接口,是针对对象查询
private void btnHQL_Click(object sender, EventArgs e)
{
//HQL体验——HQL是针对对象的查询语言
//查询所有人的信息
//IQuery query = session.CreateQuery("from Person");
//IList persons = query.List();
//persons.p1();
//查询编号为2的人的信息
//IQuery query = session.CreateQuery("from Person where Id=3");
//query.List().p1();
//查询名字中有字母a的人
//session.CreateQuery("from Person where Name like '%a%'").List().p1();
//session.CreateQuery("from Person where t_Name like '%a%'").List().p1();
//session.CreateQuery("from Person where name like '%a%'").List().p1();//错误
//查找全部
//session.CreateQuery("select p from Person p").List().p1();
//session.CreateQuery("select * from Person ").List().p1();//错误,没有*
//查找编号大于5的人的信息
//session.CreateQuery("from Person p where p.Id>5 ").List().p1();
//聚合函数的使用--统计人数
//session.CreateQuery("select count(p.Id) from Person p ").List().p2();
//传参1
//IQuery query = session.CreateQuery("from Person p where p.Id>?");
//query.SetParameter(0,7);
//query.List().p1();
//传参2
//IQuery query = session.CreateQuery("from Person p where p.Id>:id");
//query.SetParameter("id", 7);
//query.List().p1();
//插入数据——Insert/Update/Delete不建议在HQL里面操作
//IQuery query = session.CreateQuery("insert into t_Person(t_Name) values(?)");
//query.SetParameter(0,"kkk");
//query.ExecuteUpdate();
//查询指定范围的数据——查询第3-7条记录
IQuery query = session.CreateQuery("from Person");
query.List().Skip(3).Take(5).ToList(); ;
//用ICriteria来实现该功能可能更方便
}
//对IList类型数据的 输出,建议用C#3.0的拓展方法来实现
public static class ExtraClass
{
public static void p1(this IList总结:对于NHibernate的操作,本文通过五部曲进行细致的讲解:1、创建表;2、创建类;3、创建映射文件(表和类是如何对应的);4、NH配置文件(连接数据库);5、利用API操作。
其中,2、3 我们采用CodeSmith自动生成映射类和映射文件;4就是我们曾做的连接数据库操作;5通过NHibernate提供的API,通过对对象操作,已达到操作数据库的目的,避免了冗长复杂的sql语句。
希望大家重点理解创建的过程,以及API的使用。