NHibernate系列学习(一)-看看用NH怎么做增速改查
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怎么做增速改查的更多相关文章
- sqlHelper做增删改查,SQL注入处理,存储值,cookie,session
一.存储值 eg:登录一个页面,在进入这个页面之前你怎么知道它登没登录呢?[在登录成功之后我们把状态保存起来] 存储值得方式有两种,一种是cookie,一种是session 1.1区别: 代码: if ...
- java对xml文件做增删改查------摘录
java对xml文件做增删改查 package com.wss; import java.io.File;import java.util.ArrayList;import java.util.Lis ...
- MVC学习-用EF做增删改查
在做增删改查先,先介绍几个知识点: 1.代理类 在将对象方法EF数据上下文时,EF会为该对象封装 一个代理类对象, 同时为该对象的每一个属性添加一个标志:unchanged, 当对该对象某个属性进行操 ...
- Nhibernate系列学习之(三) Criteria查询表达式增删改查
Criteria查询表达式: 正如我们所见,Expression对查询语句的表达式进行了封装和限制,下表列出了Expression所有的方法,以及每个方法所对应的查询表达式及其限制. Restrict ...
- Nhibernate系列学习之(一) ORM and Nhibernate入门实例解析
最近框架项目需要,数据层想使用Nhibernate,代替传统的sql语句的写法,更加使用面向对象的思维来维护实体与数据库的这层关系映射(ORM),好在之前接触过Java时学习使用了Hibernate, ...
- Nhibernate系列学习之(五) 存储过程
NHibernate也是能够操作存储过程的,不过第一次配置可能会碰到很多错误. 一.删除 首先,我们新建一个存储过程如下: CREATE PROC DeletePerson @Id int AS DE ...
- Nhibernate系列学习之(四) 数据操作
数据操作,在这里主要介绍INSERT.UPDATE.DELETE.我们在使用NHibernate的时候,如果只是查询数据,不需要改变数据库的值,那么是不需要提交或者回滚到数据库的. 一.INSERT ...
- Nhibernate系列学习之(二) 简单增删改查
实例中解决方案简单的创建三层架构,符合开发过程中最简单的运用: 1:首先在数据库中创建一个表T_School,脚本如下: USE [TestDb] GO /****** 对象: Table [dbo] ...
- NHibernate系列学习(三)-条件查询Criteria
1.本笔记主要介绍Criteria的使用 2.效果界面 3.代码详情 namespace KimismeDemo { public partial class Form3 : Form { priva ...
随机推荐
- 【07】AngularJS Filters
AngularJS Filters 过滤器可以使用一个管道字符(|)添加到表达式和指令中. AngularJS 过滤器 AngularJS 过滤器可用于转换数据: 过滤器 描述 currency[ˈk ...
- Introduction to TensorFlow
Lecture note 1: Introduction to TensorFlow Why TensorFlow TensorFlow was originally created by resea ...
- Linux下汇编语言学习笔记35 ---
这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...
- Linux下汇编语言学习笔记80 ---
这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...
- JAVA NIO 之 Selector 组件
NIO 重要功能就是实现多路复用.Selector是SelectableChannel对象的多路复用器.一些基础知识: 选择器(Selector):选择器类管理着一个被注册的通道集合的信息和它们的就绪 ...
- 16、Java并发性和多线程-死锁
以下内容转自http://ifeve.com/deadlock/: 死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁.死锁通常发生在多个线程同时但以不同的顺序请求同一组锁的时候. 例如, ...
- 关于Android中的四大组件(Service的开启与关闭)
前言 服务(Service)是Android系统中的四大组件之中的一个.服务主要用于两个目的:后台执行和跨进程訪问. 通过启动 一个服务.能够在不显示界面的前提下在后台执行指定的任务,这样能够不影响用 ...
- 王立平--SQLite,SQLiteOpenHelper的简单应用
Android平台提供给我们一个数据库辅助类来创建或打开数据库,这个辅助类继承自SQLiteOpenHelper类.在该类的构造器中,调用Context中的方法创建并打开一个指定名称的数据库对象.继承 ...
- POJ 2007 Scrambled Polygon(简单极角排序)
水题,根本不用凸包,就是一简单的极角排序. 叉乘<0,逆时针. #include <iostream> #include <cstdio> #include <cs ...
- ERROR (ConnectionError): HTTPConnectionPool (Caused by <class 'socket.error'>: [Errno 111] Connecti
感谢朋友支持本博客.欢迎共同探讨交流,因为能力和时间有限,错误之处在所难免.欢迎指正! 假设转载,请保留作者信息. 博客地址:http://blog.csdn.net/qq_21398167 原博文地 ...