• 通俗易懂的Nhibernate教程(1) ----- 基本操作,映射,CURD


    网站架构:

    1.图片

    image_thumb3

    2.说明

    Data  -----------------------   类库项目,数据访问层,由Nhibernate提供数据相关操作

    Mapping -------------------    类库项目,映射文件都在这个项目中

    Model   --------------------    类型项目,实体层

    XShop  --------------------     Mvc项目,UI层

    步骤:

    1.安装Nhibernate

    2.配置Nhibernate

    3.创建实体类

    4.编写映射文件

    5.创建数据库/表

    6.CURD操作

    7.测试

    第一步:安装Nhibernate,这一步就不用说了,使用Nuget安装,看图

    image_thumb11

    第二步:配置Nhibernate

    2.1 这一步主要是一些系统级的配置,如:连接字符串,数据库驱动,数据库方言等

    2.2 创建 hibernate.cfg.xml文件(XShop项目中)

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
      <!--Nhibernate对数据库操作是基于ISession(会话),可以理解为SqlConnection的封装,可通过SessionFactory创建-->
      <session-factory name="XShop">
        <!--连接提供程序-->
        <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
        
        <!--连接字符串-->
        <property name="connection.connection_string">
          Server=.;initial catalog=XShopDb;Integrated Security=SSPI
        </property>
        
        <!--Nhibernate是一个支持多个数据库的Orm框架,然而几乎每个数据库产品都对Sql的实现都有所不同-->
        <!--Nhibernate通过dialect(方言)消除数据库之间的差异-->
        <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
        
        <!--是否在调试的时候打印Sql语句-->
        <property name="show_sql">true</property>
        
        <!--映射文件所在的程序集-->
        <mapping assembly="Mapping"/>
      </session-factory>
    </hibernate-configuration>

    温馨提示:如果发现在编写xml文件的时候发现没有智能提示,请把Nhibernate包的xsd文件复制到Vs安装目录中(参考百度)

    注意:Nhibernate配置文件的文件名必须为 hibernate.cfg.xml ,不可随意更改

    第三步:创建实体类 Customer(Model项目)

    3.1 代码

    namespace Model
    {
        public class Customer
        {
            public virtual int Id { get; set; }
            public virtual string Name { get; set; }
            public virtual string UserName { get; set; }
            public virtual string Password { get; set; }
            public virtual DateTime CreateTime { get; set; }
        }
    }

    注意:实体类的属性必须是virtual,否则Nhibernate会报错.why?因为这样Nhibernate就可以重写这些属性的访问逻辑,比如 延迟加载..

    第四步:创建 Customer.hbm.xml 映射文件(Mapping项目)

    4.1 代码:

    <?xml version="1.0" encoding="utf-8" ?>
    
    <hibernate-mapping xmlns="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="对应的表名" >-->
      <class name="Customer" table="Customer" >
        
        <!--id是必须的-->
        <!--<id name="Id的属性名" column="列名" type="数据类型" unsaved-value="未被持久化到数据库时,id的值" generator="id的生成策略"></id>-->
        <id name="Id" column="CustomerId" type="int" unsaved-value="0" generator="native"></id>
        
        <!--<property name="属性名" column="对应的列名" length="长度" type="数据类型" not-null="是否不可空"></property>-->
        <property name="Name" column="Name" length="20" type="string" not-null="true"></property>
        <property name="UserName">
          <column  name="UserName" sql-type="nvarchar" not-null="true" length="20"></column>
        </property>
        
        <property name="Password" length="32" column="Password" not-null="true" type="string"></property>
        <property name="CreateTime" column="CreateTime" type="datetime" not-null="true"></property>
      </class>
    </hibernate-mapping>

    注意:

    1.映射文件命名规则:  类名.hbm.xml  ,不可随意更改

    2.映射文件的生成策略必须为:嵌入到程序集

    第五步:创建数据库和表

    5.1 创建数据库

    CREATE DATABASE XShopDb
    GO

    5.2  创建表

       5.2.1创建表的两种方式--手动创建

        注意:创建的表结构应该与映射文件一样

        5.2.1创建表的两种方式--使用SchemaExport生成的Sql

        代码:可以创建一个控制台项目或Winform项目跑下面这段代码

    NHibernate.Cfg.Configuration configuration = new NHibernate.Cfg.Configuration().Configure();
    NHibernate.Tool.hbm2ddl.SchemaExport schemaExport = new NHibernate.Tool.hbm2ddl.SchemaExport(configuration);
    //打印Sql脚本,但不执行
     schemaExport.Create(true, false);
    
     //导出到文件
    //schemaExport.SetOutputFile(@"c:/schma.sql");

           结果:

            image_thumb5

    第六步:CURD操作(Data项目)

    6.1 上面我们提过,所有数据库操作都是通过ISession对象操作,而ISession可以通过ISessionFactory创建

    -----创建HbmHelper类--获取ISessionFactory

    namespace Data
    {
        public class HbmHelper
        {
            private static ISessionFactory _sessionFactory;
            public static ISessionFactory CurrentSessionFactory
            {
                get
                {
                    if (_sessionFactory == null)
                    {
                        //创建SessionFactory
                        _sessionFactory = new Configuration().Configure().BuildSessionFactory(); 
                    }
                    return _sessionFactory;
                }
            }
        }
    }

    -------从ISessionFactory中创建session

    private ISession _session = HbmHelper.CurrentSessionFactory.OpenSession();

    ------添加数据访问基类 BaseDal<T>

    namespace Data
    {
        /// <summary>
        /// 数据访问基类
        /// </summary>
        /// <typeparam name="T"></typeparam>
        public class BaseDal<T> where T : class
        {
            //从ISessionFactory中创建session
            private ISession _session = HbmHelper.CurrentSessionFactory.OpenSession();
    
            #region ------------------   CURD    ----------------
            /// <summary>
            /// 添加数据
            /// </summary>
            /// <param name="model"></param>
            public int Insert(T model)
            {
    
               int id=(int) _session.Save(model);
                _session.Flush();
                return id;
    
            }
    
            /// <summary>
            /// 更新
            /// </summary>
            /// <param name="model"></param>
            public void Update(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>
            public void Delete(T model)
            {
                _session.Delete(model);
                _session.Flush();
            }
    
            /// <summary>
            /// 查询
            /// </summary>
            /// <param name="id"></param>
            /// <returns></returns>
            public T Query(int id)
            {
                return _session.Get<T>(id);
            }
            
            #endregion
        }
    }

    第七步:添加数据,测试

    7.1 添加数据

    image_thumb1

    7.2 创建单元测试项目,添加测试类:

    namespace DataTest
    {
        [TestClass]
        public class BaseDalTest
        {
            private BaseDal<Customer> _customerDal = new BaseDal<Customer>();
    
            [TestMethod]
            public void GetTest()
            {
                var result = _customerDal.Query(1);
                Assert.AreEqual(result.Name, "张小军");
            }
    
            [TestMethod]
            public void InsertTest()
            {
                Customer customer = new Customer()
                {
                    Name = "张三",
                    Password = "654321",
                    UserName = "zhs"
                };
    
                int id = _customerDal.Insert(customer);
    
                var result = _customerDal.Query(id);
                Assert.AreEqual(customer.UserName, result.UserName);
    
            }
    
            [TestMethod]
            public void UpdateTest()
            {
                var result = _customerDal.Query(1);
                result.Name = "王五";
                _customerDal.Update(result);
                var r2 = _customerDal.Query(1);
                Assert.AreEqual(result.Name,r2.Name);
            }
    
            [TestMethod]
            public void DelTest()
            {
                var result = _customerDal.Query(1);
                _customerDal.Delete(result);
                var r2 = _customerDal.Query(1);
                Assert.IsNotNull(r2);
            }
        }
    }
    代码:https://files.cnblogs.com/files/zhxj/XShop0822.zip

    原创文章,转载请注明出处:http://www.cnblogs.com/zhxj/      

     

     

    2015.08.22 --张小军

  • 相关阅读:
    Java基础学习笔记十二 类、抽象类、接口作为方法参数和返回值以及常用API
    Java基础学习笔记十四 常用API之基本类型包装类
    Java基础学习笔记六 Java基础语法之类和ArrayList
    Java基础学习笔记七 Java基础语法之继承和抽象类
    Java基础学习笔记八 Java基础语法之接口和多态
    Java基础学习笔记九 Java基础语法之this和super
    Java基础学习笔记十 Java基础语法之final、static、匿名对象、内部类
    Java基础学习笔记三 Java基础语法
    ssrs 里 表头 分页后显示
    CentOS 部署RabbitMQ集群
  • 原文地址:https://www.cnblogs.com/zhxj/p/4751256.html
Copyright © 2020-2023  润新知