一.O/R Mapping 概論
工廠模式+反射+每個(gè)數(shù)據(jù)庫(kù)的DAL層來(lái)解決數(shù)據(jù)訪問(wèn)層的代碼
針對(duì)數(shù)據(jù)庫(kù)表中字段的變化我們是無(wú)法預(yù)料的,所以每一次用戶需求的修改都會(huì)直接導(dǎo)致我們程序員來(lái)修改—實(shí)體類(BE層),數(shù)據(jù)訪問(wèn)層(DAL),這樣同樣會(huì)導(dǎo)致以上的各層BLL,UI等等的修改,長(zhǎng)久的下去,只會(huì)造成項(xiàng)目的噩夢(mèng)。
在軟件高速發(fā)展的今天,已經(jīng)有很多的人在為這個(gè)問(wèn)題而努力了,其中最有成果的就是java社區(qū),因?yàn)閖ava社區(qū)的開源精神,促使了一個(gè)新的概念的誕生。
O/R Mapping的思想。
二.什么是O/R Mapping?
O:object
R:relationship
Mapping:映射
將關(guān)系型數(shù)據(jù)庫(kù)與我們的面向?qū)ο舐?lián)系起來(lái),
將表與類(實(shí)體類,javabean)聯(lián)系起來(lái)
我們的程序直接與對(duì)象打交道,而不去關(guān)心是什么類型的數(shù)據(jù)庫(kù)以及是不是數(shù)據(jù)庫(kù)了。
三.為什么要O/R Mapping?
考慮我們?cè)鹊腏DBC或者ADO.NET,我們的代碼是這個(gè)樣子的:
Using System.Data.SqlClient;
SqlConnection conn = newSqlConnection(“server=.;uid=sa;pwd=sa;database=dbtest”);
SqlCommand cmd = conn.CreateCommand();
cmd,.CommandText = “select * from account”;
Con.Open();
SqlDataReader sr = cmd.ExecuteQuery();
While(sr.Read())
{
//………這里是我們需要的代碼,才是我們真正關(guān)心的代碼
}
Conn.Close();
但是很煩瑣,因?yàn)槠渲泻芏嗟拇a都是與我們整個(gè)需求無(wú)關(guān)的。
我們只需要關(guān)心的是:獲得的結(jié)果以及增加,修改,刪除的結(jié)果。
所以我們要把數(shù)據(jù)庫(kù)與面向?qū)ο蟮母拍钫推饋?lái)。
四.我們的需求
我們希望在編寫代碼的時(shí)候是這個(gè)樣子的:
//實(shí)體類
Class User
{
string name;
int age;
……..
}
//DAL層代碼
Class UserDAL
{
User u = new User();
u.Name = “Guilee”;
u.Age = 25;
u.Id = 1;
Add(u);//將新用戶添加到數(shù)據(jù)庫(kù)中
Update(u);//修改數(shù)據(jù)庫(kù)的內(nèi)容
Delete(u);//刪除數(shù)據(jù)庫(kù)的內(nèi)容
}
我們不需要關(guān)心數(shù)據(jù)庫(kù)是什么,如果數(shù)據(jù)庫(kù)中表的字段進(jìn)行了更改,我們也不需要對(duì)代碼有過(guò)多的更改,做為程序員,我們應(yīng)該更加關(guān)心的是當(dāng)我擁有了這些數(shù)據(jù)之后,我的業(yè)務(wù)怎么樣去完成!
您不需要寫SQL語(yǔ)句?。。?!
O/R Mapping框架幫您做好
五.Hibernate
在全球的程序員的努力下,我們終于看到了這樣的產(chǎn)品的出現(xiàn):
JDO:一個(gè)不成熟的產(chǎn)品
IBatis:一個(gè)半成品
Hibernate:目前最有影響力,最好的O/R Mapping框架,已經(jīng)成為Java持久層的標(biāo)準(zhǔn)。
在.NET社區(qū),已經(jīng)有NHibernate,NIBatis這樣的產(chǎn)品出現(xiàn)了!
Hibernate一個(gè)數(shù)據(jù)持久層的框架,足以滿足中小企業(yè)進(jìn)行企業(yè)級(jí)開發(fā)的選擇,能讓你擺脫數(shù)據(jù)庫(kù)的煩惱,不再過(guò)去寫那麻煩的數(shù)據(jù)訪問(wèn)層的代碼,不關(guān)心數(shù)據(jù)的連接與釋放,把精力都放置在具體的業(yè)務(wù)邏輯上面!
六.NHibernate的基本使用
首先我們需要NHibernate的程序集:
NHibernate.dll
Log4net.dll
Iesi.Collections.dll
Castle.DynamicProxy.dll
至少四個(gè),其中NHibernate.dll是核心的程序集,Log4net.dll是日志記錄程序集,
Iesi.Collections.dll是集合框架的程序集,Castle.DynameicProxy.dll控制反轉(zhuǎn)的程序集
第二步:
需要持久化類
所謂的持久化類就是我們常說(shuō)的實(shí)體類或者javabean,它是O/R Mapping的映射對(duì)象,通過(guò)控制它來(lái)封裝我們的數(shù)據(jù)
第三步:
使用NHibernate的配置文件
在配置文件中指定數(shù)據(jù)庫(kù)的方式,連接數(shù)據(jù)庫(kù)的方式
讓NHibernate知道如何去使用連接數(shù)據(jù)庫(kù)
第四步:
編寫O/R Mapping的映射文件
讓NHibernate知道如何去映射.NET與數(shù)據(jù)庫(kù)之間的關(guān)系
最后使用強(qiáng)大的NHibernate來(lái)編寫你的程序!
為了讓NHibernate知道如何去連接數(shù)據(jù)庫(kù),所以你必須在我們.NET中的app.config或者web.config中去配置一下:
<configSections><!--配置節(jié)-->
<section name="nhibernate"
type="System.Configuration.NameValueSectionHandler, System,Version=1.0.5000.0,Culture=neutral,PublicKeyToken=b77a5c561934e089" />
</configSections>
<!-- 配置信息用于指定NH以何種方式訪問(wèn)數(shù)據(jù)庫(kù)-->
<nhibernate>
<!--連接提供者,取值必須是實(shí)現(xiàn)了IConnectionProvider接口的類的全名-->
<add key="hibernate.connection.provider"
value="NHibernate.Connection.DriverConnectionProvider"/>
<!--數(shù)據(jù)庫(kù)方言,取值必須是繼承之Dialect的類的全名-->
<add key="hibernate.dialect"
value="NHibernate.Dialect.MsSql2000Dialect" />
<!--數(shù)據(jù)驅(qū)動(dòng)類,取值必須是實(shí)現(xiàn)了IDriver接口的類的全名-->
<add key="hibernate.connection.driver_class"
value="NHibernate.Driver.SqlClientDriver" />
<!--連接字符串,取值要與driver_class指定的數(shù)據(jù)驅(qū)動(dòng)類對(duì)應(yīng).-->
<addkey="hibernate.connection.connection_string"
value="server=(local);uid=sa;pwd=sa;database=dbtest"/>
</nhibernate>
制作一個(gè)持久化的類:
public class Account //注意必須將屬性設(shè)置為virtual虛擬的
{
private int id;
virtual public int Id
{
get { return id; }
set { id = value; }
}
private string username;
virtual public string Username
{
get { return username; }
set { username = value; }
}
private string password;
virtual public string Password
{
get { return password; }
set { password = value; }
}
}
編寫每個(gè)持久化類的配置
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mappingxmlns="urn:nhibernate-mapping-2.2">
<class name=“BE.Account,BE"table="account">
<id name="Id" column="userid"type="Int32">
<generator />
</id>
<property name="Username" type="String"length="50"/>
<property name="Password" type="String"length="50"/>
</class>
</hibernate-mapping>
其中xmlns指定了使用NHibernate的版本,
class元素的name屬性指定了持久化類的全名稱,逗號(hào)隔開的是程序集的名稱
table屬性指定了對(duì)應(yīng)的數(shù)據(jù)庫(kù)中表名稱
id元素是指定主鍵列名,name屬性是指持久化類的屬性名,column是表中列名
property元素是其他的每一列與持久化類的哪個(gè)屬性對(duì)應(yīng)
generator元素 中的class屬性指定了是自動(dòng)增長(zhǎng)列
保存為Account.hbm.xml文件
使用NHibernate,你可以開始使用NHibernate來(lái)體驗(yàn)他們的強(qiáng)大之處了:)
using NHibernate;
using NHibernate.Cfg;
Configuration cfg = new Configuration();
cfg.AddAssembly(“BE");
ISessionFactory factory = cfg.BuildSessionFactory();
ISession session = factory.OpenSession();
ITransaction transaction = session.BeginTransaction();
Account a = new Account();
a.Username = “Guilee";
a.Password = "1234";
a.Id = 1;
session.Save(a);
//修改數(shù)據(jù)庫(kù)的內(nèi)容
//session.Update(a);
//刪除數(shù)據(jù)庫(kù)的內(nèi)容
//session.Delete(a);
transaction.Commit();
session.Close();
首先,創(chuàng)建一個(gè)Configuration對(duì)象
Configuration對(duì)象能夠解析所有.Net對(duì)象和后臺(tái)數(shù)據(jù)庫(kù)中的映射關(guān)系。
Configuration cfg = new Configuration();
cfg.AddAssembly(“BE"); Configuration對(duì)象會(huì)搜索裝配件里的任何以hbm.xml結(jié)尾的文件。還有其他方法加載映射文件,但這種方式是最簡(jiǎn)單的。
創(chuàng)建一個(gè)Session對(duì)象
ISession對(duì)象提供一個(gè)到后臺(tái)數(shù)據(jù)庫(kù)的連接,ITransaction對(duì)象提供一個(gè)可以被NHibernate管理的事務(wù)。
ISessionFactory factory = cfg.BuildSessionFactory(); ISessionsession = factory.OpenSession();
ITransaction transaction = session.BeginTransaction();接著來(lái)增/刪/改/查你的對(duì)象
現(xiàn)在你可以用使用傳統(tǒng)的.Net方法來(lái)操縱對(duì)象。
NHibernate將查詢的方式變成了面向?qū)ο蟮姆椒?,針?duì)查詢最簡(jiǎn)單的使用方式是:
ICriteria c = session.CreateCriteria(typeof(BEAccount));
c.Add(Expression.Eq("Username",account.Username));
c.Add(Expression.Eq("Password",account.Password));
IList list = c.List();
使用ICriteria 表示一次查詢動(dòng)作
整個(gè)代碼表示:
查詢Account表,找到username為account.Username并且password為account.Password的所有記錄
使用List來(lái)得到所有查詢之后的結(jié)果。
愛華網(wǎng)


