在.NET平臺下,關(guān)于數(shù)據(jù)持久層框架非常多,本文主要對如下幾種做簡要的介紹并推薦一些學(xué)習(xí)的資源:
1.NHibernate
2.NBear
3.Castle ActiveRecord
4.iBATIS.NET
5.DAAB
附加介紹:DLinq
一.NHibernate
提起NHibernate,相信大家都不陌生,NHibernate來源于非常優(yōu)秀的基于Java的Hibernate關(guān)系型持久化工具,它從數(shù)據(jù)庫底層來持久化.Net對象到關(guān)系型數(shù)據(jù)庫,NHibernate為我們完成這一切,而不用自己寫SQL語句去操作數(shù)據(jù)庫對象,所寫的代碼僅僅和對象關(guān)聯(lián),NHibernat自動(dòng)產(chǎn)生SQL語句,并確保對象提交到正確的表和字段中去.大量減少開發(fā)時(shí)人工使用SQL和ADO.NET處理數(shù)據(jù)的時(shí)間. NHibernate可以幫助消除或者包裝那些針對特定數(shù)據(jù)庫的SQL代碼,并且把結(jié)果集從表格的表示形式轉(zhuǎn)換到一系列的對象去。NHibernate采用XML文件配置的方式,每一個(gè)實(shí)體類都會(huì)對應(yīng)一個(gè)映射文件,如下面的例子:
public class User
{
public User()
{
}
private string id;
private string userName;
private string password;
private string emailAddress;
private DateTime lastLogon;
public string Id
{
get { return id; }
set { id = value; }
}
public string UserName
{
get { return userName; }
set { userName = value; }
}
public string Password
{
get { return password; }
set { password = value; }
}
public string EmailAddress
{
get { return emailAddress; }
set { emailAddress = value; }
}
public DateTime LastLogon
{
get { return lastLogon; }
set { lastLogon = value; }
}
}
它對應(yīng)的.hbm.xml文件如下:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="NHibernateWebDemo.Model.User, NHibernateWebDemo.Model" table="users">
<id name="Id" column="LogonId" type="String" length="20">
<generator class="assigned" />
</id>
<property name="UserName" column= "Name" type="String" length="40"/>
<property name="Password" type="String" length="20"/>
<property name="EmailAddress" type="String" length="40"/>
<property name="LastLogon" type="DateTime"/>
</class>
</hibernate-mapping>
官方主頁:http://www./
學(xué)習(xí)資源
園子里首推DDL的Blog:http://www.cnblogs.com/renrenqq/,有NHibernate文檔的中文翻譯以及DLL寫的一些非常優(yōu)秀的NHibernate文章。
大名鼎鼎的張老三:http://blog.csdn.net/billy_zh/category/22383.aspx
Aero的Nhibernate學(xué)習(xí)手記系列:http://www.cnblogs.com/chwkai/category/32514.html
無心之柳的Blog也非常值得推薦:http://www.cnblogs.com/9527/
博客園O/R Mapping團(tuán)隊(duì):http://www.cnblogs.com/team/ORMapping.html
二.NBear
園子里Teddy開發(fā)的NBear大家都非常熟悉,現(xiàn)在已經(jīng)發(fā)布了3.0正式版。NBear包含的組件不僅僅是數(shù)據(jù)持久層,還包含了IOC,分布式組件和Web組件??匆幌耇eddy對于NBear的介紹:
NBear的核心包括一個(gè)泛型、強(qiáng)類型的的ORM數(shù)據(jù)持久化接口、一組相關(guān)的Entity相關(guān)組件、高性能分布式組件、Web組件,因此:
1、NBear最適合開發(fā)各類基于ASP.NET 2.0,對性能要求較高的Web程序。NBear.Web組件提供了許多加速Web開發(fā)的組件,將使您基于標(biāo)準(zhǔn) ASP.NET方式的開發(fā)效率大大提高;同時(shí),簡單易用、性能突出的泛型持久化支持,則將使您能夠?qū)⒏嘧⒁饬械綐I(yè)務(wù)開發(fā),同時(shí)也不會(huì)有傳統(tǒng)ORM持久化框架的性能問題和繁瑣配置需要(NBear幾乎不需手動(dòng)配置,性能則接近DAAB)。
2、基于MQ和.Net Remoting的高性能分布式組件,將使您開發(fā)和維護(hù)分布式程序更加容易。一個(gè)基于NBear.IoC模塊的開發(fā)的應(yīng)用程序甚至無需重新編譯就能部屬為真正的負(fù)載均衡的分布式程序。
3、對于桌面應(yīng)用程序,NBear同樣是一個(gè)幾乎沒有什么學(xué)習(xí)曲線(多少人會(huì)為寫一個(gè)小小的日歷程序而仔細(xì)研究透徹Hibernate的參考手冊?)、實(shí)用高效的數(shù)據(jù)持久化方案。
4、隨著NBearV3帶來的全面的ORM支持、更詳細(xì)的文檔和教程,和全面的代碼生成工具,NBear也已經(jīng)可以被用于企業(yè)級程序開發(fā)。
官方首頁:http://teddyma.cnblogs.com/articles/Ilungasoft_Framework.html
學(xué)習(xí)資源
學(xué)習(xí)資源當(dāng)然首推Teddy的個(gè)人Blog:http://www.cnblogs.com/teddyma/
博客園NB團(tuán)隊(duì):http://nbteam.cnblogs.com/
三.Castle ActiveRecord
ActiveRecord是Castle中的一個(gè)子項(xiàng)目,現(xiàn)在的版本是RC1。它同樣是一個(gè)非常優(yōu)秀的持久層框架,在底層封裝了NHibernate,改用Attribute來代替配置文件,這樣就不用再像NHibernate那樣去編寫復(fù)雜的配置文件。如下代碼片斷所示:
[ActiveRecord("Users")]
public class User : ActiveRecordBase
{
private int _id;
private string _name;
private string _password;
private string _emailAddress;
private DateTime _lastLogon;
[PrimaryKey(PrimaryKeyType.Identity, "LogonID")]
public int Id
{
get { return _id; }
set { _id = value; }
}
[Property("LogonName")]
public string Name
{
get { return _name; }
set { _name = value; }
}
[Property("Password")]
public string Password
{
get { return _password; }
set { _password = value; }
}
[Property("EmailAddress")]
public string Address
{
get { return _emailAddress; }
set { _emailAddress = value; }
}
[Property("LastLogon")]
public DateTime LastLogon
{
get { return _lastLogon; }
set { _lastLogon = value; }
}
}
官方主頁:http://www.
學(xué)習(xí)資源
官方文檔:http://www./activerec ... tation/v1rc1/index.html
葉子的家:http://wj.cnblogs.com/
TerryLee的Castle開發(fā)系列:
http://terrylee.cnblogs.com/archiv ... astl_ioc_article.html
Castle項(xiàng)目成員之一ayende的Blog:http://www./Blog/
四.iBATIS.NET
iBATIS.NET分為DataMapper和DataAccess兩部分,應(yīng)該說DataMapper是這個(gè)框架的核心,DataMapper使用XML文件來實(shí)現(xiàn)從實(shí)體到SQL statements的映射,學(xué)習(xí)起來非常簡單,是用DataMapper后,我們可以自由的使用SQL語句或者存儲過程;DataAccess允許我們通過一個(gè)簡單的接口來操作數(shù)據(jù),而不必了解底層實(shí)現(xiàn)的細(xì)節(jié)。如下代碼片斷:
[Serializable]
public class Person
{
private int id;
private string firstName;
private string lastName;
private DateTime? birthDate;
private double? weightInKilograms;
private double? heightInMeters;
public Person() { }
public int Id
{
get { return id; }
set { id = value; }
}
public string FirstName
{
get { return firstName; }
set { firstName = value; }
}
public string LastName
{
get { return lastName; }
set { lastName = value; }
}
public DateTime? BirthDate
{
get { return birthDate; }
set { birthDate = value; }
}
public double? WeightInKilograms
{
get { return weightInKilograms; }
set { weightInKilograms = value; }
}
public double? HeightInMeters
{
get { return heightInMeters; }
set { heightInMeters = value; }
}
}
映射文件如下:
<?xml version="1.0" encoding="utf-8" ?>
<sqlMap namespace="Person" xmlns="http://ibatis./mapping"
xmlns:xsi="‘ target=_blank>http://www./2001/XMLSchema-instance" >
<alias>
<typeAlias alias="Person" type="IBatisNetDemo.Domain.Person,IBatisNetDemo" />
</alias>
<resultMaps>
<resultMap id="SelectAllResult" class="Person">
<result property="Id" column="PER_ID" />
<result property="FirstName" column="PER_FIRST_NAME" />
<result property="LastName" column="PER_LAST_NAME" />
<result property="BirthDate" column="PER_BIRTH_DATE" />
<result property="WeightInKilograms" column="PER_WEIGHT_KG" />
<result property="HeightInMeters" column="PER_HEIGHT_M" />
</resultMap>
</resultMaps>
<statements>
<select id="SelectAllPerson" resultMap="SelectAllResult">
select
PER_ID,
PER_FIRST_NAME,
PER_LAST_NAME,
PER_BIRTH_DATE,
PER_WEIGHT_KG,
PER_HEIGHT_M
from PERSON
</select>
<select id="SelectByPersonId" resultClass="Person" parameterClass="int">
select
PER_ID,
PER_FIRST_NAME,
PER_LAST_NAME,
PER_BIRTH_DATE,
PER_WEIGHT_KG,
PER_HEIGHT_M
from PERSON
where PER_ID = #value#
</select>
<insert id="InsertPerson" parameterclass="Person" >
<selectKey property="Id" type="post" resultClass="int">
${selectKey}
</selectKey>
insert into Person
( PER_FIRST_NAME,
PER_LAST_NAME,
PER_BIRTH_DATE,
PER_WEIGHT_KG,
PER_HEIGHT_M)
values
(#FirstName#,#LastName#,#BirthDate#, #WeightInKilograms#, #HeightInMeters#)
</insert>
<update id="UpdatePerson" parameterclass="Person">
<![CDATA[ update Person set
PER_FIRST_NAME =#FirstName#,
PER_LAST_NAME =#LastName#,
PER_BIRTH_DATE =#BirthDate#,
PER_WEIGHT_KG=#WeightInKilograms#,
PER_HEIGHT_M=#HeightInMeters#
where
PER_ID = #Id# ]]>
</update>
<delete id="DeletePerson" parameterclass="Person">
delete from Person
where
PER_ID = #Id#
</delete>
</statements>
</sqlMap>
官方主頁:http://ibatis./
學(xué)習(xí)資源
官方文檔:
http://opensource./confluen ... IBATIS/Quick+Start+Guide
善友的iBATIS.NET開發(fā)指南系列:
http://www.cnblogs.com/shanyou/archive/2006/04/29/388610.html
五.DAAB
DAAB是微軟Enterprise Library中的一個(gè)應(yīng)用程序塊,能夠幫助我們實(shí)現(xiàn)通用的數(shù)據(jù)訪問,所以也把它列在這里介紹一下。DAAB使應(yīng)用程序中的數(shù)據(jù)訪問在不知道具體的數(shù)據(jù)庫系統(tǒng)的情況下進(jìn)行,相信很多朋友對DAAB都很熟性并且已經(jīng)在項(xiàng)目中使用,就不多介紹了,看一個(gè)簡單的代碼片斷:
public string GetCustomerList()
{
// 創(chuàng)建Database對象
Database db = DatabaseFactory.CreateDatabase();
// 使用SQL語句創(chuàng)建DbCommand對象
string sqlCommand = "Select CustomerID, Name, Address, City, Country, PostalCode " +
"From Customers";
DbCommand dbCommand = db.GetSqlStringCommand(sqlCommand);
StringBuilder readerData = new StringBuilder();
// 調(diào)用ExecuteReader方法
using (IDataReader dataReader = db.ExecuteReader(dbCommand))
{
while (dataReader.Read())
{
// Get the value of the ‘Name‘ column in the DataReader
readerData.Append(dataReader["Name"]);
readerData.Append(Environment.NewLine);
}
}
return readerData.ToString();
}
官方主頁:http://msdn.microsoft.com/practices/
學(xué)習(xí)資源
企業(yè)的幫助文檔和Hands On Lab
TerryLee的Enterprise Library系列:http://www.cnblogs.com/Terrylee/archi ... nterprise_Library.html
附加介紹:DLinq
DLinq雖然不能算是開源框架,但是說到數(shù)據(jù)持久,還是提一下比較好,DLinq是微軟下一代數(shù)據(jù)庫集成查詢語言,在這之前微軟曾經(jīng)嘗試過ObjectSpace,最后是不了了之。DLinq實(shí)現(xiàn)的方式有點(diǎn)類似于前面說過的ActiveRecord,不支持使用外部的XML配置文件,而是使用了Attribute的方式,如下代碼片斷所示:
[Table(Name="Customers")]
public class Customer
{
[Column(Id=true)]
public string CustomerID;
[Column]
public string City;
}
官方主頁:http://msdn.microsoft.com/netframework/future/linq/
學(xué)習(xí)資源
下載LINQ May CTP版:http://msdn.microsoft.com/data/ref/linq/
ScottGu的Blog:http://weblogs./scottgu/default.aspx
最后值得一提的是,微軟又推出個(gè)Ado.net vNext,使用映射文件來配置,更加類似于NHibernate。關(guān)于持久層框架,還有很多,這里就不再介紹了,如Grove等。
原文地址: http://www.cnblogs.com/Terrylee/archive/2006/12/02/ope ... resource_recommendation_orm.html





