zoukankan      html  css  js  c++  java
  • NHibernate使用--进阶篇

    上集我们说的搭建NHibernate和VS使用环境,判断环境是否兼容问题 下面我们就开始NHibernate的使用:

    1.0  引用

      TestNHibernate.Data 层引用 Iesi.Collections.dll、NHibernate.dll、TestNHibernate.Domain.dll

      TestNHibernate.Domain层引用 Iesi.Collections.dll、NHibernate.dll

      TestNHibernate.Text层引用 NHibernate.dll、Iesi.Collections.dll、NHibernate.ByteCode.LinFu.dll,以及TestNHibernate.Data、TestNHibernate.Domain(检测即可,在上一集中已经引用过了)

    2.0  使用

      在TestNHibernate.Domain类库下新建两个文件夹Entitys和Mappings--Entitys:存放实体类  Mappings: 存放与数据库表的映射配置文件 一般以.hbm.xml结尾,在这个过程中可以使用网上的一些工具,稍后本人使用过后再给大家推荐,现在我还是手写。

      我的数据库中有一张部门表Departments  有字段 Dept_id(部门编号 主键)  Dept_Name(部门名称)  DeptFath_id(父级部门),所以在Entitys文件夹下创建相应的类,

    这里为了体现NHibernate配置文件,所以命名上可能需要和数据库有点儿差异,特别的在NHibernate中为了方便映射,强制规定属性必须用 virtual 关键字修饰

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace TestNHibernate.Domain.Entitys
    {
        public class MyDepartments
        {
            /// <summary>
            /// 部门编号
            /// </summary>
            public virtual int MyDept_id { get; set; }
    
            /// <summary>
            /// 部门名称
            /// </summary>
            public virtual string MyDept_Name { get; set; }
    
    
            /// <summary>
            /// 父级部门
            /// </summary>
            public virtual int MyDeptFath_id { get; set; }
        }
    }
    创建类MyDepartments

    下面我们再来配置类MyDepartments的映射文件  在 文件夹Mappings下创建一个XML文档 MyDepartments.hbm.xml,映射文件命名一般类名+.hbm.xml

    <?xml version="1.0" encoding="utf-8" ?> 
    生成的xml

    下面我们来配置它

    <?xml version="1.0" encoding="utf-8" ?>
    <!--assembly 必选属性当前映射文件所在程序集--><!-- namespace 当前映射的类所在的命名空间-->
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="TestNHibernate.Domain" namespace="TestNHibernate.Domain.Entitys">
      <!--开始配置一个类的映射  首先通过name指定要映射的类   table指的对应数据库中的表的表名-->
      <class name ="TestNHibernate.Domain.Entitys.MyDepartments" table="Departments">
        <!--配置相应属性 id节点标识主键  name属性指类中的属性名称 column属性指数据库对应表中的对应字段 type 可以指定类型 我们这里设置int-->
        <!--我程序运行时错误最后发现 如果和数据库字段 表明不一致时需要指定类型-->
        <id name="MyDept_id" column ="Dept_id" type="int"><!--type="int"-->
          <!--generator 指定主键生成的方式 这里我们使用自动代理 class ="native" 也就是从数据库中获取-->
          <generator class ="native"/>
        </id>
        <!--配置普通属性使用 property节点 name属性指类中的属性名称 column属性指数据库对应表中的对应字段 type 可以指定类型 我们这里设置string-->
        <property name ="MyDept_Name" column="Dept_Name" type="string"/>
        <!--配置普通属性使用 property节点 name属性指类中的属性名称 column属性指数据库对应表中的对应字段 type 可以指定类型 我们这里设置int-->
        <property name ="MyDeptFath_id" column="DeptFath_id" type="int"/>
      </class>
    </hibernate-mapping>
    配置后的MyDepartments.hbm.xml

    注意:要想使得NHibernate可以映射文件成功 我们这里必须将XML的属性中的内容修改为嵌入的资源  右键 MyDepartments.hbm.xml属性--内容--嵌入的资源

    EG:下面为了更好的进行,我们来普及一些概念

    NHibernate   是一个面向.NET环境的对象/关系数据库映射工具 ,通过对Configuration().Configure()的调用来装载配置文件,并初始化成一个Configuration实例(连接对象);通过Configuration实例创建一个ISessionFactory(ISessionFactory代表一个数据库,并且使用一个XML配置文件(Web.config或者hibernate.cfg.xml)并由ISessionFactory生成ISession,我们对于数据库的操作都是通过ISession(单线程)并且在ISession中页封存了事务机制的ITransaction对象,每次请求都会产生一个ISession,请求结束时ISession被释放;

    继续:

    我们在TestNHibernate.Data类库中创建NHibernateHelper帮助类和NHibernateSample操作类,NHibernateHelper帮助类 帮助我们通过Configuration()、ISessionFactory、等对象,生成我们需要的ISession,而NHibernateSample类则封装我们对于数据表的操作(增删查改)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using NHibernate;
    using NHibernate.Cfg;
    namespace TestNHibernate.Data
    {
        /// <summary>
        ///  NHibernate帮助类
        /// </summary>
        public class NHibernateHelper
        {
            //创建一个SessionFactory变量 (因为还没有赋值 这里只能说是一个变量而不是对象)
            private ISessionFactory _sessionFactory;
            //在NHibernate帮助类的构造函数中对象变量赋值
            public NHibernateHelper()
            {
                _sessionFactory = GetSessionFactory();
            }
            private ISessionFactory GetSessionFactory()
            {
                //返回一个SessionFactory对象  从配置文件对象Configuration中生成
                return (new Configuration()).Configure().BuildSessionFactory();
            }
            //获取一个单独的Session
            public ISession GetSession()
            {
                //返回一个Session对象
                return _sessionFactory.OpenSession();
            }
        }
    }
    NHibernateHelper帮助类
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using NHibernate;
    using TestNHibernate.Domain.Entitys;
    namespace TestNHibernate.Data
    {
        /// <summary>
        /// NHibernateSample操作类
        /// </summary>
        public class NHibernateSample
        {
    
            protected ISession Session { get; set; }
            public NHibernateSample(ISession session)
            {
                Session = session;
            }
    
            public void NHibernateCloseSession()
            {
                Session.Clear();
            }
    
            public NHibernateSample()
            {
                // TODO: Complete member initialization
            }
            /// <summary>
            /// 创建一个对象
            /// </summary>
            /// <param name="customer"></param>
            public void CreateCustomer(MyDepartments customer)
            {
                Session.Save(customer);
                Session.Flush();
            }
    
            /// <summary>
            /// 修改一个对象
            /// </summary>
            /// <param name="customer"></param>
            public void UpdateCustomer(MyDepartments customer)
            {
                Session.Update(customer);
                Session.Flush();
            }
    
    
            /// <summary>
            /// 根据编号查询数据
            /// </summary>
            /// <param name="customerId"></param>
            /// <returns></returns>
            public MyDepartments GetCustomerById(int customerId)
            {
                return Session.Get<MyDepartments>(customerId);
            }
    
            /// <summary>
            /// 查询所有数据
            /// </summary>
            /// <returns></returns>
            public IList<MyDepartments> GetCustomers()
            {
                return Session.QueryOver<MyDepartments>().List();
            }
        }
    }
    NHibernateSample操作类

    好了 !! 现在我们的程序环境已经准备完毕了,那么让我们快开始运行吧。。

    我们回到TestNHibernate.Test控制台程序 :

    首先完成查询功能 (在这里运行如果报错为下图,则说明当前NHibernate版本和数据库不兼容,需要更换数据库或者是NHibernate版本,这个在之前环境部署中提到过,但是在前面判断不了,希望如果有知道的朋友可以告诉下怎么样提前判断!!)

     

    //创建一个操作类对象  这里还记得嘛?我们在NHibernateSample操作类的构造函数中声明了一个ISession的参数 这里我们调用帮助类的GetSession()方法返回一个ISession
                NHibernateSample _sample = new NHibernateSample(new NHibernateHelper().GetSession());
    
                //循环打印部门信息列表  这个使用了纳姆纳表达式 不知道会不会不好理解  就是简单的使用方法将这个集合排序了
                foreach (var item in _sample.GetCustomers().OrderBy(d=>d.MyDept_id))
                {
                    Console.WriteLine("部门编号:"+item.MyDept_id+";部门名称:"+item.MyDept_Name);
                }
    查询
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using TestNHibernate.Data;
    using TestNHibernate.Domain.Entitys;
    
    namespace TestNHibernate.Test
    
    {
        class Program
        {
            static void Main(string[] args)
            {
                //创建一个操作类对象  这里还记得嘛?我们在NHibernateSample操作类的构造函数中声明了一个ISession的参数 这里我们调用帮助类的GetSession()方法返回一个ISession
                NHibernateSample _sample = new NHibernateSample(new NHibernateHelper().GetSession());
                
                //创建部门类  通过部门编号查询出部门信息
                MyDepartments dept = _sample.GetCustomerById(1);
                //打印部门信息
                Console.WriteLine("部门编号:" + dept.MyDept_id + ";部门名称:" + dept.MyDept_Name);
         }
        }
    }
        
    通过编号查询
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using TestNHibernate.Data;
    using TestNHibernate.Domain.Entitys;
    
    namespace TestNHibernate.Test
    
    {
        class Program
        {
            static void Main(string[] args)
            {
                //创建一个操作类对象  这里还记得嘛?我们在NHibernateSample操作类的构造函数中声明了一个ISession的参数 这里我们调用帮助类的GetSession()方法返回一个ISession
                NHibernateSample _sample = new NHibernateSample(new NHibernateHelper().GetSession());
    
                //创建一条部门信息
                MyDepartments dept = new MyDepartments() { MyDept_Name ="我的部门信息", MyDeptFath_id = 1 };
    
                //添加到数据库中
                _sample.CreateCustomer(dept);
    
                //获取所有部门信息  使用纳姆纳表达式查看是否含有新添加的信息
                MyDepartments dept1  = _sample.GetCustomers().First(d => d.MyDept_Name == "我的部门信息");
    
                //打印
                Console.WriteLine("部门编号:" + dept.MyDept_id + ";部门名称:" + dept.MyDept_Name);
    
    
                            
            }
        }
    }
    添加一条数据
    修改

    本人亲测代码 运行无误,

  • 相关阅读:
    Linux基础(Ubuntu16.04):安装vim及配置
    Ubuntu16.04 安装ROS及其IDE
    python格式转换的记录
    python爬虫selenium相关
    【LAMP】搭建Web网站过程中的记录【Ubuntu18.04+Apache2.4+PHP7.2+MySQL5.7】
    【疯狂挖坑】linux服务器尝试中的问题(nohup等)
    逻辑回归与全连接神经网络联系的简单理解记录
    Unity3d开发中遇到的问题记录
    python中numpy库的一些使用
    Deep Learning论文翻译(Nature Deep Review)
  • 原文地址:https://www.cnblogs.com/huanjinyuan/p/8037467.html
Copyright © 2011-2022 走看看