通過Nhibernate連線Mysql資料庫
阿新 • • 發佈:2019-02-17
通過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圖片 方便理解