网站架构:
1.图片
2.说明
Data ----------------------- 类库项目,数据访问层,由Nhibernate提供数据相关操作
Mapping ------------------- 类库项目,映射文件都在这个项目中
Model -------------------- 类型项目,实体层
XShop -------------------- Mvc项目,UI层
步骤:
1.安装Nhibernate
2.配置Nhibernate
3.创建实体类
4.编写映射文件
5.创建数据库/表
6.CURD操作
7.测试
第一步:安装Nhibernate,这一步就不用说了,使用Nuget安装,看图
第二步:配置Nhibernate
2.1 这一步主要是一些系统级的配置,如:连接字符串,数据库驱动,数据库方言等
2.2 创建 hibernate.cfg.xml文件(XShop项目中)
<?xml version="1.0" encoding="utf-8"?><hibernate-configurationxmlns="urn:nhibernate-configuration-2.2"><!--Nhibernate对数据库操作是基于Isession(会话),可以理解为SqlConnection的封装,可通过SessionFactory创建--><session-factoryname="XShop"><!--连接提供程序--><PRopertyname="connection.provider">NHibernate.Connection.DriverConnectionProvider</property><!--连接字符串--><propertyname="connection.connection_string">Server=.;initial catalog=XShopDb;Integrated Security=SSPI</property><!--Nhibernate是一个支持多个数据库的Orm框架,然而几乎每个数据库产品都对Sql的实现都有所不同--><!--Nhibernate通过dialect(方言)消除数据库之间的差异--><propertyname="dialect">NHibernate.Dialect.MsSql2008Dialect</property><!--是否在调试的时候打印Sql语句--><propertyname="show_sql">true</property><!--映射文件所在的程序集--><mappingassembly="Mapping"/></session-factory></hibernate-configuration>
温馨提示:如果发现在编写xml文件的时候发现没有智能提示,请把Nhibernate包的xsd文件复制到Vs安装目录中(参考百度)
注意:Nhibernate配置文件的文件名必须为 hibernate.cfg.xml ,不可随意更改
第三步:创建实体类 Customer(Model项目)
3.1 代码
namespaceModel
{publicclassCustomer
{publicvirtualintId {get;set; }publicvirtualstringName {get;set; }publicvirtualstringUserName {get;set; }publicvirtualstringPassWord{get;set; }publicvirtualDateTime CreateTime {get;set; }
}
}
注意:实体类的属性必须是virtual,否则Nhibernate会报错.why?因为这样Nhibernate就可以重写这些属性的访问逻辑,比如 延迟加载..
第四步:创建 Customer.hbm.xml 映射文件(Mapping项目)
4.1 代码:
<?xml version="1.0" encoding="utf-8"?><hibernate-mappingxmlns="urn:nhibernate-mapping-2.2"assembly="Model"auto-import="true"default-cascade="all"default-lazy="true"namespace="Model"><!--<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="实体类所在的程序集" auto-import="是否自动导入命名空间,如果否,下面类名应该写类的全名"
default-cascade="默认的级联操作" default-lazy="是否延迟加载" namespace="实体类所在的命名空间">--><!--<class name="类型名/类型全名" table="对应的表名" >--><classname="Customer"table="Customer"><!--id是必须的--><!--<id name="Id的属性名" column="列名" type="数据类型" unsaved-value="未被持久化到数据库时,id的值" generator="id的生成策略"></id>--><idname="Id"column="CustomerId"type="int"unsaved-value="0"generator="native"></id><!--<property name="属性名" column="对应的列名" length="长度" type="数据类型" not-null="是否不可空"></property>--><propertyname="Name"column="Name"length="20"type="string"not-null="true"></property><propertyname="UserName"><columnname="UserName"sql-type="nvarchar"not-null="true"length="20"></column></property><propertyname="Password"length="32"column="Password"not-null="true"type="string"></property><propertyname="CreateTime"column="CreateTime"type="datetime"not-null="true"></property></class></hibernate-mapping>
注意:
1.映射文件命名规则: 类名.hbm.xml ,不可随意更改
2.映射文件的生成策略必须为:嵌入到程序集
第五步:创建数据库和表
5.1 创建数据库
CREATEDATABASEXShopDbGO
5.2 创建表
5.2.1创建表的两种方式--手动创建
注意:创建的表结构应该与映射文件一样
5.2.1创建表的两种方式--使用SchemaExport生成的Sql
代码:可以创建一个控制台项目或Winform项目跑下面这段代码
NHibernate.Cfg.Configuration configuration =newNHibernate.Cfg.Configuration().Configure();
NHibernate.Tool.hbm2ddl.SchemaExport schemaExport=newNHibernate.Tool.hbm2ddl.SchemaExport(configuration);//打印Sql脚本,但不执行schemaExport.Create(true,false);//导出到文件//schemaExport.SetOutputFile(@"c:/schma.sql");
结果:
第六步:CURD操作(Data项目)
6.1 上面我们提过,所有数据库操作都是通过ISession对象操作,而ISession可以通过ISessionFactory创建
-----创建HbmHelper类--获取ISessionFactory
namespaceData
{publicclassHbmHelper
{privatestaticISessionFactory _sessionFactory;publicstaticISessionFactory CurrentSessionFactory
{get{if(_sessionFactory ==null)
{//创建SessionFactory_sessionFactory =newConfiguration().Configure().BuildSessionFactory();
}return_sessionFactory;
}
}
}
}
-------从ISessionFactory中创建session
privateISession _session = HbmHelper.CurrentSessionFactory.OpenSession();
------添加数据访问基类 BaseDal<T>
namespaceData
{///<summary>///数据访问基类///</summary>///<typeparam name="T"></typeparam>publicclassBaseDal<T>whereT :class{//从ISessionFactory中创建sessionprivateISession _session =HbmHelper.CurrentSessionFactory.OpenSession();#region------------------ CURD ----------------///<summary>///添加数据///</summary>///<param name="model"></param>publicintInsert(T model)
{intid=(int) _session.Save(model);
_session.Flush();returnid;
}///<summary>///更新///</summary>///<param name="model"></param>publicvoidUpdate(T model)
{//使用事务using(ITransaction ts =_session.BeginTransaction())
{try{
_session.Update(model);
_session.Flush();
ts.Commit();
}catch(Exception)
{
ts.Rollback();throw;
}
}
}///<summary>///删除///</summary>///<param name="model"></param>publicvoidDelete(T model)
{
_session.Delete(model);
_session.Flush();
}///<summary>///查询///</summary>///<param name="id"></param>///<returns></returns>publicT Query(intid)
{return_session.Get<T>(id);
}#endregion}
}
第七步:添加数据,测试
7.1 添加数据
7.2 创建单元测试项目,添加测试类:
namespaceDataTest
{
[TestClass]publicclassBaseDalTest
{privateBaseDal<Customer> _customerDal =newBaseDal<Customer>();
[TestMethod]publicvoidGetTest()
{varresult = _customerDal.Query(1);
Assert.AreEqual(result.Name,"张小军");
}
[TestMethod]publicvoidInsertTest()
{
Customer customer=newCustomer()
{
Name="张三",
Password="654321",
UserName="zhs"};intid =_customerDal.Insert(customer);varresult =_customerDal.Query(id);
Assert.AreEqual(customer.UserName, result.UserName);
}
[TestMethod]publicvoidUpdateTest()
{varresult = _customerDal.Query(1);
result.Name="王五";
_customerDal.Update(result);varr2 = _customerDal.Query(1);
Assert.AreEqual(result.Name,r2.Name);
}
[TestMethod]publicvoidDelTest()
{varresult = _customerDal.Query(1);
_customerDal.Delete(result);varr2 = _customerDal.Query(1);
Assert.IsNotNull(r2);
}
}
}
代码:http://files.cnblogs.com/files/zhxj/XShop0822.zip原创文章,转载请注明出处:http://www.cnblogs.com/zhxj/
2015.08.22 --张小军