第一个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. C#将dll打包到程序中

    最近比较懒,加上内容也不多就懒得排版了,字放大了,看起来应该方便一点 直接进入主题 先来看一个栗子,假设现在有一个第三方dll namespace TestLibrary1 { public clas ...

  2. ASP.NET Web API 应用教程(一) ——数据流使用

    相信已经有很多文章来介绍ASP.Net Web API 技术,本系列文章主要介绍如何使用数据流,HTTPS,以及可扩展的Web API 方面的技术,系列文章主要有三篇内容. 主要内容如下: I  数据 ...

  3. jsp中运用application实现共享留言板功能

    jsp中application的知识点总结: 1.一个Web应用程序启动后,将会自动创建一个application对象,在整个应用程序的运行过程中只有这一个application对象,即所有访问该网站 ...

  4. Java程序员的日常——SpringMVC+Mybatis开发流程、推荐系统

    今天大部分时间都在写业务代码,然后算是从无到有的配置了下spring与mybatis的集成. SpringMVC+Mybatis Web开发流程 配置数据源 在applicationContext.x ...

  5. 11.按要求编写Java应用程序。 (1)创建一个叫做机动车的类: 属性:车牌号(String),车速(int),载重量(double) 功能:加速(车速自增)、减速(车速自减)、修改车牌号,查询车的载重量。 编写两个构造方法:一个没有形参,在方法中将车牌号设置“XX1234”,速 度设置为100,载重量设置为100;另 一个能为对象的所有属性赋值; (2)创建主类: 在主类中创建两个机动车对象。

    package java1; public class Che { //属性 public String nub; public int speed; public double weight ; C ...

  6. unity生成的WP8.1工程的Title本地化实现

    不同于WP本身工程的实现,unity的工程在package.appxmanifest文件中已经定义了 <Resources> <Resource Language="x-g ...

  7. 初了解JS设计模式,学习笔记

    什么是设计模式. 回答这个问题,往往我们得先知道我们为什么需要设计模式,正是因为有需求才会有设计模式,难道不是吗? 我们为什么需要设计模式. 如果没有按照设计模式去写,你的代码很可能是乱无肆忌写的,也 ...

  8. ASP.NET MVC 4使用PagedList.Mvc分页

    ASP.NET MVC中进行分页的方式有多种,在NuGet上有提供使用PagedList.PagedList.Mvc进行分页. 1. 通过NuGet引用PagedList.Mvc 在安装引用Paged ...

  9. 为什么GOF的23种设计模式里面没有MVC?

    GoF (Gang of Four,四人组, <Design Patterns: Elements of Reusable Object-Oriented Software>/<设计 ...

  10. WPF自定义控件与样式(12)-缩略图ThumbnailImage /gif动画图/图片列表

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要针对WPF项目 ...