本文参考链接:NHibernate Codeproject
1. 在VS里面创建控制台示例程序
首先,创建一个C#控制台程序,在这里,我命名为UserNHibernateToMySQL。
2. 导入MySql.Data 和NHibernate的DLL文件
在项目引用上面右键,“管理NuGet程序包”,搜索并导入MySql.Data 和NHibernate的DLL文件,导入成功之后,如下图:
3. MySql数据配置NHibernate连接
在项目名称上右键,添加新建项,选择类型“xml文件”,名称为:hibernate.cfg.xml(一定得是这个名称,不然nhibernate的配置信息读取不出来)
文件内容如下:
<?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>
4. 类和表的映射关系建立
1.创建映射类
新建一个Model文件夹,在该文件夹下创建映射类。创建一个与数据库中的表对应的映射类。
using System;
namespace UserNHibernateToMySQL.Model
{
class User
{
//这里一定要加上virtual修饰
public virtual int Id { get; set; }
public virtual string Username { get; set;}
public virtual string Password { get; set; }
public virtual DateTime Registerdate { get; set; }
}
}
2.创建映射文件
新建一个Mappings文件夹,在该文件夹下创建上述创建User.cs对应的映射文件用于保存二者的映射关系。文件名称为User.hbm.xml。然后,在VS中,将该文件属性”生成操作”选为嵌入的资源。(目的,是为了保证User.cs与User.hbm.xml在一个程序集当中。)
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="UserNHibernateToMySQL" <!--为当前应用程序集名称-->
namespace="UserNHibernateToMySQL.Model"> <!--为上述创建User.cs文件的命名空间-->
<class name="User" table ="users">
<!--id配置主键-->
<id name="Id" column ="id" type ="Int32">
<!--id自动增长-->
<generator class="native" />
</id>
<property name="Username" column ="username" type ="String" />
<property name="Password" column ="password" type ="String" />
<property name="Registerdate" column ="registerdate" type ="Date" />
</class>
</hibernate-mapping>
5.在Main函数中测试配置的环境
using System;
using NHibernate;
using NHibernate.Cfg;
using UserNHibernateToMySQL.Model;
namespace UserNHibernateToMySQL
{
class Program
{
static void Main(string[] args)
{
var configuration = new Configuration();
//解析配置文件
configuration.Configure();//根据默认路径下解析hibernate.cfg.xml
//解析映射文件
configuration.AddAssembly("UserNHibernateToMySQL"); //解析User.hbm.xml;
ISessionFactory sessionFactory = null;
ISession session = null;
ITransaction transaction = null;
try {
sessionFactory = configuration.BuildSessionFactory();//seeion工厂
//打开与数据库的连接
session = sessionFactory.OpenSession();
//创建一个User对象
User user = new User { Username = "yyyy",Password = "7899"};
//将User对象插入到Mysql数据库中
//session.Save(user);
//创建事务
//一个事务里面包含多条增删改操作,若其中任何一个操作失败时,则回滚上个状态
transaction = session.BeginTransaction();
//创建两个User对象
User user1 = new User { Username = "yyyy1", Password = "7899" };
User user2 = new User { Username = "yyyy1", Password = "7899" };
//将两个User对象插入到Mysql数据库中(两个插入操作属于一个事务)
session.Save(user1);
session.Save(user2);
transaction.Commit();
//由于数据库里面用户名不能重复,因此,即使第一个插入成功,由于第二次未成功,所以发生回滚现象
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
finally {
if (transaction != null)
{
transaction.Dispose();
}
if (session != null)
{
session.Close();
}
if (sessionFactory != null)
{
sessionFactory.Close();
}
}
Console.ReadKey();
}
}
}
6.重构代码
由于每次操作都需要通过sessionFactory,因此,新建一个NHibernateHelper.cs文件.文件内容如下
using NHibernate;
using NHibernate.Cfg;
namespace UserNHibernateToMySQL
{
class NHibernateHelper
{
private static ISessionFactory _sessionFactory;
private static ISessionFactory SessionFactory
{
get {
if (_sessionFactory == null)
{
var configuration = new Configuration();//根据默认路径下解析hibernate.cfg.xml
//解析配置文件
configuration.Configure();
//解析映射文件
configuration.AddAssembly("UserNHibernateToMySQL");//解析User.hbm.xml;
_sessionFactory = configuration.BuildSessionFactory(); //创建seeion工厂
}
return _sessionFactory;
}
}
public static ISession OpenSession()
{
//打开与数据库的连接
return SessionFactory.OpenSession();
}
}
}
然后,再重新构建一个User管理接口IUserManager.cs
using System;
using System.Collections.Generic;
using System.Linq;
using UserNHibernateToMySQL.Model;
namespace UserNHibernateToMySQL.Manager
{
//User管理接口
interface IUserManager
{
void Add(User user); //添加用户
void Update(User user); //更新用户
void Remove(User user); //删除用户
User GetByID(int id); //根据ID得到用户
User GetByUsername(string username); //根据用户名得到用户
ICollection<User> GetAllUsers(); //得到所有用户,返回一个集合
bool VerifyUser(string username,string password);//登陆
}
}
构建了接口之后,再添加该接口的实现类UserManager.cs
using System.Collections.Generic;
using UserNHibernateToMySQL.Model;
using NHibernate;
using NHibernate.Criterion;
namespace UserNHibernateToMySQL.Manager
{
//
class UserManager : IUserManager
{
public void Add(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())
{
//创建一个查询条件对象
ICriteria criteria = session.CreateCriteria(typeof(User));
//查询操作
IList<User> users = criteria.List<User>();
return users;
}
}
//根据主键查询
public User GetByID(int id)
{
using (ISession session = NHibernateHelper.OpenSession())
{
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));//Username为User类的字段名
//查询操作
User user = criteria.UniqueResult<User>();//取得查询结果一条记录
return user;
}
}
//删除是根据主键实现的,因此User对象的主键必须存在
public void Remove(User user)
{
using (ISession session = NHibernateHelper.OpenSession())
{
using (ITransaction transaction = session.BeginTransaction())
{
session.Delete(user);
transaction.Commit();
}
}
}
//更新是根据主键实现的,因此User对象的主键必须存在
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())
{
//创建一个查询条件对象
ICriteria criteria = session.CreateCriteria(typeof(User));
//在查询条件对象中添加查询条件
criteria.Add(Restrictions.Eq("Username", username));//Username为User类的字段名
criteria.Add(Restrictions.Eq("Password", password));//Username为User类的字段名
//查询操作
User user = criteria.UniqueResult<User>();//取得查询结果一条记录
if (user == null) return false;
else return true;
}
}
}
}
测试类Program.cs
using System;
using NHibernate;
using NHibernate.Cfg;
using UserNHibernateToMySQL.Model;
using UserNHibernateToMySQL.Manager;
using System.Collections.Generic;
namespace UserNHibernateToMySQL
{
class Program
{
static void Main(string[] args)
{
User user = new User { Id = 20 ,Username = "yyyy2", Password = "7899" };
User user1 = new User { Id = 20};
IUserManager userManager = new UserManager();
//userManager.Add(user);
//userManager.Update(user);
//userManager.Remove(user1);
//User user3 = userManager.GetByID(4);
//User user3 = userManager.GetByUsername("qt");
//Console.WriteLine(user3.Username + " " + user3.Password + " " + user3.Registerdate);
//ICollection<User> users = userManager.GetAllUsers();
//foreach (User user3 in users)
//{
// Console.WriteLine(user3.Username + " " + user3.Password + " " + user3.Registerdate);
//}
Console.WriteLine(userManager.VerifyUser("qt","456")); //True
Console.WriteLine(userManager.VerifyUser("qt", "4567")); // False
Console.ReadKey();
}
}
}
7.小结
个人感觉NHibernate的优势就是,避免书写复杂的SQL语句。通过配置环境,将数据库的表元素抽象出来构建一个类对象。使得程序在后期有很好的扩展性维护性。