NHibernateLinq简单的CRUD操作
????? 因為最近在做一些有關數據庫方面的開發,其實,說白了,就是對數據庫的CRUD操作,寫了n多的存儲過程,倒不是說存儲過程多難,關鍵是在后期的維護方面有點頭疼,沒辦法,研究一下ORM吧。
????? 下面分別是用NHibernate和Linq實現的簡單的CRUD操作,當是一開始的練練手(開關環境:VS08+SQL2000)。
?????? ①:NHibernate
???????不管三七二十一,先看看實體類吧。(數據庫代碼省略,映射文件對應著表結構)??
代碼 ????public?class?User????{
????????#region?構造函數
????????///?<summary>
????????///?用戶信息
????????///?</summary>
????????public?User()?{?}
????????#endregion
????????#region?屬性
????????private?int?userID;
????????///?<summary>
????????///?用戶ID
????????///?</summary>
????????public?virtual?int?UserID
????????{
????????????get
????????????{
????????????????return?userID;
????????????}
????????????set
????????????{
????????????????userID?=?value;
????????????}
????????}
????????private?string?userName;
????????///?<summary>
????????///?用戶姓名
????????///?</summary>
????????public?virtual?string?UserName
????????{
????????????get
????????????{
????????????????return?userName;
????????????}
????????????set
????????????{
????????????????userName?=?value;
????????????}
????????}
????????private?string?userPwd;
????????///?<summary>
????????///?用戶密碼
????????///?</summary>
????????public?virtual?string?UserPwd
????????{
????????????get
????????????{
????????????????return?userPwd;
????????????}
????????????set
????????????{
????????????????userPwd?=?value;
????????????}
????????}
????????private?int?userAge;
????????///?<summary>
????????///?用戶年齡
????????///?</summary>
????????public?virtual?int?UserAge
????????{
????????????get
????????????{
????????????????return?userAge;
????????????}
????????????set
????????????{
????????????????userAge?=?value;
????????????}
????????}
????????#endregion
????}
?
????? 這里用的NHibernate是NHibernate-2.1.2.GA-bin,映射文件如下(注意映射文件中nh的版本號):
代碼 <?xml?version="1.0"?encoding="utf-8"??><hibernate-mapping?xmlns="urn:nhibernate-mapping-2.2"?>
??<class?name="NHUser.User,NHUser"?table="UserInfo">?//NHUser為命名空間、UserInfo為數據表名
????<id?name="UserID"?type="Int32"?unsaved-value="null">
??????<column?name="UserID"?length="4"?sql-type="int"?not-null="true"?unique="true"?index="PK_UserInfo"/>
??????<generator?class="native"/>
????</id>
????<property?name="UserName"?type="String">
??????<column?name="UserName"?length="50"?sql-type="nvarchar"?not-null="false"/>
????</property>
????<property?name="UserPwd"?type="String">
??????<column?name="UserPwd"?length="50"?sql-type="nvarchar"?not-null="false"/>
????</property>
????<property?name="UserAge"?type="Int32">
??????<column?name="UserAge"?length="4"?sql-type="int"?/>
????</property>
??</class>
</hibernate-mapping>
?
????? 基本工作還剩下個配置文件hibernate.cfg.xml
代碼 <?xml?version="1.0"?encoding="utf-8"??><hibernate-configuration?xmlns="urn:nhibernate-configuration-2.2">
??<session-factory>
????<property?name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
????<property?name="connection.connection_string">Server=localhost;uid=sa;pwd=123456;database=NunitUser;Integrated?Security=SSPI</property>
????<property?name="dialect">NHibernate.Dialect.MsSql2000Dialect</property>
????<property?name="adonet.batch_size">100</property>
????<property?name='proxyfactory.factory_class'>
??????NHibernate.ByteCode.Castle.ProxyFactoryFactory,NHibernate.ByteCode.Castle
????</property>
????<mapping?assembly="NHUser"/>
??</session-factory>
</hibernate-configuration>
?
????? OK!準備工作over了,下面看看CRUD的操作代碼吧
代碼 namespace?NHUser{
????public?partial?class?NHCRUD?:?Form
????{
????????public?NHCRUD()
????????{
????????????InitializeComponent();
????????}
????????private?void?btnOK_Click(object?sender,?EventArgs?e)
????????{
????????????try
????????????{
????????????????string?username?=?this.tbUserName.Text.ToString();
????????????????string?userpwd?=?this.tbUserPwd.Text.ToString();
????????????????int?userage?=?Convert.ToInt32(this.tbUserAge.Text.ToString());
????????????????//定義配置文件
????????????????Configuration?cfg?=?new?Configuration();
????????????????cfg.Configure();
????????????????//創建會話工廠
????????????????ISessionFactory?factory?=?cfg.BuildSessionFactory();
????????????????ISession?session?=?factory.OpenSession();
????????????????//用戶賦值
??????????????? User?user?=?new?User();
????????????????user.UserName?=?username;
????????????????user.UserPwd?=?userpwd;
????????????????user.UserAge?=?userage;
????????????????//開啟事務
????????????????ITransaction?trans?=?session.BeginTransaction();
????????????????try
????????????????{
????????????????????session.Save(user); ????????????????????//Commit
????????????????????trans.Commit();
????????????????????MessageBox.Show("用戶數據插入成功!",?"系統提示!");
????????????????????this.Close();
????????????????}
????????????????catch?(Exception?ex)
????????????????{
????????????????????trans.Rollback();
????????????????????MessageBox.Show("用戶數據插入失敗!"?+?ex.Message,?"系統提示!");
????????????????}
????????????}
????????????catch?(Exception?ex)
????????????{
????????????????MessageBox.Show(ex.Message,?"錯誤提示!");
????????????}
????????}
????????///?<summary>
????????///?查詢指定數據
????????///?</summary>
????????private?void?btnRead_Click(object?sender,?EventArgs?e)
????????{
????????????//定義配置文件
????????????Configuration?cfg?=?new?Configuration();
??????????? cfg.Configure();
????????????//創建會話工廠
????????????ISessionFactory?factory?=?cfg.BuildSessionFactory();
????????????using?(ISession?session?=?factory.OpenSession())
????????????{
????????????????IList?users?=?session.CreateCriteria(typeof(User)).Add(Expression.Eq("UserName",?"dukeyongwang")).List();
????????????????foreach?(User?user?in?users)
????????????????{
????????????????????Console.WriteLine("UserID:"?+?user.UserID?+?"——>UserName:"?+?user.UserName?+?"——>UserPwd:"?+?user.UserPwd?+?"——>UserAge:"?+?user.UserAge);
????????????????}
????????????}
????????}
????????///?<summary>
????????///?修改
????????///?</summary>
????????private?void?btnUpdate_Click(object?sender,?EventArgs?e)
????????{
????????????//定義配置文件
????????????Configuration?cfg?=?new?Configuration();
????????????cfg.Configure();
????????????//創建會話工廠
????????????ISessionFactory?factory?=?cfg.BuildSessionFactory();
????????????try
????????????{
????????????????using?(ISession?session?=?factory.OpenSession())
????????????????{
????????????????????User?user?=?session.Load(typeof(User),?5)?as?User;
????????????????????Console.WriteLine("修改前==>>UserID:"?+?user.UserID?+?"——>UserName:"?+?user.UserName?+?"——>UserPwd:"?+?user.UserPwd?+?"——>UserAge:"?+?user.UserAge);
????????????????????user.UserName?=?"dukeyongwang";
????????????????????user.UserPwd?=?"dkwang";
????????????????????user.UserAge?=?25;
????????????????????using?(ITransaction?trans?=?session.BeginTransaction())
????????????????????{
????????????????????????session.Update(user,?user.UserID);
????????????????????????User?updateUser?=?session.Load(typeof(User),?user.UserID)?as?User;
????????????????????????//修改后
????????????????????????Console.WriteLine("修改后==>>UserID:"?+?updateUser.UserID?+?"——>UserName:"?+?updateUser.UserName?+?"——>UserPwd:"?+?updateUser.UserPwd?+?"——>UserAge:"?+?updateUser.UserAge);
????????????????????????trans.Commit();
????????????????????}
????????????????}
????????????}
????????????catch?(Exception?ex)
????????????{
????????????????MessageBox.Show("修改時錯誤:"?+?ex.Message,?"錯誤提示!");
????????????}
????????}
????????///?<summary>
????????///?刪除(可通過查詢出來的實體對象,然后刪除)
????????///?</summary>
????????private?void?btnDel_Click(object?sender,?EventArgs?e)
????????{
???????????//定義配置文件
????????????Configuration?cfg?=?new?Configuration();
???????????cfg.Configure();
???????????//創建會話工廠
????????????ISessionFactory?factory?=?cfg.BuildSessionFactory();
????????????using?(ISession?session?=?factory.OpenSession())
????????????{
????????????????using?(ITransaction?trans?=?session.BeginTransaction())
????????????????{
????????????????????User?newUser?=?session.Load(typeof(User),?6)?as?User;
????????????????????//刪除
????????????????????session.Delete(newUser);
????????????????????
????????????????????trans.Commit();
????????????????}
????????????}
????????}
????}
}
?
???? 運行以上代碼,就可以實現數據的CRUD,感覺沒有SQL,代碼清爽了許多。呵呵。。。。
???? ②:Linq
???? 在linq中少了NHibernate的映射文件,這部分實現在實體類中通過TableAttribute和ColumnAttribute實現,少建一個xml文件,也許你會說,現在的映射文件可以自動生成,好吧,我承認的確是可以。
代碼 [Table(Name="UserInfo")]????public?class?User
????{
????????private?int?userID;
????????///?<summary>
????????///?用戶ID
????????///?</summary>
????????[Column(DbType="int",IsPrimaryKey=true,IsDbGenerated=true)]
????????public?int?UserID
????????{
????????????get
????????????{
????????????????return?userID;
????????????}
????????????set
????????????{
????????????????userID?=?value;
????????????}
????????}
????????private?string?userName;
????????///?<summary>
????????///?用戶姓名
????????///?</summary>
????????[Column(DbType="nvarchar(50)")]
????????public?string?UserName
????????{
????????????get
????????????{
????????????????return?userName;
????????????}
????????????set
????????????{
????????????????userName?=?value;
????????????}
????????}
????????private?string?userPwd;
????????///?<summary>
????????///?用戶密碼
????????///?</summary>
????????[Column(DbType="nvarchar(50)")]
????????public?string?UserPwd
????????{
????????????get
????????????{
????????????????return?userPwd;
????????????}
????????????set
????????????{
????????????????userPwd?=?value;
????????????}
????????}
????????private?int?userAge;
????????///?<summary>
????????///?用戶年齡
????????///?</summary>
????????[Column(DbType="int")]
????????public?int?UserAge
????????{
????????????get
????????????{
????????????????return?userAge;
????????????}
????????????set
????????????{
????????????????userAge?=?value;
????????????}
????????}
????}
?
??? 好了,現在就可以看看在LINQ中如何完成CRUD的操作:
代碼 namespace?LinqUser{
????public?partial?class?LinqCRUD?:?Form
????{ ????????//映射實體 ????????DataContext?objContext?=?null;
????????public?LinqCRUD()
????????{
????????????InitializeComponent();
????????????string?strConnection?=?"Server=localhost;uid=sa;pwd=123456;database=NunitUser;Integrated?Security=SSPI";
????????????objContext?=?new?DataContext(strConnection);
????????}
????????#region?數據CRUD
????????///?<summary>
????????///?數據插入
????????///?</summary>
????????private?void?btnCreate_Click(object?sender,?EventArgs?e)
????????{
????????????try
????????????{
????????????????string?userName?=?this.tbUserName.Text.ToString();
????????????????string?userPwd?=?this.tbUserPwd.Text.ToString();
????????????????int?userAge?=?Convert.ToInt32(this.tbUserAge.Text.ToString());
????????????????User?user?=?new?User();
????????????????user.UserName?=?userName;
????????????????user.UserPwd?=?userPwd;
????????????????user.UserAge?=?userAge;
????????????????
????????????????//插入
????????????????objContext.GetTable<User>().InsertOnSubmit(user);
????????????????//提交
????????????????objContext.SubmitChanges();
????????????????MessageBox.Show("插入數據成功!",?"系統提示!");
????????????}
????????????catch?(Exception?ex)
????????????{
????????????????MessageBox.Show("插入數據時錯誤:"?+?ex.Message,?"系統提示!");
????????????}
????????}
????????///?<summary>
????????///?數據修改
????????///?</summary>
????????private?void?btnUpdate_Click(object?sender,?EventArgs?e)
????????{
????????????try
????????????{
????????????????var?myUpdate?=?from?user?in?objContext.GetTable<User>()
???????????????????????????????where?user.UserID?==?1
???????????????????????????????select?user;
????????????????User?userUpdate?=?myUpdate.First<User>()?as?User;
????????????????if?(null?==?userUpdate)?return;
????????????????userUpdate.UserName?=?this.tbUserName.Text.ToString();
????????????????userUpdate.UserPwd?=?this.tbUserPwd.Text.ToString();
????????????????userUpdate.UserAge?=?Convert.ToInt32(this.tbUserAge.Text.ToString());
????????????????//提交
????????????????objContext.SubmitChanges();
????????????????MessageBox.Show("修改數據成功!",?"系統提示!");
????????????}
????????????catch?(Exception?ex)
????????????{
????????????????MessageBox.Show("修改數據時錯誤:"?+?ex.Message,?"系統提示!");
????????????}
????????}
????????///?<summary>
????????///?數據刪除
????????///?</summary>
????????private?void?btnDel_Click(object?sender,?EventArgs?e)
????????{
????????????try
????????????{
????????????????var?myDel?=?from?user?in?objContext.GetTable<User>()
????????????????????????????where?user.UserID?==?1
????????????????????????????select?user;
????????????????User?userDel?=?myDel.First<User>();
????????????????if?(null?==?userDel)?return;
????????????????//刪除
????????????????objContext.GetTable<User>().DeleteOnSubmit(userDel);
????????????????//提交
????????????????objContext.SubmitChanges();
????????????????MessageBox.Show("刪除數據成功!",?"系統提示!");
????????????}
????????????catch?(Exception?ex)
????????????{
????????????????MessageBox.Show("刪除數據時出錯:"?+?ex.Message,?"系統提示!");
????????????}
????????}
????????///?<summary>
????????///?數據查詢
????????///?</summary>
????????private?void?btnRead_Click(object?sender,?EventArgs?e)
????????{
????????????try
????????????{
????????????????var?myQuery?=?from?user?in?objContext.GetTable<User>()
??????????????????????????????where?user.UserID?==?1
??????????????????????????????select?user;
????????????????if?(myQuery.Count<User>()?<=?0)?return;
????????????????foreach?(User?user?in?myQuery)
????????????????{
????????????????????Console.WriteLine("用戶信息:UserID——>"?+?user.UserID?+?"、UserName——>"?+?user.UserName?+?"、UserPwd——>"?+?user.UserPwd?+?"、UserAge——>"?+?user.UserAge);
????????????????}
????????????????MessageBox.Show("查詢數據成功!",?"系統提示!");
????????????}
????????????catch?(Exception?ex)
????????????{
????????????????MessageBox.Show("查詢數據時錯誤:"?+?ex.Message,?"系統提示!");
????????????}
????????}
????????#endregion
????}
}
?
??? ? 到這里,LINQ的操作也結束了。運行感受一下吧。
????? 先說說我的感受吧,用NHibernate明顯感覺到效率沒有原生的SQL語句的好,可能只是插入一條語句,沒有批量的處理,Linq反而沒感覺到比NHibernate效率低。如果是對數據庫操作的實時性要求很高的話,可能不太適合使用ORM技術,當然了,才接觸到這些東西,也許有其它的解決辦法也說不定,待自己慢慢研究吧!!
轉載于:https://www.cnblogs.com/wangyong/archive/2010/06/02/1749993.html
總結
以上是生活随笔為你收集整理的NHibernateLinq简单的CRUD操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Paypal IPN
- 下一篇: javascript基础整理