1.本次所有代码是在一下环境下运行的

学习系统:win8 64bit
开发环境:VS2013,MSSQL2012
NHibernate版本:NHibernate-4.0.3.GA 【文章结尾有本次笔记下载链接,里面只包含需要的程序集】
运行环境:.Net Framework 4.5

2.什么是NHibernate

NHibernate是ORM框架中的一种,那么什么是ORM框架,我在MVC那边有一篇介绍EF框架时说过。

大家可以看看这篇文章什么是ORM框架

这里就强调一句话:【ORM(Object Relational Mapping)是一种为了解决面向对象与关系型数据库互相匹配而存在的技术】。

3.开始NH之旅

本次学习的代码结构如下

第一步:在数据库中创建.net类持久化的对应表

create table T_Student
(
SId int primary key identity(1,1),
SName nvarchar(10),
SAge int
)

第二步:创建需要被持久化的.Net类

namespace Kimisme
{
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
}

第三步:创建映射文件,告诉NH怎么持久化这些类以及它的属性Student.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false">
<class name="Test.Student,Test" table="T_Student">
<id name="Id" column="sId" type="int">
<generator class="native" />
</id>
<property name="Name" column="sName" type="string" />
<property name="Age" column="sAge" type="int" />
</class>
</hibernate-mapping>

说明:

<class name="Test.Student,Test" table="T_Student"></class>:DotNet中类Student(命名空间.类名)对应数据库中表T_Student

<id name="Id" column="sId" type="int"></id>:类Student的字段Id对应于表T_Student中的SId

<generator class="native" />:native表示自动生成,因为表中tId设置了主键

第四步:创建NH的配置文件,告诉NH要连接什么数据库以及怎么连接数据库App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration> <configSections>
<section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler,NHibernate" requirePermission="false"/>
</configSections> <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider, NHibernate</property>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">Server=(local);initial catalog=KimDB;Integrated Security=SSPI</property>
<property name="show_sql">true</property>
<property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property>
</session-factory>
</hibernate-configuration> <startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
</configuration>

说明:

<configSections> <section name="hibernate-configuration" /> </configSections>:NH配置文件,必须放在最上面

<property name="connection.provider"></property>:NH连接数据库提供程序

<property name="connection.driver_class"></property> :连接数据库的驱动程序

<property name="connection.connection_string"></property> :数据库连接

<property name="show_sql"></property> :是否显示sql语句

<property name="dialect"></property> :方言

第五步:使用NH提供的API做增速改查

首先看看本次完成后的界面 以及 代码层次:

4.终于可以敲代码了

首先要引用两个文件,一个是Kimisme类库,一个是NHibernate.dll

namespace KimismeDemo
{
public partial class Form1 : Form
{
private ISession session = null;
private ISessionFactory factory = null;
private ITransaction trans = null;
public Form1()
{
InitializeComponent();
} #region 0.初始化session以及session工厂 - private void Form1_Load(object sender, EventArgs e)
private void Form1_Load(object sender, EventArgs e)
{
Configuration config = new Configuration().AddAssembly("Kimisme");
factory = config.BuildSessionFactory();
session = factory.OpenSession();
}
#endregion #region 1.0 添加学生 - private void btnAdd_Click(object sender, EventArgs e)
private void btnAdd_Click(object sender, EventArgs e)
{
trans = session.BeginTransaction();
try
{
Student stu = new Student();
stu.Name = txtName.Text;
stu.Age = Convert.ToInt32(txtAge.Text);
session.Save(stu);
trans.Commit();
MessageBox.Show("添加成功");
}
catch (Exception ex)
{
trans.Rollback();
MessageBox.Show(ex.Message);
}
}
#endregion #region 2.0 根据id查找学生 - private void btnSearch_Click(object sender, EventArgs e)
private void btnSearch_Click(object sender, EventArgs e)
{
try
{
Student stu = session.Get(typeof(Student), int.Parse(txtId.Text)) as Student;
MessageBox.Show("姓名:【" + stu.Name + "】年龄:" + stu.Age);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
#endregion #region 3.0 根据Id修改学生 - private void btnEdit_Click(object sender, EventArgs e)
private void btnEdit_Click(object sender, EventArgs e)
{
trans = session.BeginTransaction();
try
{
Student stu = session.Get(typeof(Student), int.Parse(txtEditId.Text)) as Student;
stu.Name = txtEditName.Text;
stu.Age = Convert.ToInt32(txtEditAge.Text);
session.Update(stu);
trans.Commit();
MessageBox.Show("修改成功");
}
catch (Exception ex)
{
trans.Rollback();
MessageBox.Show(ex.Message);
}
}
#endregion #region 4.0 根据id删除学生 - private void btnDelete_Click(object sender, EventArgs e)
private void btnDelete_Click(object sender, EventArgs e)
{
trans = session.BeginTransaction();
try
{
Student stu = session.Get(typeof(Student), int.Parse(txtDeleteId.Text)) as Student;
session.Delete(stu);
trans.Commit();
MessageBox.Show("删除成功");
}
catch (Exception ex)
{
trans.Rollback();
MessageBox.Show(ex.Message);
}
}
#endregion
}
}

5.代码下载

NHibernate系列学习(一)-看看用NH怎么做增速改查的更多相关文章

  1. sqlHelper做增删改查,SQL注入处理,存储值,cookie,session

    一.存储值 eg:登录一个页面,在进入这个页面之前你怎么知道它登没登录呢?[在登录成功之后我们把状态保存起来] 存储值得方式有两种,一种是cookie,一种是session 1.1区别: 代码: if ...

  2. java对xml文件做增删改查------摘录

    java对xml文件做增删改查 package com.wss; import java.io.File;import java.util.ArrayList;import java.util.Lis ...

  3. MVC学习-用EF做增删改查

    在做增删改查先,先介绍几个知识点: 1.代理类 在将对象方法EF数据上下文时,EF会为该对象封装 一个代理类对象, 同时为该对象的每一个属性添加一个标志:unchanged, 当对该对象某个属性进行操 ...

  4. Nhibernate系列学习之(三) Criteria查询表达式增删改查

    Criteria查询表达式: 正如我们所见,Expression对查询语句的表达式进行了封装和限制,下表列出了Expression所有的方法,以及每个方法所对应的查询表达式及其限制. Restrict ...

  5. Nhibernate系列学习之(一) ORM and Nhibernate入门实例解析

    最近框架项目需要,数据层想使用Nhibernate,代替传统的sql语句的写法,更加使用面向对象的思维来维护实体与数据库的这层关系映射(ORM),好在之前接触过Java时学习使用了Hibernate, ...

  6. Nhibernate系列学习之(五) 存储过程

    NHibernate也是能够操作存储过程的,不过第一次配置可能会碰到很多错误. 一.删除 首先,我们新建一个存储过程如下: CREATE PROC DeletePerson @Id int AS DE ...

  7. Nhibernate系列学习之(四) 数据操作

    数据操作,在这里主要介绍INSERT.UPDATE.DELETE.我们在使用NHibernate的时候,如果只是查询数据,不需要改变数据库的值,那么是不需要提交或者回滚到数据库的. 一.INSERT ...

  8. Nhibernate系列学习之(二) 简单增删改查

    实例中解决方案简单的创建三层架构,符合开发过程中最简单的运用: 1:首先在数据库中创建一个表T_School,脚本如下: USE [TestDb] GO /****** 对象: Table [dbo] ...

  9. NHibernate系列学习(三)-条件查询Criteria

    1.本笔记主要介绍Criteria的使用 2.效果界面 3.代码详情 namespace KimismeDemo { public partial class Form3 : Form { priva ...

随机推荐

  1. flask——CSRFToken保护

    根据 csrf_token 校验原理,具体操作步骤有以下几步: 1.后端生成 csrf_token 的值,在前端请求登录或者注册界面的时候将值传给前端,传给前端的方式可能有以下两种: 在模板中的 Fr ...

  2. session 分布式处理-----https://segmentfault.com/a/1190000013447750?utm_source=tag-newest

    第一种:粘性session 粘性Session是指将用户锁定到某一个服务器上,比如上面说的例子,用户第一次请求时,负载均衡器将用户的请求转发到了A服务器上,如果负载均衡器设置了粘性Session的话, ...

  3. session 与 cookie 区别-----https://segmentfault.com/a/1190000013447750?utm_source=tag-newest

    cookie数据存放在客户的浏览器上,session数据放在服务器上. cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session. sessi ...

  4. [luoguP2915] [USACO08NOV]奶牛混合起来Mixed Up Cows(DP)

    传送门 f[i][S] 表示当前集合为 S,最后一个数为 i 的最优解 f[i][S] += f[j][S - i] (j, i ∈ S && j != i && ab ...

  5. docker run和nsenter

    docker run和nsenter 1,本机运行java -version没有内容, 使用 docker run java java -version就有内容了: 2, docker run -d ...

  6. hdu 3342 Legal or Not (拓扑排序)

    重边这样的东西   仅仅能呵呵 就是裸裸的拓扑排序 假设恩可以排出来就YES . else  NO 仅仅须要所有搜一遍就好了 #include <cstdio> #include < ...

  7. MyEclipse 9.0 正式版公布新闻 下载

    MyEclipse 9.0 正式版公布 新闻 ============================================================================ ...

  8. chosen.jquery.js 使用笔记

    using chosen.jquery.js using chosen.jquery.css html: <label for="MeetingUsersList" clas ...

  9. automaticallyAdjustsScrollViewInsets 使用

    automaticallyAdjustsScrollViewInsets(个人认为iOS7中略坑爹的属性) @当我们在一个UIViewController中同时创建2个tableView的时候,如果把 ...

  10. 一款炫酷Loading动画--载入失败

    简单介绍 上一篇文章一款炫酷Loading动画–载入成功.给大家介绍了成功动画的绘制过程,这篇文章将接着介绍载入失败特效的制作. 相比成功动画,有了前面的经验,失败动画的过程就显得比較简单了. 动画结 ...