Visual Studio新建一个C#控制台程序,设为启动项,在项目属性中设置目标框架为.NET Framework4.5。
添加两个DLL引用:MySQL.Data.dll和NHibernate.dll。后者在NHibernate官网中下载或者直接从Nuget安装。
新建一个文件hibernate.cfg.xml。该配置文件的内容复制于NHibernate文档(搜Configure NHibernate)。因为文档中连接的是SqlServer,而我们要用的是MySQL,所以要做如下修改。配置文档的写法参考NHibernate连接MySQL案例。<?xml version="1.0" encoding="utf-8" ?>
NHibernate.Connection.DriverConnectionProvider
NHibernate.Dialect.MySQL5Dialect
NHibernate.Driver.MySqlDataDriver
Server=localhost;Database=mygamedb;User ID=root;Password=root
true
已知MySQL数据库中的表和内容如下图:
项目根目录新建Model文件夹,在该文件夹下新建User.cs类。内容如下:
namespaceNHibernateConnectMySQL.Model
{public classUser
{public virtual int Id { get; set; }public virtual string UserName { get; set; }public virtual string UserPwd { get; set; }public virtual DateTime UserRegisterTime { get; set; }
}
}
项目根目录新建Mappings文件夹,在该文件夹下新建User.hbm.xml文件(命名习惯上与要关联的User.cs类命名一致)。写法同样参考官方文档(搜The complete mapping file)。
在【属性】窗体修改hibernate.cfg.xml的【复制到输出路径】为【始终复制】。修改User.hbm.xml的【生成操作】为【嵌入的资源】。然后生成项目。可以在Debug目录下看到hibernate.cfg.xml文件直接被复制过来了,而User.hbm.xml的内容被集成到了exe文件中。
写代码完成NHibernate初始化操作,就是解析数据库链接配置文件(即hibernate.cfg.xml)和各种表映射文件(User.hbm.xml等等)。通常在项目的主函数中执行。
测试插入一条纪录,代码如下:
usingNHibernate;usingNHibernate.Cfg;usingNHibernateConnectMySQL.Model;usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceNHibernateConnectMySQL
{classProgram
{static void Main(string[] args)
{//---- NHibernate初始化 ----
var conf = newConfiguration();//解析hibernate.cfg.xml
conf.Configure(); //参数为文件,缺省值就是hibernate.cfg.xml//解析表映射文件(User.hbm.xml等),表映射文件已被集成到程序集中(嵌入的资源)//conf.AddAssembly("NHibernateConnectMySQL");//参数为文件所在的程序集,已在hibernate.cfg.xml中声明//---- 完成初始化 ----//---- 连接数据库 ----
ISessionFactory sessionFactory = null;
ISession session= null;
ITransaction transaction= null;try{//连接数据库的会话工厂
sessionFactory =conf.BuildSessionFactory();//打开一个跟数据库的会话
session =sessionFactory.OpenSession();//开启事务
transaction =session.BeginTransaction();
User user1= new User() { UserName = "jjssag2", UserPwd = "4606519"};
User user2= new User() { UserName = "jjssag3", UserPwd = "46064519"};
session.Save(user1);
session.Save(user2);//提交事务
transaction.Commit();
}catch(Exception e)
{
Console.WriteLine(e);
}finally{if (transaction != null)
{
transaction.Dispose();
}if (session != null)
{
session.Close();
}if (sessionFactory != null)
{
sessionFactory.Close();
}
}
Console.ReadKey();
}
}
}
完善增删改查
项目目录如下:
由于每次操作都要开启一个会话Session,都要使用事务Transaction,所以考虑将重复的内容进行封装,写一个NHibernateHelper.cs工具类。
usingNHibernate.Cfg;usingNHibernate;namespaceNHibernateConnectMySQL
{classNHibernateHelper
{private staticISessionFactory _sessionFactory;public staticISessionFactory SessionFactory
{get{if (_sessionFactory == null)
{var conf = newConfiguration();
conf.Configure();
conf.AddAssembly("NHibernateConnectMySQL");
_sessionFactory=conf.BuildSessionFactory();
}return_sessionFactory;
}
}public staticISession OpenSession()
{returnSessionFactory.OpenSession();
}
}
}
Manager文件夹下是各个类的增删改查操作实现。
usingSystem.Collections.Generic;usingNHibernateConnectMySQL.Model;usingNHibernate;usingNHibernate.Criterion;namespaceNHibernateConnectMySQL.Manager
{classUserManager : IUserManager
{//插入一条纪录
public voidAdd(User user)
{using (ISession session =NHibernateHelper.SessionFactory.OpenSession())
{using (ITransaction transaction =session.BeginTransaction())
{
session.Save(user);
transaction.Commit();
}
}
}//删除一条纪录
public voidDelete(User user)
{using (ISession session =NHibernateHelper.SessionFactory.OpenSession())
{using (ITransaction transaction =session.BeginTransaction())
{
session.Delete(user);
transaction.Commit();
}
}
}//更新一条纪录
public voidUpdate(User user)
{using (ISession session =NHibernateHelper.SessionFactory.OpenSession())
{using (ITransaction transaction =session.BeginTransaction())
{
session.Update(user);
transaction.Commit();
}
}
}//查询一条纪录
public User GetUserByID(intid)
{using (ISession session =NHibernateHelper.SessionFactory.OpenSession())
{//查询不会对数据进行操作,可以不用事务
User user = session.Get(id);returnuser;
}
}//查询一条纪录
public User GetUserByUserName(stringuserName)
{using (ISession session =NHibernateHelper.SessionFactory.OpenSession())
{//ICriteria criteria = session.CreateCriteria(typeof(User));//添加查询条件为传入的参数等于实体类中的属性//criteria.Add(Restrictions.Eq("UserName", userName));//User user = criteria.UniqueResult();
User user=session
.CreateCriteria(typeof(User))
.Add(Restrictions.Eq("UserName", userName))
.UniqueResult();returnuser;
}
}//查询多条纪录
public ICollectionGetAllUsers()
{using (ISession session =NHibernateHelper.SessionFactory.OpenSession())
{
IList list = session.CreateCriteria(typeof(User)).List();returnlist;
}
}//校验登录
public bool VerifyUser(string userName, stringpassword)
{using (ISession session =NHibernateHelper.SessionFactory.OpenSession())
{
User user=session
.CreateCriteria(typeof(User))
.Add(Restrictions.Eq("UserName", userName))
.Add(Restrictions.Eq("UserPwd", password))
.UniqueResult();if (user == null)return false;else
return true;
}
}
}
}
在主函数中调用增删改查方法。
usingNHibernateConnectMySQL.Manager;usingSystem;namespaceNHibernateConnectMySQL
{classProgram
{static void Main(string[] args)
{UserManager userManager= newUserManager();//插入数据//User user = new User() { UserName = "3643uhyrjut", UserPwd = "123453143" };//UserManager userManager = new UserManager();//userManager.Add(user);//查询单条纪录//User user = userManager.GetUserByUserName("agr43");//Console.WriteLine(user.UserPwd);//查询多条纪录//ICollection list = userManager.GetAllUsers();//foreach (User item in list)//{//Console.WriteLine(item.UserPwd);//}//验证登录//Console.WriteLine(userManager.VerifyUser("jjssag1", "4606519"));
Console.ReadKey();
}
}
}
坑点如果当前解决方案下有多个项目,在总的配置文件中(hibernate.cfg.xml)一定要指定是哪个程序集,或者代码中用conf.AddAssembly()指定!否则报错如下图: