NHibernate是一个面向.NET环境的对象/关系数据库映射工具。对象/关系数据库映射(object/relational mapping,ORM)这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。
NHibernate 从数据库底层来持久化你的.Net 对象到关系型数据库。NHibernate 为你处理这些,远胜于你不得不写SQL去从数据库存取对象。你的代码仅仅和对象关联,NHibernat 自动产生SQL语句,并确保对象提交到正确的表和字段中去。
新建项目后,要引入MySql.Data和NHibernate,可用vs的NuGet工具方便添加这两项引用;并将工程的程序集和命名空间修改如下(右键项目选择属性)。在此之前已经建好了一个数据库mygamedb,用到了数据库中的Users表。如下:
新建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; } } }
在工程下新建xml文件,名称改为hibernate.cfg.xml,名称不可更改其他,将属性修改为始终复制。
内容如下:
其中NHibernate.Connection.DriverConnectionProvider NHibernate.Dialect.MySQL5Dialect NHibernate.Driver.MySqlDataDriver Server=localhost;Database=mygamedb;User ID=root;Password=root; true
Server=localhost;Database=mygamedb;User ID=root;Password=root;
Server为连接的IP,Database为数据库名字,User ID为登录用户名,Password为数据库密码。
新建了一个文件夹Mappings,再新建xml文件User.hbm.xml,用于绑定User对象与表中属性;将此文件嵌入程序集中,即修改属性生成操作为嵌入的资源。
内容如下:
将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();//打开一个跟数据库的会话 } } }
新建文件夹Manager。
定义操作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); ICollectionGetAllUsers(); bool VerifyUser(string username, string password);//验证用户名和密码 } }
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 ICollectionGetAllUsers() { using (ISession session = NHibernateHelper.OpenSession()) { IList users = session.CreateCriteria(typeof(User)).List (); return users; } } public User GetById(int id) { using (ISession session = NHibernateHelper.OpenSession()) { //事务(事务中的一系列事件,只要有一个不成功,之前成功的也会回滚,即插入成功的又被删除,修改成功的又恢复.....) // transaction = session.BeginTransaction();//开启事务 using (ITransaction transaction = session.BeginTransaction()) { User user= session.Get (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 = session.CreateCriteria(typeof(User)).Add(Restrictions.Eq("Username", username)).UniqueResult (); return user; } } /// /// NHibernate删除时根据主键更新,所以传来的对象user中得有主键 /// /// public void Remove(User user) { using (ISession session = NHibernateHelper.OpenSession()) { using (ITransaction transaction = session.BeginTransaction()) { session.Delete(user); transaction.Commit(); } } } ////// NHibernate更新时根据主键更新,所以传来的对象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()) { User user = session .CreateCriteria(typeof(User)) .Add(Restrictions.Eq("Username", username)) .Add(Restrictions.Eq("Password", password)) .UniqueResult(); if (user == null) return false; return true; } } } }
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(); ICollectionusers = 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(); } } }