一步步学习NHibernate(3)——NHibernate增删改查
请注明转载地址:http://www.cnblogs.com/arhat
在上一章中,我们配置了以下NHibernate的运行环境, 并介绍了NHibernate的中两个非常中重要的接口”ISessionFactory”和”ISession”。那么今天我们将主要学习一下NHibernate是如何通过配置文件来操作数据库的。
重新打开我们的项目“NHibernateStudy”。然后在通过MySql来创建School的一张表“Student”。SQL脚本如下:

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

由于在数据库中,我们有了一张表,那么我们在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是找不到这个文件的。

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

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

下面呢,我们来试着向数据库中插入一条记录,看是否能够成功。在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语句。

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

的确,在数据库中我们添加了一条数据。现在我们把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("");
        }运行一下看看结果:
  
我们已经正确的得到了结果。那么这只是得到一条记录,如果是多条的话,老魏会在后面的章节中讲述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);
            }
        }
运行一下,看看结果:

数据库查询结果:

我们会发现,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);
            }
        }运行结果如下:

数据库查询结果如下:

到此为止,ISession提供的Save,Update,Delete,Get方法就给大家讲述到此了,其中在使用Update,Delete的时候要注意使用事务。
一步步学习NHibernate(3)——NHibernate增删改查的更多相关文章
- python学习之-成员信息增删改查
		python学习之-成员信息增删改查 主要实现了成员信息的增加,修改,查询,和删除功能,写着玩玩,在写的过程中,遇到的问题,旧新成员信息数据的合并,手机号和邮箱的验证,#!/usr/bin/env p ... 
- EF学习笔记-1 EF增删改查
		首次接触Entity FrameWork,就感觉非常棒.它节省了我们以前写SQL语句的过程,同时也让我们更加的理解面向对象的编程思想.最近学习了EF的增删改查的过程,下面给大家分享使用EF对增删改查时 ... 
- JDBC基础学习(一)—JDBC的增删改查
		一.数据的持久化 持久化(persistence): 把数据保存到可掉电式存储设备中以供之后使用.大多数情况下,数据持久化意味着将内存中的数据保存到硬盘上加以固化,而持久化的实现过程大多通过各 ... 
- mybatis学习(五)——增删改查及自增主键的获取
		一.mybatis的增删改查 1.修改hotelMapper接口 package com.pjf.mybatis.dao; import com.pjf.mybatis.po.Hotel; publi ... 
- MVC学习-用EF做增删改查
		在做增删改查先,先介绍几个知识点: 1.代理类 在将对象方法EF数据上下文时,EF会为该对象封装 一个代理类对象, 同时为该对象的每一个属性添加一个标志:unchanged, 当对该对象某个属性进行操 ... 
- python基础学习之类的属性 增删改查
		类中的属性如何在类外部使用代码进行增删改查呢 增加.改变: setattr内置函数以及 __setattr__魔法方法 class A: aaa = '疏楼龙宿' a = A() setattr(a, ... 
- TP5学习基础一:增删改查小demo
		①TP5--增删改查简单的demo 我先吐槽一下:因为工作需要研究tp5,去官网看了一下哎呦,资源挺多挺全啊!然后下载唯一免费的官方教程,我曹pdf打开533页.讲的很细但是开发能等看完才做吗?看到精 ... 
- Nhibernate基本的增删改查实践
		1.链接配置 <?xml version="1.0" encoding="utf-8" ?> <hibernate-configuration ... 
- oracle 10g 学习之数据进行增删改查、数据库事务、约束(8)
		目标 通过本章学习,您将可以: l 使用 DML 语句 l 向表中插入数据 l 更新表中数据 l 从表中删除数据 l 控制事务 l 描述约束 l 创建和维护约束 数据控制语言 l ... 
- MongoDB学习day04--NodeJs操作数据库增删改查
		一.在Nodejs中使用Mongodb Nodejs需要引入的包 npm install mongodb --save -dev 或者使用镜像 cnpm install mongodb --save ... 
随机推荐
- [转]Oracle Stored Procedures Hello World Examples
			本文转自:http://www.mkyong.com/oracle/oracle-stored-procedures-hello-world-examples/ List of quick examp ... 
- 简单学JAVA之---接口的定义与实现
			为了巩固自己学习的知识,可能会对自己以后所学的知识做一个小结,今天就来一篇接口的定义与实现. 在java中,我们可以通过继承得到另一个类中的方法,但是这个仅仅满足继承一个方法,那有办法可以多个继承不, ... 
- C#下解决DrawImage画出来的Image变大了的问题
			如: private Image image= Resources.image1;//假设image1这张资源图是360×600这么大 private Graphics graphics; graph ... 
- html同一个页面多个倒计时
			<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head ... 
- OpenWebFlow0.9用户手册与设计说明
			1. OpenWebFlow概述 OpenWebFlow是基于Activiti扩展的工作流引擎.Activiti (官方网站http://activiti.org/,代码托管在https://g ... 
- c#中字符串显示上标和下标解决办法
			由于工作的需求,需要在word中插入带入带有上标和下标的字符串,比如这样的一个字符串:SO₄²⁻(mg/L).在网上搜了好久,终是摸索出点思路. 解决办法:使用转义字符加Unicode的HexEnti ... 
- Java 简单算法--打印乘法口诀(只使用一次循环)
			package cn.magicdu.algorithm; /** * 九九乘法口诀表 * * @author xiaoduc * */ public class NineNineMulitTable ... 
- Exam 70-462 Administering Microsoft SQL Server 2012 Databases 复习帖
			好吧最近堕落没怎么看书,估计这个月前是考不过了,还是拖到国庆之后考试吧.想着自己复习考试顺便也写点自己的复习的概要,这样一方面的给不准备背题库的童鞋有简便的复习方法(好吧不被题库的同学和我一样看MSD ... 
- Sublime Text2上搭建C/C++环境
			环境:Sublime Text2 win7 64位 1.下载Sublime Text2并安装 下载地址:http://www.sublimetext.com/ 2.需要用 ... 
- Web应用程序安全必须重视八大问题
			摘自:http://netsecurity.51cto.com/art/201402/428709.htm 对于任何一个项目,开始阶段对于交付安全的应用来说非常关键.适当的安全要求会导致正确的安全设计 ... 
