频道栏目
首页 > 资讯 > MySQL > 正文

NHibernate和MySQL的交互实践

18-06-16        来源:[db:作者]  
收藏   我要投稿

NHibernate是一个面向.NET环境的对象/关系数据库映射工具。对象/关系数据库映射(object/relational mapping,ORM)这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。

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,名称不可更改其他,将属性修改为始终复制。

内容如下:



  
    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为数据库密码。

4. 表与对象配置文件(User.hbm.xml)

新建了一个文件夹Mappings,再新建xml文件User.hbm.xml,用于绑定User对象与表中属性;将此文件嵌入程序集中,即修改属性生成操作为嵌入的资源。

内容如下:


 

  
    
    
    
    
    
    
  


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 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 GetAllUsers()
        {
            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;
            }
        }
    }
}

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 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();
        }
    }
}
相关TAG标签
上一篇:Android源码-Handler分析
下一篇:windows系统下利用IIS搭建web和ftp服务以及防火墙配置的步骤教程
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站