orm存儲過程
1. mybatis算是orm框架嗎,可以更換底層資料庫嗎
1、定義
mybatis是一個支持普通sql查詢,存儲過程和高級映射的優秀持久層框架。
2、使用原因
mybatis消除了幾乎所有的jdbc代碼和參數的手工設置以及對結果集的檢索封裝。mybatis可以使用簡單的xml或註解用於配置和原始映射
2. 關於.net項目 框架選取(orm或其他) ,中型電子商務網站,使用什麼框架比較好(性能、效率、易維護)
你說的3個都是資料庫ORM框架,如果你不熟悉,項目時間不多,就不要用了,
使用EnterpriseLibrary調用SQL或存儲過程,這樣比較簡單,性能可以說最好
網上搜的三層架構EnterpriseLibrary源碼,很多的
3. 談談如何從本質上理解SQL語句、存儲過程與ORM之間的聯系和取捨
存儲過程就是stored procere, 簡寫為sp。 ORM就是對象-關系映射,比如Hibernate。 大多數的.NET程序都是會圍繞sql伺服器展開,經常要面臨在這些技術間進行選擇。所以我們需要來理解這些技術的本質。 一,演變 剛開始的時候,只有sql語句,即可以用交互模式一句一句執行, 也可以用批模式執行,多行sql語句一次提交執行。 很快人們發現用批模式執行的一堆sql語言可以用過程的形式,事先存放到資料庫裡面,這就變成了存儲過程。 隨著面向對象技術的成熟,從程序中可以自動生成sql語句,這就是ORM。 二,性能 很多人會說存儲過程比sql語句性能好,其實這個說法並不精確。 在這種情況下,性能差不多。 但是,如果我們不注意,很有可能,把可以一次提交的sql,變成了多次提交,甚至是每個循環做了一次提交,那麼性能就很差了。 也就是說如果使用sql,只要寫法得當,性能和sp區別不大。 同樣的道理,ORM的性能取決於ORM的Sql生成演算法, 和用戶使用的時候,對生成演算法的控制,比如利用好Lazy laoding等,在某些情況下,甚至可以不通過sql,畢竟沒有sql比最優化的sql還要快。 三,可維護性 可維護性是選擇sql,sp,orm最主要的因素。 這裡面有點」玄「,因為不同的場景會得出不同的結論,俗稱「It depends"。 剛開始的時候,sql的維護性看起來是最差,因為它往往散布在程序的每個角落。而存儲過陳都放在資料庫中,有清晰介面。 但是如果我們做一次重構,情況居然會顛倒過來。 首先,存儲過程完全可以照搬到C#中,sp的名字直接變成method的名字,sp的參數表直接變成method的參數表,(其實就是Command模式)。 其次,把這些methdod放到一個文件或者文件夾中。(所謂的DAL層,如果喜歡層的話) 通過這個重構,我們獲得了以下的好處: 1,首先是過程的調用和過程的定義放到了一起,修改起來比較方便。IDE都有定義跳轉功能。 2,過程的調用和定義同時進行版本控制,不會出現不匹配的情況。減少了sp的參數表和調用的不匹配,包括拼寫,類型,參數次序 3,單元測試非常方便 當然sp也有存在的價值,比如所謂的安全性,後面會提到。比如友好的調試環境,對於中小型項目,和初級程序員來說,也是很好的選擇。 ORM則將可維護性提升身到了一個新的高度,它試圖將sql屏蔽起來,在操作對象的同時,自動就把資料庫的事情給辦了。 ORM有兩種模式,一種是ActiveRecord, 一種是Datamapper,前者從資料庫中讀取定義,後者在程序中定義。不過由於前者往往用migration來生成資料庫,其實也是定義在程序裡面的。好的ORM都有"leaking"的設計,也就是留了個」後門「,讓你有機會用sql來控制。 微軟的linq從某個角度類說,也是一種ORM, 它的設計思想可能是因為它覺得寫sql語句比寫c#代碼效率高,所以提供直接在C#中寫sql語句的機制,再自動生成真正的sql。不過,ORM真正價值在於它可以在恰當的時候,完全拋棄sql,比如比如讀用cache,寫用queue。而微軟的linq,完全是「無厘頭」的風格,在O中用R的寫法,難道是RRM, 唯一的好處只是鎖定程序和程序員在微軟的平台上。 四,安全性 對企業來說,安全性有的時候比性能更重要,由於存儲過程在資料庫上多加了一道屏障,所以很多企業會把存儲過程作為首選。 ORM可以說是安全性最差的, 因為只有到程序運行起來,你才能知道,會產生什麼樣的sql。 但是保證安全有許多方法和方面,比如部署前的測試, 資料庫的備份,對表的許可權的設置。等。用sp來保證安全,只是多個選項中的一個。 在startup型企業中,高級程序員往往起到主導作用, 所以他們會不猶豫的選擇ORM。
4. oracle11g 存儲過程
下了個簡單的調用存儲過程的代碼:
//存儲過程調用的字元串格式{call 存儲過程名(參數1|參數2)} 無慘也可以
String sql="{call getCouserInfo(?,?,?)}";
CallableStatement cs=conn.prepareCall(sql);
//為第一個問號賦值
cs.setInt(1, 1);
//因為第二,三個問號代表的是輸出參數,所以只需要指定返回類型就可以了
cs.registerOutParameter(2, java.sql.Types.VARCHAR);
cs.registerOutParameter(3, java.sql.Types.INTEGER);
cs.execute();
//返回輸出參數中的值
String name=cs.getString(2);
int score=cs.getInt(3);
(2)沒有返回參數,但是有結果集的時候
//存儲過程調用的字元串格式{call 存儲過程名(參數1|參數2)} 無慘也可以
String sql="{call getAllCourse()}";
CallableStatement cs=conn.prepareCall(sql);
ResultSet rs=cs.executeQuery();
5. 現在的資料庫開發還經常用到游標嗎
准確的說 是資料庫編程有越來越少的趨勢 特別是ORM工具的風靡 以及mysql構建集群的低成本
在構建集群時,你會發現,使用存儲過程會很頭痛(表分割,分布式計算等)所以,現在這些邏輯處理,一般都放在應用程序那裡(如java,c#),再加上hibernate這些orm工具的使用,所以,存儲過程有漸漸沒落的趨勢。至於游標,普通的,如果你不使用orm工具,直接jdbc什麼的連接上去,那用游標還是很正常的。
另外,在數據編程中,能不用游標,還是盡量少用。
一般的,你可以使用如下兩個方法去解決使用游標這個矛盾:
一是盡量將語句,通過sql原生代碼去生成結果集
二是可以使用%ROWTYPE;這些語句去作為變數
當然,在結果集輸出的時候,用游標是可以的,你要保證,你每一個使用游標的地方,都是為了直觀的輸出數據或者變數賦值,而不是為了加工處理游標中的數據。
6. C#環境,MVC模式時,ORM怎麼處理分表的問題
我不太清楚mvc,怎麼實現數據banding的,但是我到csla架構中,很容易實現這個問題,就是將一條完整的記錄,分成4個部分,然後就很容易拆分成4個對象,然後分別對應4個控制項綁定4個對象,這樣很容易能控制,想更改那一個對象的數據,前提滿足表的約束條件,比如吧,你的主鍵有好幾個field組成,你就不能把部分的更改,部分忽略。你可以順著這個思路,去處理。
7. 如何在c#代碼里調用oracle存儲過程
rotected void Button2_Click(object sender, EventArgs e)
{
String oc = ConfigurationManager.ConnectionStrings["conn"].ToString();
OracleConnection conn = new OracleConnection(oc);
conn.Open();
OracleCommand orm = conn.CreateCommand();
orm.CommandType = CommandType.StoredProcere;
orm.CommandText = "proc1";
orm.ExecuteNonQuery();
conn.Close();
8. 如何編寫帶有ORM的三層架構,最好給個例子看看。
ORM可以這么理解:
一般的,我們把系統所需要的數據放在資料庫中。而顯示給用戶的頁面中使用的數據是通過讀取資料庫並進一步處理得到的。
而資料庫中的數據是結構的。
我們需要的.net編程中的數據時面向對象整合了的。
故:我們需要一種機制,可以把資料庫中的結構性的數據轉換為面向對象的數據。於是就出現了系統架構中常見的3層架構:
底層:DAL(Data Access Layer,數據訪問層)
中間:BLL (Bussiness Logic Layer,業務邏輯層)
頂層:UI層~
DAL中,我們使用實體類完成對資料庫表的封裝:
例如:我們構建一個文章管理系統。需要以下表
[Articles] [Categories] [Comments]
以[Articles]為例,包含的欄位:
[ArticleID] [Title] [Content] [AddedBy] [AddedDate]
DAL層對應的實體類為[ArticleDetails]
包含以下屬性[ArticleID] [Title].......等5個屬性,以此對應表的5個欄位。
對應DB中的3個表,我們有3個實體類。
創建類SqlArticlesProvider 來完成對DB的操作的封裝。
通常每個方法封裝一個存儲過程~
例如:GetArticles(int categoryID)方法中。
我們連接DB,調用SP,並將返回的DataReader封裝到實體類集合List<ArticleDetails>中。以用於傳輸給BLL層。
BLL層:
之中的類稱為域對象。有[Article] [Category] [Comment]
這里的每個類就是我們傳統OOP中的類。
每個對象包含描述自己的屬性和可執行行為的方法。
UI層,直接調用BLL層的類以獲取數據,並通過數據綁定控制項顯示的頁面等~
說的有點亂。。。光這么著說確實不是特別充分。。
而且真正實踐編程起來,比這個復雜。。
三層架構之後的系統更易於維護。變更底層數據存儲,需要改動的地方非常少。
故,主要是用於大中型系統架構。
而且現在推出LINQ後,對編碼量也降低了。但是單獨學習LINQ,時間也不會少。
如果不要LINQ的話,還是有很多工具代碼可以幫助自動的構建一些類的~
9. ASP.NET中如何執行各種類型的存儲過程
看到這個手寫的類,就知道還是手工作坊的產物。
在實際項目中從不用手寫數據訪問類,用微軟給的,或者用MSORM直接生成,
比這樣手寫,更快,更安全,代碼量更少,調用更方便。
---------------------------
代碼重用目地在於提高生產力,
並不是你寫一個類就永垂不朽了,
而是要在需求有變更的情況下,能夠復用和擴展。
你可以看看.NET裡面的ORM是如何進行代碼復用和擴展的,
觀察一下資料庫結構以及存儲過程改變的情況下,代碼是如何變化的。
事實上,完全不需要手動編碼。
能夠應付更加復雜的應用場景和需求變更,才能提高生產力,才能被稱之為面向對象。
10. 如何用ServiceStack.OrmLite執行存儲過程,並將結果以DataTable形式返回
和調用sql語句一樣,執行「exec 存儲過程名 參數1,參數2」,然後存儲過程中需要執行一個查詢語句,那麼執行存儲過程就是執行這個查詢語句,結果也就是一張表,其他的都和sql語句一樣了