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. Prüfer序列和cayley定理

    参考资料: 1.matrix67 <经典证明:Prüfer编码与Cayley公式> 2.百度百科 3.Forget_forever prufer序列总结 4.维基百科 5.dirge的学习 ...

  2. Spring AOP 学习(五)

    1. 使用动态代理实现AOP package com.atguigu.spring.aop; import java.lang.reflect.InvocationHandler; import ja ...

  3. SpringSecurity 获取认证信息 和 认证实现

    JdbcDaoImpl 实现获取认证信息 PasswordEncoder 实现具体认证过程

  4. hadoop 3.0.0新特性

    1.Minimum required Java version increased from Java 7 to Java 8 java最低支持版本变成java8 2.Support for eras ...

  5. Sublime text如何设置快捷键让编写的HTML文件在浏览器预览?

      STEP 1 Tools->Build System->New Build System STEP 2<img src="https://pic3.zhimg.com/ ...

  6. codevs3411 洪水

    题目描述 Description 小浣熊松松和朋友到野外露营,没想到遇上了π年一次的大洪水,好在松松是一只爱观察的小浣熊,他发现露营地的地形和洪水有如下性质: ①露营地可以被看做是一个N*M的矩形方阵 ...

  7. tyvj1117 拯救ice-cream

      背景 天好热……Tina顶着那炎炎的烈日,向Ice-cream home走去……可是……停电了……冰淇淋们躺在Ice-cream home的冰柜里,慢慢地……慢慢地……融化…………你说,她能赶在冰 ...

  8. 26、Java并发性和多线程-线程池

    以下内容转自http://ifeve.com/thread-pools/: 线程池(Thread Pool)对于限制应用程序中同一时刻运行的线程数很有用.因为每启动一个新线程都会有相应的性能开销,每个 ...

  9. 交换机是干嘛的!!交换机如何学习MAC地址过程?

    1.它收到一个帧的时候,先检查源MAC地址,看看自己维护的一个地址表中有没有这个地址.如果有,则2:如果没有,则将这个MAC地址.进入的端口.进入的时间放入这个表中: 2.检查目的MAC地址,然后到该 ...

  10. iOS 的单例模式 dispatch_once

    iOS 的单例模式 dispatch_once 有些变量仅仅须要初始化一次(如从文件里读取配置參数.读取设备型号等等),能够使用dispatch_once来进行读取优化.保证仅仅调用API一次,以后就 ...