第一個NhIbernate程式 1、目的: a) 鏈接到oracle資料庫 b) 增刪改 c) 基本查詢、sql查詢 d) 視圖查詢 e) 使用存儲過程 f) 多表查詢、級聯查詢 g) 級聯增刪改 2、後續目的 a) 載入機制——立即載入or延遲載入 b) 併發控制 c) 緩存——一級緩存,二級緩存 ...
第一個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文件
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 using NHibernate; 8 using NHibernate.Linq; 9 using NHibernate.Criterion; 10 11 namespace CommonClass 12 { 13 public class NHibernateHelper 14 { 15 /// <summary> 16 /// Session工廠 17 /// </summary> 18 private readonly ISessionFactory SessionFactory; 19 /// <summary> 20 /// nhibernate.cfg.xml 所在相對路徑 21 /// </summary> 22 private string xmlString = "App_Data/hibernate.cfg.xml"; 23 /// <summary> 24 /// 構造函數 25 /// </summary> 26 public NHibernateHelper() 27 { 28 if (SessionFactory == null) 29 { 30 var cfg = new NHibernate.Cfg.Configuration().Configure(xmlString); 31 32 SessionFactory = cfg.BuildSessionFactory(); 33 34 } 35 } 36 37 public NHibernateHelper(string path) 38 { 39 if (SessionFactory == null) 40 { 41 var cfg = new NHibernate.Cfg.Configuration().Configure(path); 42 43 SessionFactory = cfg.BuildSessionFactory(); 44 } 45 } 46 47 /// <summary> 48 /// 獲取一個Isession 49 /// </summary> 50 /// <returns></returns> 51 public ISession GetSession() 52 { 53 return SessionFactory.OpenSession(); 54 } 55 /// <summary> 56 /// 關閉一個Isession 57 /// </summary> 58 /// <param name="session"></param> 59 public void CloseSeeion(ISession session) 60 { 61 session.Close(); 62 } 63 64 /// <summary> 65 /// 關閉一個Isessionfactory 66 /// </summary> 67 public void CloseSessionFactory() 68 { 69 SessionFactory.Close(); 70 } 71 } 72 }
再編寫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; } } }View Code
接下來編輯業務邏輯層的類,由於它是對應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); } } }View Code
現在我們進行測試
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 = 2; 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(); } } }View Code
測試頁面如下
這樣我們一個簡單的Nhibernate實例就完成了。