一、基礎介紹
1.Hibernate是Java中比較流行的ORM框架,他在.NET中有一個對應的版本叫NHibernate,在EF出來之前NHibernate是.NET中常用的ORM框架;
二、配置NHibernate
1.配置環境:NHibernate版本爲3.3.3.4001,VS2012,SqlServer2012;
2.項目整體結構如下圖:
其中DB爲數據訪問層,Entitys爲實體,Mappings爲實體對應的配置。
3.我們可以使用VS2012自帶的NuGet程序包管理器來下載和安裝NHibernate,打開該工具包之後輸入NHibernate搜索,找到之後點擊安裝即可,他會爲當前項目自動安裝並將所需的dll引入到項目中,同時會在項目下面生產一個packages文件夾用於存放所需的dll等文件。當然我們也可以自己去官網下載,手動引入,建議還是使用這個工具比較方便;
4.添加實體對象:實體和數據庫中的表是對應的
namespace NHibernateTest.Entitys
{
/// <summary>
/// 用戶登錄日誌
/// </summary>
public class PM_LoginLog
{
#region Properties
/// <summary>
/// 獲取或設置登錄用戶ID
/// </summary>
public virtual string UserID
{
get;
set;
}
/// <summary>
/// 獲取或設置登錄用戶名
/// </summary>
public virtual string UserName
{
get;
set;
}
/// <summary>
/// 獲取或設置登錄用戶密碼
/// </summary>
public virtual string PassWord
{
get;
set;
}
/// <summary>
/// 獲取或設置登錄時間
/// </summary>
public virtual DateTime LoginDT
{
get;
set;
}
/// <summary>
/// 獲取或設置退出時間
/// </summary>
public virtual DateTime LogoutDT
{
get;
set;
}
/// <summary>
/// 獲取或設置是否記住密碼 0=未記住密碼 1=已記住密碼
/// </summary>
public virtual byte RememberPassWord
{
get;
set;
}
/// <summary>
/// 獲取或設置是否刪除 0=未刪除 1=已刪除
/// </summary>
public virtual byte IsDelete
{
get;
set;
}
/// <summary>
/// 是否正常退出 0=未正常退出 1=已正常退出
/// </summary>
public virtual byte IsNormalExit
{
get;
set;
}
#endregion
}
}
namespace NHibernateTest.Entitys
{
/// <summary>
/// 用戶信息實體類
/// </summary>
public class PM_Users
{
#region Properties
/// <summary>
/// 獲取或設置用戶ID
/// </summary>
public virtual string UserID
{
get;
set;
}
/// <summary>
/// 獲取或設置用戶姓名
/// </summary>
public virtual string UserName
{
get;
set;
}
/// <summary>
/// 獲取或設置用戶密碼
/// </summary>
public virtual string PassWord
{
get;
set;
}
/// <summary>
/// 獲取或設置用戶角色,0=普通角色 1=管理員角色
/// </summary>
public virtual byte Roles
{
get;
set;
}
/// <summary>
/// 獲取或設置傳真
/// </summary>
public virtual string Fax
{
get;
set;
}
/// <summary>
/// 獲取或設置電話號碼
/// </summary>
public virtual string TelPhone
{
get;
set;
}
/// <summary>
/// 獲取或設置地址
/// </summary>
public virtual string Address
{
get;
set;
}
/// <summary>
/// 獲取或設置郵箱地址
/// </summary>
public virtual string MailAddress
{
get;
set;
}
/// <summary>
/// 獲取或設置創建用戶ID
/// </summary>
public virtual string CreateUserID
{
get;
set;
}
/// <summary>
/// 獲取或設置創建時間
/// </summary>
public virtual DateTime CreateDT
{
get;
set;
}
/// <summary>
/// 獲取或設置最後修改用戶ID
/// </summary>
public virtual string LastUserID
{
get;
set;
}
/// <summary>
/// 獲取或設置最後修改時間
/// </summary>
public virtual DateTime LastChangeDT
{
get;
set;
}
/// <summary>
/// 獲取或設置序號
/// </summary>
public virtual int ListOrder
{
get;
set;
}
/// <summary>
/// 獲取或設置是否刪除,0=未刪除 1=已刪除
/// </summary>
public virtual byte IsDelete
{
get;
set;
}
/// <summary>
/// 獲取或設置性別, 0=男 1=女
/// </summary>
public virtual byte Sex
{
get;
set;
}
/// <summary>
/// 是否已登錄, 0=未登錄 1=已登錄
/// </summary>
public virtual byte IsLogin
{
get;
set;
}
#endregion
}
}
5.爲實體配置xml文件:該配置文件必須以“.hbm.xml”爲後綴名,如:實體PM_LoginLog的配置文件名爲“PM_LoginLog.hbm.xml”,配置如下:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernateTest" namespace="NHibernateTest.Entitys">
<!--PM_LoginLog實體配置-->
<class name="NHibernateTest.Entitys.PM_LoginLog,NHibernateTest" table="PM_LoginLog">
<id name="UserID" column="UserID" type="string" unsaved-value="0">
<generator class="increment"/>
</id>
<property name="UserName" column="UserName" type="string" />
<property name="PassWord" column="PassWord" type="string" />
<property name="LoginDT" column="LoginDT" type="DateTime" />
<property name="LogoutDT" column="LogoutDT" type="DateTime" />
<property name="RememberPassWord" column="RememberPassWord" type="byte" />
<property name="IsDelete" column="IsDelete" type="byte" />
<property name="IsNormalExit" column="IsNormalExit" type="byte" />
</class>
<!--PM_Users實體配置,如果已經指定了assembly和namespace,class的name屬性中就不用再指定了-->
<class name="PM_Users" table="PM_Users">
<id name="UserID" column="UserID" type="string" unsaved-value="0">
<generator class="increment"/>
</id>
<property name="UserName" column="UserName" type="string" />
<property name="PassWord" column="PassWord" type="string" />
<property name="Roles" column="Roles" type="byte" />
<property name="Fax" column="Fax" type="string" />
<property name="TelPhone" column="TelPhone" type="string" />
<property name="Address" column="Address" type="string" />
<property name="MailAddress" column="MailAddress" type="string" />
<property name="CreateUserID" column="Address" type="string" />
<property name="CreateDT" column="CreateDT" type="DateTime" />
<property name="LastUserID" column="LastUserID" type="string" />
<property name="LastChangeDT" column="LastChangeDT" type="DateTime" />
<property name="ListOrder" column="ListOrder" type="int" />
<property name="IsDelete" column="IsDelete" type="byte" />
<property name="Sex" column="Sex" type="byte" />
<property name="IsLogin" column="IsLogin" type="byte" />
</class>
</hibernate-mapping>
此處需要注意:必須將該文件屬性中的“生產操作”欄由“內容”改爲“嵌入的資源”,因爲NHibernate是通過查找程序集中的資源文件映射實體
6.配置數據庫,可以再應用程序配置文件裏面,也可以單獨在文件裏面配置
6.配置數據庫,可以再應用程序配置文件裏面,也可以單獨在文件裏面配置
(1)在應用程序配置文件(App.config)裏面配置,配置如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler,NHibernate"/>
</configSections>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">
Data Source=.;Initial Catalog=PM_Database;Persist Security Info=True;User ID=sa;pwd=221580
</property>
<property name="proxyfactory.factory_class">NHibernate.Bytecode.DefaultProxyFactoryFactory,NHibernate</property>
<property name="show_sql">true</property>
<property name="command_timeout">10</property>
<property name="adonet.batch_size">10</property>
<property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
<mapping assembly="NHibernateTest"/>
</session-factory>
</hibernate-configuration>
</configuration>
(2)在單獨的文件裏面配置,文件名爲:hibernate.cfg.xml,需要將該文件屬性中“複製到輸出目錄”項由“不復制”改爲“始終複製”。如下:<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">
Data Source=.;Initial Catalog=PM_Database;Persist Security Info=True;User ID=sa;pwd=221580
</property>
<property name="proxyfactory.factory_class">NHibernate.Bytecode.DefaultProxyFactoryFactory,NHibernate</property>
<property name="show_sql">true</property>
<property name="command_timeout">10</property>
<property name="adonet.batch_size">10</property>
<property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
<mapping assembly="NHibernateTest"/>
</session-factory>
</hibernate-configuration>
7.DB中的NHibernateHelper類namespace NHibernateTest.DB
{
public class NHibernateHelper
{
#region Properties
/// <summary>
/// 獲取Session會話
/// </summary>
public static ISession GetSession
{
get
{
return GetSessionFactory().OpenSession();
}
}
#endregion
#region Private Methods
/// <summary>
/// 獲取Session工廠
/// </summary>
/// <returns></returns>
private static ISessionFactory GetSessionFactory()
{
return (new Configuration()).Configure().BuildSessionFactory();
}
#endregion
}
}
8.DB中的PM_LoginLogDaonamespace NHibernateTest.DB
{
public class PM_LoginLogDao
{
#region Fields
private ISession _session = null;
#endregion
#region Constructors
/// <summary>
/// 初始化類PM_LoginLogDao的新實例
/// </summary>
public PM_LoginLogDao()
{
this._session = NHibernateHelper.GetSession;
}
#endregion
#region Public Methods
/// <summary>
/// 添加一條日誌記錄
/// </summary>
/// <param name="loginLog"></param>
public void Save(PM_LoginLog loginLog)
{
this._session.Save(loginLog);
this._session.Flush();
}
/// <summary>
/// 根據登錄用戶ID獲取登錄日誌
/// </summary>
/// <param name="userID"></param>
/// <returns></returns>
public PM_LoginLog GetLoginLog(string userID)
{
return this._session.Get<PM_LoginLog>(userID);
}
/// <summary>
/// 獲取所有登錄日誌
/// </summary>
/// <returns></returns>
public IList<PM_LoginLog> GetAllLoginLog()
{
IList<PM_LoginLog> pList = null;
pList = this._session.QueryOver<PM_LoginLog>().List();
return pList;
}
#endregion
}
}
9.DB中的PM_UsersDaonamespace NHibernateTest.DB
{
public class PM_UsersDao
{
#region Fields
private ISession _session = null;
#endregion
#region Constructors
/// <summary>
/// 初始化類PM_LoginLogDao的新實例
/// </summary>
public PM_UsersDao()
{
this._session = NHibernateHelper.GetSession;
}
#endregion
#region Public Methods
/// <summary>
/// 添加一條登錄用戶
/// </summary>
/// <param name="loginLog"></param>
public void Save(PM_Users user)
{
this._session.Save(user);
this._session.Flush();
}
/// <summary>
/// 根據登錄用戶ID獲取登錄用戶
/// </summary>
/// <param name="userID"></param>
/// <returns></returns>
public PM_Users GetUser(string userID)
{
return this._session.Get<PM_Users>(userID);
}
/// <summary>
/// 獲取所有用戶
/// </summary>
/// <returns></returns>
public IList<PM_Users> GetAllUser()
{
IList<PM_Users> pList = null;
pList = this._session.QueryOver<PM_Users>().List();
return pList;
}
#endregion
}
}
10.調用
namespace NHibernateTest
{
public class Program
{
public static void Main(string[] args)
{
PM_LoginLogDao pLoginLogDao = new PM_LoginLogDao();
var pLoginList = pLoginLogDao.GetAllLoginLog();
var pLogin = pLoginLogDao.GetLoginLog("katrina");
PM_UsersDao pUserDao = new PM_UsersDao();
var pUserList = pUserDao.GetAllUser();
var pUsr = pUserDao.GetUser("katrina");
}
}
}