NHibernate 从数据库底层来持久化你的.Net 对象到关系型数据库。NHibernate 为你处理这些,远胜于你不得不写SQL去从数据库存取对象。你的代码仅仅和对象关联,NHibernat 自动产生SQL语句,并确保对象提交到正确的表和字段中去。
1.概述
新建项目后,要引入MySql.Data和NHibernate,可用vs的NuGet工具方便添加这两项引用;并将工程的程序集和命名空间修改如下(右键项目选择属性)。在此之前已经建好了一个数据库mygamedb,用到了数据库中的Users表。如下:
2. 映射对象(User.cs)
新建Model文件夹,将User.cs放于此,User定义了表中相应的字段值。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Mynhibernate.Model
{
public class User
{
public virtual int ID { get; set; }
public virtual string Username { get; set; }
public virtual string Password { get; set; }
public virtual DateTime Registerdate { get; set; }
}
}
3. 连接数据库的配置文件(hibernate.cfg.xml)
在工程下新建xml文件,名称改为hibernate.cfg.xml,名称不可更改其他,将属性修改为始终复制。
内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="dialect">NHibernate.Dialect.MySQL5Dialect</property><!--版本-->
<property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property><!--使用什么数据库-->
<property name="connection.connection_string">Server=localhost;Database=mygamedb;User ID=root;Password=root;</property>
<property name="show_sql">true</property>
</session-factory>
</hibernate-configuration>
其中
<property name="connection.connection_string">Server=localhost;Database=mygamedb;User ID=root;Password=root;</property>
Server为连接的IP,Database为数据库名字,User ID为登录用户名,Password为数据库密码。
4. 表与对象配置文件(User.hbm.xml)
新建了一个文件夹Mappings,再新建xml文件User.hbm.xml,用于绑定User对象与表中属性;将此文件嵌入程序集中,即修改属性生成操作为嵌入的资源。
内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="Mynhibernate"
namespace="Mynhibernate.Model"> <!--assembly表示程序集,namespace所在文件夹Model-->
<class name="User" table="users"><!--name为类名,table为表名-->
<id name="ID" column="id" type="Int32"><!--id name对应为类中变量名,type为nhibernate的类型-->
<generator class="native"></generator>
</id><!--主键配置完成-->
<property name="Username" column="username" type="String"></property>
<property name="Password" column="password" type="String"></property>
<property name="Registerdate" column="registerdate" type="Date"></property>
</class>
</hibernate-mapping>
5. NHibernate的操作封装(NHibernateHelper.cs)
将NHibernate的创建会话和打开会话封装。
using NHibernate;
using NHibernate.Cfg;
namespace Mynhibernate
{
class NHibernateHelper
{
private static ISessionFactory _sessionFactory;
private static ISessionFactory SessionFactory
{
get
{
if(_sessionFactory==null)
{
var configuration = new Configuration();
configuration.Configure();//解析hibernate.cfg.xml
configuration.AddAssembly("Mynhibernate");//解析映射文件User.hbm.xml
_sessionFactory = configuration.BuildSessionFactory();
}
return _sessionFactory;
}
}
public static ISession OpenSession()
{
return SessionFactory.OpenSession();//打开一个跟数据库的会话
}
}
}
6. 用户的操作管理
新建文件夹Manager。
6.1 用户管理接口(IUserManager.cs)
定义操作Users的方法。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Mynhibernate.Model;
namespace Mynhibernate.Manager
{
interface IUserManager
{
void Add(User user);
void Update(User user);
void Remove(User user);
User GetById(int id);
User GetByUsername(string username);
ICollection<User> GetAllUsers();
bool VerifyUser(string username, string password);//验证用户名和密码
}
}
6.2 实现接口(UserManager.cs)
using System;
using System.Collections.Generic;
using Mynhibernate.Model;
using NHibernate;
using NHibernate.Criterion;
namespace Mynhibernate.Manager
{
class UserManager : IUserManager
{
public void Add(Model.User user)
{
/*第一种
ISession session = NHibernateHelper.OpenSession();
session.Save(user);
session.Close();
*/
using (ISession session = NHibernateHelper.OpenSession())
{
using (ITransaction transaction = session.BeginTransaction())
{
session.Save(user);
transaction.Commit();
}
}
}
public ICollection<User> GetAllUsers()
{
using (ISession session = NHibernateHelper.OpenSession())
{
IList<User> users = session.CreateCriteria(typeof(User)).List<User>();
return users;
}
}
public User GetById(int id)
{
using (ISession session = NHibernateHelper.OpenSession())
{
//事务(事务中的一系列事件,只要有一个不成功,之前成功的也会回滚,即插入成功的又被删除,修改成功的又恢复.....)
// transaction = session.BeginTransaction();//开启事务
using (ITransaction transaction = session.BeginTransaction())
{
User user= session.Get<User>(id);
transaction.Commit();
return user;
}
}
}
public User GetByUsername(string username)
{
using (ISession session = NHibernateHelper.OpenSession())
{
/*
ICriteria criteria= session.CreateCriteria(typeof(User));
criteria.Add(Restrictions.Eq("Username", username));//添加一个查询条件,第一个参数表示对哪个属性(字段)做限制,第二个表示值为多少
User user = criteria.UniqueResult<User>();
*/
User user = session.CreateCriteria(typeof(User)).Add(Restrictions.Eq("Username", username)).UniqueResult<User>();
return user;
}
}
/// <summary>
/// NHibernate删除时根据主键更新,所以传来的对象user中得有主键
/// </summary>
/// <param name="user"></param>
public void Remove(User user)
{
using (ISession session = NHibernateHelper.OpenSession())
{
using (ITransaction transaction = session.BeginTransaction())
{
session.Delete(user);
transaction.Commit();
}
}
}
/// <summary>
/// NHibernate更新时根据主键更新,所以传来的对象user中得有主键
/// </summary>
/// <param name="user"></param>
public void Update(User user)
{
using (ISession session = NHibernateHelper.OpenSession())
{
using (ITransaction transaction = session.BeginTransaction())
{
session.Update(user);
transaction.Commit();
}
}
}
public bool VerifyUser(string username, string password)
{
using (ISession session = NHibernateHelper.OpenSession())
{
User user = session
.CreateCriteria(typeof(User))
.Add(Restrictions.Eq("Username", username))
.Add(Restrictions.Eq("Password", password))
.UniqueResult<User>();
if (user == null) return false;
return true;
}
}
}
}
7. 运行(Program.cs)
using System;
using System.Collections.Generic;
using Mynhibernate.Model;
using NHibernate.Cfg;
using NHibernate;
using Mynhibernate.Manager;
namespace Mynhibernate
{
class Program
{
static void Main(string[] args)
{
/*******插入********************
User user = new User() { Username = "ww8w2w", Password = "e8e2ee"};
IUserManager userManager = new UserManager();
userManager.Add(user);
***************************/
/****修改******************
User user = new User() { ID = 4, Username = "2018", Password = "eedd" };
IUserManager userManager = new UserManager();
userManager.Update(user);
*********************/
/****删除******************
User user = new User() { ID = 9};
IUserManager userManager = new UserManager();
userManager.Remove(user);
*********************/
/****通过ID查找*********************
IUserManager userManager = new UserManager();
User user = userManager.GetById(1);
Console.WriteLine(user.Username);
Console.WriteLine(user.Password);
*********************************/
/****通过username查找***********************
IUserManager userManager = new UserManager();
User user = userManager.GetByUsername("xll");
Console.WriteLine(user.Username);
Console.WriteLine(user.Password);
*****************************/
/***查询表中所有内容***********************
IUserManager userManager = new UserManager();
ICollection<User> users = userManager.GetAllUsers();
foreach(User u in users)
{
Console.WriteLine(u.Username+" "+u.Password);
}
**************************/
//***匹配账户*********************
IUserManager userManager = new UserManager();
Console.WriteLine(userManager.VerifyUser("xll","eee"));//true
Console.WriteLine(userManager.VerifyUser("5l", "eee"));//false
//*************************/
Console.ReadKey();
}
}
}