第一个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. 关于QCon2015感想与反思

    QCon2015专场有不少关于架构优化.专项领域调优专题,但能系统性描述产品测试方向只有<携程无线App自动化测试实践>.   (一). 携程的无线App自动化     <携程无线A ...

  2. JavaBean和Map转换封装类

    package com.ljq.util; import java.beans.BeanInfo; import java.beans.Introspector; import java.beans. ...

  3. 爱上MVC3系列~监视Action的运行时间,并提供超时记录机制

    回到目录 文章出现的原因 很久没写关于MVC的文章了,原因是将关注点移向了MVVM和DDD这边,而这篇文章完全是因为公司项目的需要,因为公司网站总是不定时的502,而这由可能是程序超时所引起的,为了分 ...

  4. Atitit  记录方法调用参数上下文arguments

    Atitit  记录方法调用参数上下文arguments 1.1. java  java8  新的对象Parameter LocalVariableTable 本地变量表 MethodParamete ...

  5. Paip.语义分析----情绪情感词汇表总结

    Paip.语义分析----情绪情感词汇表总结 以下词语是按感情色彩共分为十四类: 作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:h ...

  6. fir.im Weekly - 深度揭秘 App 启动全过程

    世纪寒潮席卷全中国,可谓普天之下莫低0℃.无论怎样的严寒都抵挡不了程序员们的创造的激情... 本期的 fir.im Weekly ,最新的 iOS/Android 开发资源,GitHub 源码.前端技 ...

  7. 更新日志 - BugHD 新增邮件告警功能

    最近 BugHD 又新增了一些功能,包括邮件告警. issue 分享. issue 备注等,同时也做了性能优化.希望能够帮助你更高效地收集解决应用崩溃. BugHD 新增功能 1.邮件告警 除了 We ...

  8. PHP_01之PHP概述、数据、语法

    1.定义:PHP Hypertext Preprocessor,超文本预处理器,服务器端脚本语言:2.环境:WAMP:Window+Apache+PHP+MySQL: LAMP:Linux+Apach ...

  9. Chrome同步最新host文件IP列表

    使用Chrome的童靴是不是很多都碰到同步问题呢?网上查来查去的都是给些host文件的修改,可是都是几年前的东西,地址都不对了,想想还是自己找到需要解析的域名的IP地址吧 步骤: 1.DNS设置为8. ...

  10. hibernate(三) 一对多映射关系

    序言 前面两节讲了hibernate的两个配置文件和hello world!.还有hibernate的一级缓存和三种状态,基本上hibernate就懂一点了,从这章起开始一个很重要的知识点,hiber ...