1. 程式人生 > >通過Nhibernate連線Mysql資料庫

通過Nhibernate連線Mysql資料庫

通過nhibernate連線MySql 

1,新建一個工程  引入MySql.Data  和 Nhibernate   並在工程下新建一個Xml  名字為hibernate.cfg.xml  複製到目錄設定為始終複製 ! 程式碼如下

<?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> <!-- 版本改為 5-->
    <property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property><!--使用什麼資料庫-->
    <property name="connection.connection_string">Server=localhost;Database=mygamedb;User ID=root;Password=root</property> <!-- Data Source=FirstSample.sdf  改為Server= localhost;Database=mygamedb;user ID=root;Password=root -->
    <property name="show_sql">true</property>
  </session-factory>
</hibernate-configuration>

2.新建一個Model資料夾 下面建立User類 程式碼實現如下 

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sikiedu.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 Time { get; set; }

    }
}

3,新建檔案 Mappings 裡面新建一個Xml 名字為User .hbm.xml   屬性 內中的生成操作改為嵌入的資源!  程式碼實現如下
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="Sikiedu" 
                   namespace="Sikiedu.Model"> <!--assembly= Sikiedu 這是程式集的名稱  namespace 是指User在哪個名稱空間下的   -->

  <class name="User" table="users">
    <id name="Id" column="id" type="Int32">
       <generator class="native"></generator> <!--自動增漲--> <!--nativ 是本地 使用資料庫自帶的生成器-->
    </id>
    <property name="UserName" column ="username" type="String" ></property> 
    <property name="PassWord" column ="password" type="String" ></property>
    <property name="Time" column ="time" type="Date" ></property>

  </class>

</hibernate-mapping>

4.建立一個輔助類 NhibernateHelper 用來建立工廠...程式碼實現如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NHibernate.Cfg;
using NHibernate;

namespace Sikiedu
{
    class NHibernateHelper   // 幫助類 建立工廠等...
    {
        private static ISessionFactory _sessionFactory;
        private static ISessionFactory SessionFactory
        {
            get
            {
                if (_sessionFactory==null)
                {
                    var confuguration = new Configuration();
                    confuguration.Configure();//解析hibernate.cfg.xml
                    confuguration.AddAssembly("Sikiedu");//新增程式集
                    _sessionFactory= confuguration.BuildSessionFactory();
                }
                return _sessionFactory;
            }
        }

        public static ISession OpenSession()
        {
            return SessionFactory.OpenSession();
        }

    }
}


5.新建一個Manager資料夾 建立一個  建立一個介面 IUserManager 程式碼實現如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Sikiedu.Model;

namespace Sikiedu.Manager
{
    interface IUserManager
    {
        void Add(User user);
        void Update(User user);
        void Remove(User user);
        User GetById(int id);
        User GetByUserName(string username);

        ICollection<User> GetAllUsers(); //ICollection 是一個集合的介面

    }
}
6.繼續在Manager資料夾下建立一個UserManager類 程式碼實現如下 繼承 IUserManager 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Sikiedu.Model;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Criterion;


namespace Sikiedu.Manager
{
    class UserManager : IUserManager
    {
        public void Add(User user)
        {
            //ISession session = NHibernateHelper.OpenSession();
            //session.Save(user);
            //session.Close(); 
            using (ISession session = NHibernateHelper.OpenSession())
            { //呼叫NhibernateHelper 輔助類中的方法 會自動關閉
                using (ITransaction transaction = session.BeginTransaction()) //開啟一個事務  會自動釋放
                {
                    session.Save(user); //儲存user
                    transaction.Commit(); //事務的提交
                }
            }
        }
        public ICollection<User> GetAllUsers()
        {
            using (ISession session = NHibernateHelper.OpenSession())
            { //呼叫NhibernateHelper 輔助類中的方法 會自動關閉
              //using (ITransaction transaction = session.BeginTransaction()) //開啟一個事務  會自動釋放
              //{   //查詢不需要事務


                //    transaction.Commit(); //事務的提交
                // return user;
                // } 


                IList<User> users = session.CreateCriteria(typeof(User)).List<User>();
                return users;




            }
        }
        public User GetById(int id)
        {
            using (ISession session = NHibernateHelper.OpenSession())
            { //呼叫NhibernateHelper 輔助類中的方法 會自動關閉
                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())
            { //呼叫NhibernateHelper 輔助類中的方法 會自動關閉
              //using (ITransaction transaction = session.BeginTransaction()) //開啟一個事務  會自動釋放
              //{   //查詢不需要事務


                //    transaction.Commit(); //事務的提交
                // return user;
                // } 


                //CreateCriteria 用來指定查詢哪個表
                ICriteria critria = session.CreateCriteria(typeof(User)); //建立的是一個配置條件
                critria.Add(Restrictions.Eq("UserName", username)); //新增查詢條件
                User user = critria.UniqueResult<User>(); // 進行查詢  只得到一個查詢結果 


                // 或者改寫為
                // User user =session.CreateCriteria(typeof(User)).Add(Restrictions.Eq("UserName", username)).UniqueResult<User>();
                return user;
            }
        }
        public void Remove(User user)
        {
            using (ISession session = NHibernateHelper.OpenSession())
            { //呼叫NhibernateHelper 輔助類中的方法 會自動關閉
                using (ITransaction transaction = session.BeginTransaction()) //開啟一個事務  會自動釋放
                {
                    session.Delete(user); //刪除
                    transaction.Commit(); //事務的提交
                }
            }
        }
        public void Update(User user)  //更新時必須保證有主鍵
        {
            using (ISession session = NHibernateHelper.OpenSession())
            { //呼叫NhibernateHelper 輔助類中的方法 會自動關閉
                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<User>();
                if (user == null) return false;


                return true;


            }
        }
    }
}
7.在main函式開始 需要實現的功能

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NHibernate.Cfg;
using NHibernate;
using Sikiedu.Model;
using Sikiedu.Manager;
namespace Sikiedu
{
    class Program
    {
        static void Main(string[] args)
        {
            #region  第一次做的 簡單的 幫助理解
            // var configuration = new Configuration(); 


            // configuration.Configure();//解析hibernate.cfg.xml
            // configuration.AddAssembly("Sikiedu");//新增程式集  解析 對映檔案 User.hbm.xml
            //  ISessionFactory sessionfactory = null;
            //ITransaction transaction = null; //開啟事務的物件
            // ISession session = null;
            // try
            // {
            //     sessionfactory = configuration.BuildSessionFactory();//構建一個sessionfactory工廠
            //     session = sessionfactory.OpenSession();  //開啟跟資料庫的一個繪畫


            //    User user = new User() { UserName = "sdasdsd", PassWord = "222" };


            //     session.Save(user); //增加資料


            //     /// 事務  一個事務裡面有多個操作 如果一個出現失敗 則其他的操作會進行回滾(不進行任何操作)  保證資料的完整性和統一性
            // transaction = session.BeginTransaction();  //開啟事務
            //     ///進行操作
            //     User user1 = new User() { UserName = "sdfs", PassWord = "23f" };
            //     User user2 = new User() { UserName = "sdfs", PassWord = "222" };


            //     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();
            //     }
            // } 
            #endregion


            User user = new User() { };
            UserManager usermanager = new UserManager();
            //usermanager.Add(user);//新增USer
            //usermanager.Update(user);//更新User
            //usermanager.Remove(user);//刪除User
            // User userr=  usermanager.GetById(10);//查詢ID
            //User userr = usermanager.GetByUserName("f"); //查詢名字
            ICollection<User> users = usermanager.GetAllUsers();
            foreach (User item in users)
            {
                Console.WriteLine(item.UserName + "  " + item.Id + "  " + item.PassWord + "  " + item.Time);
            }
            Console.WriteLine(usermanager.VerifyUser("c","d")); 
            Console.WriteLine(usermanager.VerifyUser("c", "e"));


            //Console.WriteLine(userr.UserName+"  " +userr.Id+"  " +userr.PassWord +"  " +userr.Time);


            Console.ReadKey();
        }
    }
}

另附MySql圖片 方便理解