第一个NhIbernate程序

1、目的:

a) 链接到oracle数据库

b) 增删改

c) 基本查询、sql查询

d) 视图查询

e) 使用存储过程

f) 多表查询、级联查询

g) 级联增删改

2、后续目的

a) 加载机制——立即加载or延迟加载

b) 并发控制

c) 缓存——一级缓存,二级缓存

接下来我会一一完成上面的目的,以便对Hhibernate有更多的了解,写希望各位能多多的指正。

3、第一个项目

a) 下载

Nhibernate最新版本为4.0.1.GA,下载地址:http://nhforge.org/

下载内容如下图

其中  Configuration_Templates中放的是各个数据库连接的配置文件样本模板,基本上包含了主流的数据库

B) 创建项目

根据三层架构把项目分为三层:

第一层: Model层——主要存放数据实体与映射文件

第二层: DAL层——存放数据库的操作方法

第三层: Facade层——业务逻辑层,主要实现与页面的业务逻辑

第四层: View层——页面层,包含接口、web

第五层:Common层——公共类层,主要存储一些共有的操作类

由于分五层为个人习惯问题,有不习惯的园友可以分三层:去掉第三层与第五层。

分布图如下

C) 引用DLL文件 (这里介绍主要的几个引用,其他的话,可以根据我放出的实例来看)

Model层: 需要引入Required_Bins 文件夹中的Iesi.Collections.dll,NHibernate.dll;

DAL层 :  需要引入Required_Bins 文件夹中的Iesi.Collections.dll,NHibernate.dll和Model层;

Facade层:需要引入Model层与DAL层;

View层:  需要引入Required_Bins 文件夹中的Iesi.Collections.dll,NHibernate.dll,log4net.dll和Model层与Facade层;

其实还有另一种方法可以添加引用,就是通过NuGet进行引用,这种方法我在这里就不介绍了。

D) 创建数据库

先在oracle数据库中创建一张表,如图

该表没有任何外键关联,也没其他表的ID字段。

E)创建model层中的持久化类 及 xml映射文件

创建cat的类

创建cat的mapping对应的xml文件

基本文件位置如下

F)修改配置文件

因为连接的是oracle的数据库,所以在下载的文件Configuration_Templates文件夹中找到oracle的配置文件,如图

选择oracle.cfg.xml 文件 放到View层下面 ,并且修改名字。默认的名字是hibernate.cfg.xml,且需要放在bin——debug文件夹下面。大多数情况我们会根据自身的习惯进行一些调整。比如我喜欢放在App_Data文件夹下。

修改配置文件信息

原始的配置文件信息

我修改后的文件信息

G)编写DAL方法与实例

首先  先写一个NhibernateHelper.cs文件

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using NHibernate;
using NHibernate.Linq;
using NHibernate.Criterion; namespace CommonClass
{
public class NHibernateHelper
{
/// <summary>
/// Session工厂
/// </summary>
private readonly ISessionFactory SessionFactory;
/// <summary>
/// nhibernate.cfg.xml 所在相对路径
/// </summary>
private string xmlString = "App_Data/hibernate.cfg.xml";
/// <summary>
/// 构造函数
/// </summary>
public NHibernateHelper()
{
if (SessionFactory == null)
{
var cfg = new NHibernate.Cfg.Configuration().Configure(xmlString); SessionFactory = cfg.BuildSessionFactory(); }
} public NHibernateHelper(string path)
{
if (SessionFactory == null)
{
var cfg = new NHibernate.Cfg.Configuration().Configure(path); SessionFactory = cfg.BuildSessionFactory();
}
} /// <summary>
/// 获取一个Isession
/// </summary>
/// <returns></returns>
public ISession GetSession()
{
return SessionFactory.OpenSession();
}
/// <summary>
/// 关闭一个Isession
/// </summary>
/// <param name="session"></param>
public void CloseSeeion(ISession session)
{
session.Close();
} /// <summary>
/// 关闭一个Isessionfactory
/// </summary>
public void CloseSessionFactory()
{
SessionFactory.Close();
}
}
}

再编写CATDAL.cs  用来操作数据库的方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using NHibernate;
using NHibernate.Linq;
using NHibernate.Criterion; using ModelEntityClass.Model;
using CommonClass; namespace DALClass
{
public class CATDAL
{
private NHibernateHelper HB_Helper = null;
public CATDAL()
{
HB_Helper = new NHibernateHelper();
}
/// <summary>
/// 添加
/// </summary>
/// <param name="entitys"></param>
/// <returns></returns>
public bool InsertAll(List<CAT> entitys)
{
bool flag = false;
ISession session = HB_Helper.GetSession();
using (ITransaction tt = session.BeginTransaction())
{
try
{
foreach (CAT entity in entitys)
{
session.Save(entity);
}
session.Flush();
tt.Commit();
flag = true;
}
catch (HibernateException ex)
{
tt.Rollback();
}
} HB_Helper.CloseSeeion(session);
return flag;
}
/// <summary>
/// 根据ID进行查找
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public CAT Find(string id)
{
ISession session = HB_Helper.GetSession();
CAT cat = null;
using (ITransaction tt = session.BeginTransaction())
{
try
{
cat = session.Query<CAT>().Where(p => p.ID == id).FirstOrDefault();
}
catch (HibernateException ex)
{
tt.Rollback();
}
} HB_Helper.CloseSeeion(session);
return cat;
}
/// <summary>
/// 查询所有
/// </summary>
/// <returns></returns>
public List<CAT> FindAll()
{
ISession session = HB_Helper.GetSession();
//ICriteria criteria = session.CreateCriteria(typeof(CAT));
List<CAT> catList = null;
using (ITransaction tt = session.BeginTransaction())
{
try
{
catList = session.Query<CAT>().ToList();
}
catch (HibernateException ex)
{
tt.Rollback();
}
} HB_Helper.CloseSeeion(session);
return catList;
} /// <summary>
/// 删除所有
/// </summary>
/// <param name="entitys"></param>
/// <returns></returns>
public bool DeleteAll(List<CAT> entitys)
{ bool flag = false;
ISession session = HB_Helper.GetSession();
using (ITransaction tt = session.BeginTransaction())
{
try
{
foreach (CAT entity in entitys)
{
session.Delete(entity);
}
session.Flush();
tt.Commit();
flag = true;
}
catch (HibernateException ex)
{
tt.Rollback();
}
} HB_Helper.CloseSeeion(session);
return flag; } /// <summary>
/// 删除
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public bool Delete(CAT entity)
{ bool flag = false;
ISession session = HB_Helper.GetSession();
using (ITransaction tt = session.BeginTransaction())
{
try
{
session.Delete(entity); session.Flush();
tt.Commit();
flag = true;
}
catch (HibernateException ex)
{
tt.Rollback();
}
} HB_Helper.CloseSeeion(session);
return flag; } /// <summary>
/// 保存和添加
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public bool SaveAndUpdate(List<CAT> entitys)
{
bool flag = false;
ISession session = HB_Helper.GetSession();
using (ITransaction tt = session.BeginTransaction())
{
try
{
foreach (CAT entity in entitys)
{
session.SaveOrUpdate(entity);
}
session.Flush();
tt.Commit();
flag = true;
}
catch (HibernateException ex)
{
tt.Rollback();
}
} HB_Helper.CloseSeeion(session);
return flag;
}
}
}

接下来编辑业务逻辑层的类,由于它是对应ConsoleApplication1项目的这个业务,我把他命名成ConsoleFacade(里面只有一个方法,后面可以根据需要进行添加)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using ModelEntityClass.Model;
using DALClass; namespace FacadeClass
{
public class ConsoleFacade
{ public bool InsertAll(List<CAT> entitys)
{
CATDAL dal = new CATDAL();
return dal.InsertAll(entitys);
}
}
}

现在我们进行测试

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using ModelEntityClass.Model;
using FacadeClass; namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
CAT cat = new CAT(); cat.ID = Guid.NewGuid().ToString(); cat.NAME = "芝麻";
cat.SHORTNAME = "小婊砸";
cat.CREATDATA = DateTime.Now;
cat.ADDRESS = "北京市不知道什么的地方";
cat.AGE = ;
cat.CODE = "M0001"; List<CAT> InsertList = new List<CAT> ();
InsertList.Add(cat); ConsoleFacade facade = new ConsoleFacade();
if( facade.InsertAll(InsertList))
{
Console.WriteLine("添加成功");
}else
{
Console.WriteLine("添加失败");
} Console.ReadKey();
}
}
}

测试页面如下

这样我们一个简单的Nhibernate实例就完成了。

项目实例下载

Nhibernate的第一个实例的更多相关文章

  1. 【C# -- OpenCV】Emgu CV 第一个实例

    原文 [C# -- OpenCV]Emgu CV 第一个实例 Emgu CV下载地址 http://sourceforge.net/projects/emgucv/files/ 找最新的下就行了,傻瓜 ...

  2. Thrift教程初级篇——thrift安装环境变量配置第一个实例

    前言: 因为项目需要跨语言,c++客户端,web服务端,远程调用等需求,所以用到了RPC框架Thrift,刚开始有点虚,第一次接触RPC框架,后来没想到Thrift开发方便上手快,而且性能和稳定性也不 ...

  3. Konckout第一个实例:简单数据模型绑定

    Konck是什么: http://www.aizhengli.com/knockoutjs/50/knockout.html 使用:直接引入knockout.js文件 第一个实例:实现输入框输入值改变 ...

  4. Vue.js学习和第一个实例

    第一个实例效果图: 1.node.js下载,然后安装.下载地址:链接:http://pan.baidu.com/s/1o7TONhS 密码:fosa 2.下载Vue.js.链接:http://pan. ...

  5. Highmaps网页图表教程之Highmaps第一个实例与图表构成

    Highmaps网页图表教程之Highmaps第一个实例与图表构成 Highmaps第一个实例 下面我们来实现本教程的第一个Highmaps实例. [实例1-1:hellomap]下面来制作一个中国地 ...

  6. JAVA-MyEclipse第一个实例

    相关资料: <21天学通Java Web开发> 实例代码: MyEclipse第一个实例1.打开MyEclipse程序.2.在PacKage视图->右击->New|Web Pr ...

  7. C# 实现程序只启动一次(多次运行激活第一个实例,使其获得焦点,并在最前端显示)

    防止程序运行多个实例的方法有多种,如:通过使用互斥量和进程名等.而我想要实现的是:在程序运行多个实例时激活的是第一个实例,使其获得焦点,并在前端显示. 主要用到两个API 函数: ShowWindow ...

  8. 小白的springboot之路(一)、环境搭建、第一个实例

    小白的springboot之路(一).环境搭建.第一个实例 0- 前言 Spring boot + spring cloud + vue 的微服务架构技术栈,那简直是爽得不要不要的,怎么爽法,自行度娘 ...

  9. NHibernate N+1问题实例分析和优化

    1.问题的缘起 考察下面的类结构定义 public class Category { string _id; Category _parent; IList<Category> _chil ...

随机推荐

  1. Linux网络编程系列-TCP编程实例

    实例: client #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #inc ...

  2. java ExecutorService

    ExecutorService 通常Executor对象会创建并管理一组执行Runnable对象的线程,这组线程被称为线程池,Executor基于生产者-消费者模式.提交任务的执行者是生产者(产生待完 ...

  3. Atitit 破解qq空间(2)-------探测权限

    Atitit 破解qq空间(2)-------探测权限 /AtiPlatf_cms/src/com/attilax/net/httpTest.java  package com.attilax.net ...

  4. OutputCache属性详解(三)— VaryByHeader,VaryByCustom

    目录 OutputCache概念学习 OutputCache属性详解(一) OutputCache属性详解(二) OutputCache属性详解(三) OutputCache属性详解(四)— SqlD ...

  5. 《轻量级Java Web整合开发入门SSH》 - 快速理解Java框架的又一积木

           学习JAVA不难,难的是没有多余的时间给你仔细学习.       伴随着项目的不断跟进,责任重于泰山,必须快速提升.       我不能期望把一本书或者一个项目完全吃透,只希望能用数量去 ...

  6. FIR.im Weekly - 这是多产的一周

    前方干货颇多,请备好小板凳,泡好茶,慢慢看. 上周四到周六(23号-25号),由 infoQ 主办的 QCon 在北京召开,各技术大牛围绕敏捷开发.技术架构.开发实践等话题进行了技术分享与探讨. QC ...

  7. DataTable转换成json字符串

    将DataTable里面的行转换成json字符串方法: #region DataTable转为json /// <summary> /// DataTable转为json /// < ...

  8. 有jQuery背景,该如何用AngularJS编程思想?

    "我可以熟练使用jQuery进行客户端应用的开发,但是现在我希望开始使用Angular.js.哪位能描述一下这个过程中必要的模式变化吗?希望您的答案能够围绕下面这些具体的问题: 1. 我如何 ...

  9. Unity 产生各不相同的随机数

    1. 网上很多方法都说用时间种子来解决,但是在极短的时间内,这种方法没效 Random r = new Random(DateTime.Now.Millisecond); Random Counter ...

  10. JAVA实现Excel的读写--jxl

    前段时间因为开发网站的需要,研究了一下java实现excel的读写,一般当我们做管理软件时,都需要打印报表,报表如何制作呢?相信一定难为过大家,本篇就为大家揭开它的神秘面纱,学习完半篇,你一定会对报表 ...