C# 控制台+NHbidernate配置Mysql

本文参考链接: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语句。通过配置环境,将数据库的表元素抽象出来构建一个类对象。使得程序在后期有很好的扩展性维护性。

猜你喜欢

转载自blog.csdn.net/qq_24642743/article/details/81208221
今日推荐