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.代码下载

时间: 2024-10-12 23:35:33

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

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

最近框架项目需要,数据层想使用Nhibernate,代替传统的sql语句的写法,更加使用面向对象的思维来维护实体与数据库的这层关系映射(ORM),好在之前接触过Java时学习使用了Hibernate,先来了解ORM.    什么是ORM? 对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的.面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统.对象和关系数据是业务

針對數據庫的數據的增刪改查的功能做接口

package poster1.dao; import java.sql.SQLException;import java.util.List; import poster_model.Typeinfo;import poster_model.Userinfo; /** * 針對數據庫的數據的增刪改查的功能做接口 * @author 1 * */public interface IDaoBBs<T> { /** * @param t * @return 向數據庫表里添加一條數據 * @thro

边做边改模型

边做边改模型(Build-and-Fix Model) 好吧,其实现在许多产品实际都是使用的“边做边改”模型来开发的,特别是很多小公司产品周期压缩的太短.在这种模型中,既没有规格说明,也没有经过设计,软件随着客户的需要一次又一次地不断被修改. 在这个模型中,开发人员拿到项目立即根据需求编写程序,调试通过后生成软件的第一个版本.在提供给用户使用后,如果程序出现错误,或者用户提出新的要求,开发人员重新修改代码,直到用户和测试等等满意为止. 这是一种类似作坊的开发方式,边做边改模型的优点毫无疑问就是前

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

一.存储值 eg:登录一个页面,在进入这个页面之前你怎么知道它登没登录呢?[在登录成功之后我们把状态保存起来] 存储值得方式有两种,一种是cookie,一种是session 1.1区别: 代码: if (SqlHelper.Exists(sSql, para)) { //cookie保存状态 if (chkRPwd.Checked) { Response.Cookies["name"].Expires = DateTime.Now.AddMinutes(1);//设置过期时间 //删除

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

Criteria查询表达式: 正如我们所见,Expression对查询语句的表达式进行了封装和限制,下表列出了Expression所有的方法,以及每个方法所对应的查询表达式及其限制. Restrictions的用法: 方法 说明 Restrictions.eq = Restrictions.allEq 利用Map来进行多个等于的限制 Restrictions.gt > Restrictions.ge >= Restrictions.lt < Restrictions.le <= R

NHibernate系列学习(二)-使用sql和hql以及linq

1.本文主要介绍了NH的三种查询方式 2.界面查看 3.代码架构 4.代码详情 namespace KimismeDemo { public partial class Form2 : Form { private ISession session; private ISessionFactory factory; private ITransaction trans; public Form2() { InitializeComponent(); } #region 1.初始化NH - pri

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

1.本笔记主要介绍Criteria的使用 2.效果界面 3.代码详情 namespace KimismeDemo { public partial class Form3 : Form { private ISession session; private ISessionFactory factory; private ITransaction trans; public Form3() { InitializeComponent(); } #region 0.0 初始化NH - privat

MVC + EF 框架 对数据库做增删改查

这几天一直在看MVC 开发模式,其中借助EF框架对数据库进行 增删改查操作 现在就小小的总结一下吧 在使用EF操作数据库时,会首先添加 ADO.NET数据模型,这时,会为我们添加一个数据上下文类,使用这个类的对象可以对数据库做任何操作.所以在使用EF操作数据库之前 需要创建数据上下文对象. MyDatabaseEntities mde = new MyDatabaseEntities(); 1.使用EF 对数据库 做增加操作 1.1 创建一个需要被操作数据表的对象(一般来说 ,一张表就是一个实体

MVC学习-用EF做增删改查

在DbContext中有两个很重要的方法: 一.几个方法的说明 1.一个是Entry()方法: public DbEntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity : class; 可以将 任何类型的数据放入到上下文对象中 DbEntityEntry有个 属性EntityState,它可以为上下文中的对象做标识,并依照标识的值做相应的sql操作 public enum EntityState { De