• 一步步学习NHibernate(3)——NHibernate增删改查


    请注明转载地址:http://www.cnblogs.com/arhat

    在上一章中,我们配置了以下NHibernate的运行环境, 并介绍了NHibernate的中两个非常中重要的接口”ISessionFactory”和”ISession”。那么今天我们将主要学习一下NHibernate是如何通过配置文件来操作数据库的。

    重新打开我们的项目“NHibernateStudy”。然后在通过MySql来创建School的一张表“Student”。SQL脚本如下:

    wps_clip_image-21991

    然后在NHibernateStudy解决方案中我们创建一个Model的类库。同时对DAL,NHibernateTest对Model的引用。在Model中创建一个Config文件夹用来存放映射文件。

    wps_clip_image-17153

    由于在数据库中,我们有了一张表,那么我们在DAL中创建一个实体类为Student.cs建议大家在创建这个实体类的时候名字和数据库表的名字一样,这样好对应。当我们创建好Student.cs类的时候,我们的目的就是让这个实体类和数据库表Student对应起来。Student.cs的内容如下:

    public class Student
        {
    public virtual int SId { get; set; }
    public virtual string SName { get; set; }
    public virtual string SSex { get;get; }
    public virtual DateTime SBirthday{get;set;}
        }

        大家需要注意的地方是,平时我们在定义实体类的时候并没有对其属性设置virtual属性,但是如果我们使用NHibernate的时候,NHibernate要求我们的实体类必须是virtual的。

    下面是比较重要的内容,我们现在就要创建一个映射文件,用来把实体类和数据库表进行一个关联。在Config下创建一个Student.hbm.xml文件。内容如下:

    <?xml version="1.0" encoding="utf-8" ?>
    
    <hibernate-mapping assembly="Model" namespace="Model" xmlns="urn:nhibernate-mapping-2.2">
    
        <class name="Student" table="Student">
    
            <id name="SId" type="int">
    
                <column name="sid"></column>
    
                <generator class="native"></generator>
    
            </id>
    
            <property name="SName" type="string">
    
                <column name="sname"/>
    
            </property>
    
            <property name="SSex" type="string">
    
                <column name="ssex"/>
    
            </property>
    
            <property name="SBirthday" type="DateTime">
    
                <column name="sbirthday"/>
    
            </property>        
    
        </class>
    
    </hibernate-mapping>

         这个文件就是一个映射文件,把Student类和Student表对应起来了,但是在写这个文件的时候,需要注意的是:

    hibernate-mapping节点中的assembly是设置程序级的名称,namespace是实体类的命名空间。
        class节点是要对应那个类,其中name属性的值是“类名”,table属性是指这个类要对应数据库的那个表。
         id节点是非常重要的,它关乎了表中主键和对象之间的关系,name是对象的属性名,column设置对应表中的那个主键,generator 是设置这个主键的生成方式是什么,这里是native使用本地的策略(MySQL中,主键是auto_increment)。
          property节点是用来设置对象属性和表字段的对应关系,name是对象的属性名,column是表的字段名。这里一定注意一一对应。
          然后选中这个xml文件,把他的属性设置为“嵌入的资源”,这里非常的重要,否则NHibernate是找不到这个文件的。
    wps_clip_image-31139

          然后,我们打开App.config文件,加入一个节点,让NHibernate能够找到这个映射文件。

    wps_clip_image-32544

          mapping节点就用来设置从哪读取映射五年,assembly是设置从哪个程序集中读取文件。由于我们的映射文件是在Model中,所以这里设置为Model。注意程序集和命名空间不同。

    wps_clip_image-18672
          下面呢,我们来试着向数据库中插入一条记录,看是否能够成功。在DAL中我们新建一个类“D_User”,内容如下:

    public class D_User
    
        {
    
    public void Add(Model.Student student) 
    
            {
    
    using (ISession session = NHibernateHelper.OpenSession()) 
    
                {
    
    //保存一条记录
    
                    session.Save(student);
    
                }
    
            }
    
    }

    然后,我们在NHibernateTest主项目中创建D_User对象,并调用Add方法执行。

    static void Main(string[] args)
    
            {
    
                TestSave();
    
            }
    
    public static void TestSave()
    
            {
    
                DAL.D_User dal = new DAL.D_User();
    
                dal.Add(new Model.Student { SName="大话济公",SSex="",SBirthday=DateTime.Now});
    
            }

    Ctrl+F5来运行一下,发现打开的DOS窗口中打印出了NHibernate生成的SQL语句。

    wps_clip_image-6490

    然后我们查看一下数据库时候多了一条数据,

    wps_clip_image-10366

    的确,在数据库中我们添加了一条数据。现在我们把ISession常用的方法给用一下,上面我们使用的是Save方法,用来保存对象的,现在我们来查询一条数据。更改D_User代码如下:

    public Model.Student GetUser(int id) 
    
            {
    
    using (ISession session = NHibernateHelper.OpenSession())
    
                {
    
    return session.Get<Model.Student>(id);
    
                }
    
            }

    在主程序中改写代码:

    static void Main(string[] args)
    
            {
    
                TestGet();
    
            }
    
    public static void TestGet() 
    
            {
    
                DAL.D_User dal = new DAL.D_User();
    
                Model.Student student = dal.GetUser(1);
    
    Console.WriteLine("");
    
    Console.WriteLine("Student ,Id:"+student.SId+",Name:" + student.SName + ",Sex:" + student.SSex + ",Birthday:" + student.SBirthday);
    
    Console.WriteLine("");
    
            }

    运行一下看看结果:
    wps_clip_image-7194

    我们已经正确的得到了结果。那么这只是得到一条记录,如果是多条的话,老魏会在后面的章节中讲述IQuery接口和HQL语句。
        下面,我们看一下更新是怎么实现的。还是首先更改一下D_User的代码:

    public void EditUser(Model.Student student)
    
            {
    
    using (ISession session = NHibernateHelper.OpenSession())
    
                {
    
    using (ITransaction trans = session.BeginTransaction())
    
                    {
    
    try
    
                        {
    
                            session.Update(student);
    
                            trans.Commit();
    
                        }
    
    catch (Exception ex)
    
                        {
    
    throw new Exception("更新数据异常信息:" + ex.Message);
    
                        }
    
    finally
    
                        {
    
                            trans.Rollback();
    
                        }
    
                    }
    
                }
    
            }

    从上面的代码中,我们看到了,在更新数据的时候,NHibernate要求我们必须使用事务,所以我们使用了ITransaction来提交事务和回滚事务。

    然后我们更改一下主程序代码:

    static void Main(string[] args)
    
            {
    
                TestUpdate();
    
            }
    
    public static void TestUpdate() 
    
            {
    
                DAL.D_User dal = new DAL.D_User();
    
                Model.Student student = dal.GetUser(1);
    
                student.SName = "剂颠长老";
    
    try
    
                {
    
                    dal.EditUser(student);
    
                }
    
    catch (Exception ex) 
    
                {
    
    Console.WriteLine(ex.Message);
    
                }
    
            }

    运行一下,看看结果:

    wps_clip_image-14240

    数据库查询结果:

    wps_clip_image-13745

    我们会发现,NHibernate提交了两个SQL语句,一个是用来得到数据的,一个是更新数据的。到现在位置,我们会得到数据,更新数据,插入数据了,现在就掉一个删除数据了,我们来看看如何删除数据的。同理,更新一下D_User

    public void DeleteUser(Model.Student student) 
    
            {
    
    using (ISession session = NHibernateHelper.OpenSession())
    
                {
    
    using (ITransaction trans = session.BeginTransaction())
    
                    {
    
    try
    
                        {
    
                            session.Delete(student);
    
                            trans.Commit();
    
                        }
    
    catch (Exception ex)
    
                        {
    
    throw new Exception("更新数据异常信息:" + ex.Message);
    
                            trans.Rollback();
    
                        }
    
    finally
    
                        {
    
                        }
    
                    }
    
                }
    
            }

    同理,在删除数据的时候,也是要使用事务的。主程序代码:

    static void Main(string[] args)
    
            {
    
                TestDelete(); 
    
            }
    
    public static void TestDelete() 
    
            {
    
                DAL.D_User dal = new DAL.D_User();
    
                Model.Student student = dal.GetUser(1);
    
    try
    
                {
    
                    dal.DeleteUser(student);
    
                }
    
    catch (Exception ex)
    
                {
    
    Console.WriteLine(ex.Message);
    
                }
    
            }

    运行结果如下:

    wps_clip_image-28289

    数据库查询结果如下:

    wps_clip_image-31802

    到此为止,ISession提供的Save,Update,Delete,Get方法就给大家讲述到此了,其中在使用Update,Delete的时候要注意使用事务。

  • 相关阅读:
    基础GIT命令
    初始继承和多态。
    Servlet随笔
    初识springboot
    HBase JavaAPI
    HBase安装
    使用Eclipse来操作HDFS的文件
    hadoop常用命令
    Eclipse集成Hadoop插件
    Hadoop集群测试wordcount程序
  • 原文地址:https://www.cnblogs.com/arhat/p/3567524.html
Copyright © 2020-2023  润新知