什么是ORM效扫?
ORM的全稱是Object Relational Mapping倔监,即對(duì)象關(guān)系映射。它的實(shí)現(xiàn)思想就是將關(guān)系數(shù)據(jù)庫(kù)中表的數(shù)據(jù)映射成為對(duì)象荡短,以對(duì)象的形式展現(xiàn)丐枉,這樣開(kāi)發(fā)人員就可以把對(duì)數(shù)據(jù)庫(kù)的操作轉(zhuǎn)化為對(duì)這些對(duì)象的操作。因此它的目的是為了方便開(kāi)發(fā)人員以面向?qū)ο蟮乃枷雭?lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的操作掘托。
ORM實(shí)現(xiàn)原理
對(duì)象到數(shù)據(jù)庫(kù)的映射瘦锹; 對(duì)象與數(shù)據(jù)庫(kù)數(shù)據(jù)的互相轉(zhuǎn)換;
重量級(jí)ORM闪盔,
以EntityFramework弯院、NHibernate為代表
優(yōu)點(diǎn)?
面向?qū)ο蠓绞皆L問(wèn)數(shù)據(jù)庫(kù),擺脫SQL 可移植性強(qiáng)泪掀,支持所有流行的數(shù)據(jù)庫(kù) 面向接口的設(shè)計(jì)听绳,可擴(kuò)充性強(qiáng) 對(duì)事務(wù)、緩存(一級(jí)緩存)有良好的封裝及配置?
缺點(diǎn)?
比較復(fù)雜异赫,學(xué)習(xí)曲線大椅挣;?
處理對(duì)象關(guān)聯(lián)很容易出錯(cuò);
不適合統(tǒng)計(jì)查詢系統(tǒng)塔拳;
對(duì)于多表連查鼠证,復(fù)雜的sql實(shí)現(xiàn)比較復(fù)雜,而且有可能需要借助其他方案靠抑;?
自動(dòng)生成的sql查詢執(zhí)行效率低量九;?
對(duì)于大數(shù)據(jù)量、高負(fù)載場(chǎng)景需要慎重考慮颂碧;?
實(shí)現(xiàn)良好的二級(jí)緩存很困難荠列,并且只能定制;
輕量級(jí)ORM
以dapper為代表,并且是半自動(dòng)的载城。也就是說(shuō)實(shí)體類都要自己寫,Dapper相當(dāng)于Java里的Mybatis肌似。
優(yōu)點(diǎn):
1、開(kāi)源诉瓦、輕量锈嫩、小巧(單文件受楼,代碼就一個(gè)SqlMapper.cs文件,編譯后就40K的一個(gè)很小的Dll.)呼寸、上手容易。支持poco及動(dòng)態(tài)類型猴贰,縮寫詞:POCO's (plain old CLR objects)对雪。
2、支持的數(shù)據(jù)庫(kù)還蠻多的米绕,?Mysql,SqlLite,Sqlserver,Oracle等一系列的數(shù)據(jù)庫(kù)瑟捣。
3、執(zhí)行效率高栅干,Dapper的速度接近與IDataReader迈套,取列表的數(shù)據(jù)超過(guò)了DataTable。Dapper原理通過(guò)Emit反射IDataReader的序列隊(duì)列碱鳞,來(lái)快速的得到和產(chǎn)生對(duì)象桑李。
使用poco時(shí),屬性與數(shù)據(jù)庫(kù)表的映射無(wú)法靈活配置窿给,難以實(shí)現(xiàn)Repository模式
EF相對(duì)于ado.net 的優(yōu)點(diǎn)
1)開(kāi)發(fā)效率高贵白,Entity Framework的優(yōu)勢(shì)就是擁有更好的LINQ提供程序、文檔崩泡,并且是由微軟所支持的禁荒,用EntityFramework就是開(kāi)發(fā)速度快(當(dāng)然,那是在會(huì)linq的基礎(chǔ)上)角撞,智能感知(也是linq支持的結(jié)果)呛伴,通過(guò)實(shí)體、關(guān)系型數(shù)據(jù)庫(kù)表之間的映射谒所,使開(kāi)發(fā)人員可以通過(guò)操作表實(shí)體而間接的操作數(shù)據(jù)庫(kù),大大的減少了代碼量热康。不用定義實(shí)體類那些東西了。直接與數(shù)據(jù)庫(kù)中模型結(jié)合起來(lái)了,開(kāi)發(fā)人員完全可以根據(jù)面向?qū)ο蟮乃季S進(jìn)行軟件的開(kāi)發(fā)百炬。
2)可以使用三種設(shè)計(jì)模式中的ModelFirst來(lái)設(shè)計(jì)數(shù)據(jù)庫(kù)褐隆,而且比較直觀
3)可以跨數(shù)據(jù)庫(kù),只需要在配置文件中修改連接字符串
4)與vs結(jié)合的比較好
EF的缺點(diǎn)
EF的Context上下文不是線程安全的剖踊,你不應(yīng)該在整個(gè)Service上使用一個(gè)Context上下文庶弃。
EF的性能表現(xiàn)不太好,它的性能不如ADO德澈,開(kāi)發(fā)無(wú)法控制SQL語(yǔ)句的生成歇攻;頻繁插入操作(Insert)不適用, EF不支持大數(shù)據(jù)Bulk 插入
可維護(hù)性差,EF產(chǎn)生查詢梆造,他們是難以維護(hù)的缴守,它并不能很好地支持映射到不規(guī)范的表葬毫;它的概念模型,關(guān)系模型等全部都放在一個(gè)edmx文件里面屡穗,過(guò)于龐大贴捡,并不利于修改
NHibernate優(yōu)點(diǎn)和缺點(diǎn):
NHibernate優(yōu)點(diǎn):
1.完全的ORM框架。
NHibernate對(duì)數(shù)據(jù)庫(kù)結(jié)構(gòu)提供了較為完整的封裝村砂,它將數(shù)據(jù)庫(kù)模式映射為較完全的對(duì)象模型烂斋,支持封裝,繼續(xù)機(jī)制础废,功能較強(qiáng)大汛骂,比一般的ORM靈活性高。
開(kāi)發(fā)人員可以完全按照對(duì)象模型操縱數(shù)據(jù)庫(kù)评腺。
2.代碼自動(dòng)生成帘瞭,減少代碼和sql的開(kāi)發(fā)量,使開(kāi)發(fā)人員擺脫開(kāi)sql蒿讥,ado.net和事務(wù)蝶念,緩存等底層。
NHibernate的O/R Mapping實(shí)現(xiàn)了PO 和數(shù)據(jù)庫(kù)表之間的映射诈悍,以及SQL 的自動(dòng)生成和執(zhí)行祸轮。程序員往 往只需定義好了PO 到數(shù)據(jù)庫(kù)表的映射關(guān)系,即可通過(guò)NHibernate提供的方法完成持久層操作侥钳。程序員甚至不需要對(duì)SQL 的熟練把握适袜, NHibernate 會(huì)根據(jù)制定的存儲(chǔ)邏輯,自動(dòng)生成對(duì)應(yīng)的SQL 并調(diào)用ADO.NET接口加以執(zhí)行舷夺。NHibernate有工具可以直接根據(jù)數(shù)據(jù)庫(kù)模式生成po類苦酱,或者通過(guò)在代碼中添加Attribute屬性自動(dòng)生成 配置文件。
這些都減少了開(kāi)發(fā)工作量给猾。
3.較好的文檔支持疫萤。
NHibernate的代碼可讀性和文檔都比較好。
缺點(diǎn):
1.較復(fù)雜敢伸,學(xué)習(xí)曲線大扯饶。
2.對(duì)數(shù)據(jù)庫(kù)模式有較高的要求。NHibernate需要數(shù)據(jù)庫(kù)有良好的設(shè)計(jì)和比較完善的約束池颈。
3.不適合統(tǒng)計(jì)查詢系統(tǒng)尾序。對(duì)于多表連查,復(fù)雜的sql實(shí)現(xiàn)比較復(fù)雜躯砰,而且有可能需要借助其他方案每币。
4.需要一些xml配置。
------
ORM框架
1.NHibernate 一個(gè)傳統(tǒng)的ORM,移植于java的Hibernate,3.0后發(fā)展迅速,提供FluentMap和FluentConfig,支持Linq,支持HQL和NativeSQL,支持一級(jí)緩存和二級(jí)緩存,豐富的ID生成策略,更多的攔截事件暴露,支持常見(jiàn)的所有數(shù)據(jù)庫(kù),缺點(diǎn)就是配置選項(xiàng)有點(diǎn)多,初學(xué)者無(wú)處下手
2.EntityFramework 微軟官方出的ORM,配置簡(jiǎn)單,比NH更好的Linq支持,工具支持和較低的學(xué)習(xí)門檻,命名約定配置,支持CodeFirst DbMigration(在開(kāi)發(fā)時(shí),不能用在生產(chǎn)環(huán)境中),缺點(diǎn)就是不支持批量操作(第三方庫(kù)EntityFramework.Extension擴(kuò)展了這一點(diǎn),還做了緩存),無(wú)原生的二級(jí)緩存,,單調(diào)的ID生成方式,不支持多數(shù)據(jù)庫(kù)(很多數(shù)據(jù)庫(kù)如MySql都對(duì)EF提供了支持,但是bug多多,有穩(wěn)定的商業(yè)庫(kù)可以選擇),還有單一的配置方式(當(dāng)你想從程序集動(dòng)態(tài)加載model到DbContext中時(shí),你就會(huì)知道就多捉雞)
3.Dapper StackOverflow開(kāi)源的一個(gè)MiniOrm,性能和原生ado.net相近,0配置,強(qiáng)類型支持.缺點(diǎn)同樣是有小bug,較弱的LINQ支持(只找到一個(gè)MSSQL的linq插件)有兩個(gè)關(guān)于Dapper的擴(kuò)展,一個(gè)叫Dapper.Extension,一個(gè)叫Dapper.Rainbow.Mysql.這兩個(gè)擴(kuò)展可能更接近傳統(tǒng)意義上的ORM
4.ServiceStack.OrmLite 另外一個(gè)MiniORM,性能僅次于Dapper,支持大部分的數(shù)據(jù)庫(kù),比Dapper豐富的多的API和更好的強(qiáng)類型lambda表達(dá)式查詢條件支持,映射0配置,也支持以Attribute配置,支持表的創(chuàng)建和刪除