今天看到一片熱門的博客, .NET高級工程師面試題之SQL篇 ,要求找出每個系的最高分,而且按系編號,學生編號升序排列。這個查詢比較複雜,也比較典型,自從用了ORM後,好久沒有寫過SQL語句了,因而我研究了下,本身也寫了一個:html
WITH cte1 as ( select stu.deptID, D.depName, stu.stuid , stu.stuName, score_sum.AllScore from dbo.Student stu inner join (select stuid ,SUM(score) as AllScore from dbo.Score group by stuid) score_sum on stu.stuid =score_sum.stuid inner join dbo.Department D on stu.deptID= D.depID ) select cte1.* from cte1 inner join (select deptID, max(AllScore) maxScore from cte1 group by deptID) M on cte1.AllScore = M.maxScore and cte1.deptID=M.deptID order by cte1.deptID, cte1.stuid
咱們工做中經常遇到相似的複雜查詢,但常見的作法是把它寫到BLL程序中,也有同窗喜歡寫在存儲過程當中,它有什麼問題呢?面試
除此以外,SQL語句不論寫到程序中或者寫在存儲過程當中,都有一個很大的缺點,程序沒法跨數據庫平臺!sql
若是把全部的SQL語句都集中管理在一個配置文件中,那麼程序編寫和維護、發佈都要方便不少,也容易跨數據庫平臺,甚至能夠根據這個SQL配置文件,寫個代碼生成器,自動生成DAL層代碼。 大名鼎鼎的 iBatis,MyBaits.Net 就是這樣的功能,但它定義了一套複雜的規則,配置起來很複雜,項目可能80%的時間都在寫查詢配置,若是沒有代碼工具開發工做量很大的。數據庫
固然,與MyBatis不同之處,SOD框架並不主張將項目的查詢都用SQL寫到SqlMap文件,建議你們僅將複雜的SQL查詢寫到SqlMap配置文件,通常項目這類複雜查詢也就20%左右,而對於80%的通常查詢,使用ORM便可,框架同時支持ORM與SqlMap技術,這是SOD框架的一大特色!安全
PDF.NET SOD框架的SQL-MAP功能借鑑了iBaits的思想,可是大力簡化它的配置並提供代碼生成工具,能夠自動化的完成DAL代碼生成,下面是它的工做過程:app
SOD框架提供了SqlMap配置文件管理器來管理和編寫SQL配置文件,而後經過代碼生成器生成DAL層代碼,最後交給SODk框架執行。框架
編寫SQL配置文件,若是經過上面說的配置工具來作,能夠參考這篇文章:ide
但這個程序太老,一直沒有更新,工具的下載地址是:工具
http://ft.codeplex.com/releases/view/65308
工具包含在這個「集成開發工具」 內,經過菜單或者圖標便可操做。下面是集成開發工具打開數據庫並執行本文的查詢的界面:
SQL-MAP配置管理工具不太好用,初學者學習概念能夠試一試,可是要想熟練應用,推薦使用VS來寫這個SQL配置文件更方便。本文將向你們詳細介紹這個過程。
以下圖所示,新建一個 SqlMapDemo項目,在它裏面先添加一個XML文件,文件命名爲 SqlMap.config ,而後,找到上面的「集成開發工具」的安裝目錄,添加 SqlMap.xsd 文件。該文件很重要,它是咱們在VS裏面編寫XML文件可以有 智能提示 的關鍵。
添加了這個XSD文件到項目後,還須要把下面的內容
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="SqlMap.xsd"
注意:有關此詳細內容,請參見《PDF.NET(PWMIS數據開發框架)之SQL-MAP目標和規範》。
將上面的內容添加到剛纔的SqlMap.config 文件中,這樣,輸入尖括號,或者輸入空格,智能提示內容就出來,以下所示:
這是添加完整的SqlMap.config 文件,該文件徹底手寫,在智能提示的幫助下,編寫仍是很方便的。請注意配置文件內各個節點屬性的內容,詳細內容請看上面連接的文件。注意,這裏要用 CDATA 來寫SQL查詢。
注意:若是要執行得到結果集的查詢,須要在Sql-Map文件的命令節點裏面使用 Select 節點,而且須要指明 ResultClass 的類型,它有下面幾種可選值:
注意:若是指定 ResultClass="EntityObject" / ResultClass="EntityList" ,那麼須要同時申明 ResultMap 屬性,表示結果要映射到的具體類型,好比:
ResultClass="EntityObject" ResultMap="XXXNameSpace.YYYEntityClass"
有關此詳細內容,請參見《PDF.NET(PWMIS數據開發框架)之SQL-MAP目標和規範》。
打開PDF.NET集成開發工具,選擇菜單 「配置」--SQL-MAP代碼生成器配置,出現下面的界面:
在編輯區域,鼠標右鍵菜單,啓用用編輯,若是是第一次配置,請必定刪除配置文件內的中文註釋,不然配置文件格式沒法識別。
這裏主要配置SqlMap.config文件所在的完整路徑,輸出代碼的目錄,以及命名空間之類。
編輯完成,在編輯區的鼠標右鍵菜單上,啓用「保存文件」的功能。
若是上面配置正確,點擊第二個工具欄的圖標,就能夠自動調用處 PDFCodeMaker.exe 程序,讀取配置文件信息,自動生成DAL代碼文件,以下圖:
6
以後,咱們添加剛纔生成的DAL代碼文件到項目中,如上圖。
SqlMap配置文件有2種使用方式,
在本示例中,採用嵌入式編譯的方式,這樣SQL語句的安全性更高,而且支持一個項目中使用多個SqlMap配置文件,可是不如做爲獨立文件使用修改方便。以下圖:
這種方式編譯,該資源文件的名字就是 「程序集默認名字空間.目錄名字.文件名字」 ,這裏的例子是 SqlMapDemo.SqlMap.config ,因爲在跟目錄下面,沒有目錄名字。
注意,要正確使用嵌入式SQL配置文件,還必須在該文件中指出"嵌入文件的程序集名稱,資源文件名字「,如本例以下圖紅色邊框標記的部分所示:
SqMap.config 文件修改完成後,在此啓動 PDFCodeMaker.exe 程序,從新生成DAL文件,以下所示,增長了簽入式文件的設置:
檢查發現,DAL類文件的名字空間不正確,這裏修改下配置文件的 RootNameSpace 部分,以下圖:
從新生成DAL類文件,咱們看看最後生成的SqlMapDAL類的內容:
//使用該程序前請先引用程序集:PWMIS.Core,而且下面定義的名稱空間前綴不要使用PWMIS,更多信息,請查看 http://www.pwmis.com/sqlmap // ======================================================================== // Copyright(c) 2008-2010 公司名稱, All Rights Reserved. // ======================================================================== using System; using System.Data; using System.Collections.Generic; using PWMIS.DataMap.SqlMap; using PWMIS.DataMap.Entity; using PWMIS.Common; namespace SqlMapDemo.SqlMapDAL { /// <summary> /// 文件名:TestSqlMapClass.cs /// 類 名:TestSqlMapClass /// 版 本:1.0 /// 建立時間:2015/5/12 17:16:32 /// 用途描述:SQL-MAP示例測試程序 /// 其它信息:該文件由 PDF.NET Code Maker 自動生成,修改前請先備份! /// </summary> public partial class TestSqlMapClass : DBMapper { /// <summary> /// 默認構造函數 /// </summary> public TestSqlMapClass() { Mapper.CommandClassName = "TestGroup"; //CurrentDataBase.DataBaseType=DataBase.enumDataBaseType.SqlServer; Mapper.EmbedAssemblySource="SqlMapDemo,SqlMapDemo.SqlMap.config";//SQL-MAP文件嵌入的程序集名稱和資源名稱,若是有多個SQL-MAP文件建議在此指明。 } /// <summary> /// 找出每個系的最高分,而且按系編號,學生編號升序排列 /// </summary> /// <returns></returns> public DataSet QueryStudentSores( ) { //獲取命令信息 CommandInfo cmdInfo=Mapper.GetCommandInfo("QueryStudentSores"); //執行查詢 return CurrentDataBase.ExecuteDataSet(CurrentDataBase.ConnectionString, cmdInfo.CommandType, cmdInfo.CommandText ,null); // }//End Function }//End Class }//End NameSpace
團隊開發經常涉及到文件修改衝突,SqlMap配置文件也會遇到,若是你們不去修改同一個Command配置,用源代碼管理器的自動合併功能是沒有問題的。
若是是獨佔式簽出管理,那麼一個開發人員使用SqlMap文件,另一個就只有等待了,但框架提供了變通的方式來解決這個問題。
注意:建議每個開發人員負責一個SqlMap.config文件的管理,而後各自配置本身的PDFCodeMaker.exe.config
在同一個SqlMap.config 文件裏面添加新的 <Script Type="" 節點,好比Oracle ,而後將原來數據庫類型的SQL查詢改寫成當前類型的SQL查詢語句 ,程序會根據DBMapper的AdoHelper的實際類型自動選擇正確的<Script Type="" 節點,從而完成數據庫切換,實現你的應用系統跨數據庫的功能。
另外,也能夠另外創建一個SqlMap.config 文件,裏面專門寫新的數據庫下面的SQL語句,咱們之前一個銀行的項目,就是這樣從SqlServer移植到PostgreSql的。
SQL-MAP DAL類程序仍然經過AdoHelper 對象來執行,這裏添加一個應用程序配置文件:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name ="default" connectionString="Data Source=.;Initial Catalog=TestDB;Integrated Security=True" providerName="SqlServer"/> </connectionStrings> </configuration>
而後,就能夠寫以下的代碼來測試SQL-MAP程序了:
class Program { static void Main(string[] args) { Console.WriteLine("PDF.NET SOD框架 SqlMap示例程序--2015.5.12-------"); Console.WriteLine("http://www.pwmis.com/sqlmap ---------"); SqlMapDemo.SqlMapDAL.TestSqlMapClass test = new SqlMapDAL.TestSqlMapClass(); //AdoHelper db = new SqlServer(); //取最後一個鏈接配置 AdoHelper db = MyDB.GetDBHelper(); //SQL-MAP DAL 默認也會取最後一個鏈接配置,因此下面一行代碼能夠註釋 //test.CurrentDataBase = db; DataSet data = test.QueryStudentSores(); Console.WriteLine("查詢到記錄數量:{0}",data.Tables[0].Rows.Count); Console.WriteLine("測試完成。"); Console.Read(); } }
結果運行以下:
設置一個斷點,咱們來看看 」SQL-MAP DAL對象「的Mapper對象有哪些內容:
在及時窗口輸入 test.Mapper ,回車,就可看到上面的內容了。這裏顯示了剛纔配置的SQL-MAP嵌入式文件的位置和文件獨特的路徑:SqlMapFile 屬性。
下面是詳細的結果:
test.Mapper {PWMIS.DataMap.SqlMap.SqlMapper} _CommandClassName: "TestGroup" _DataBase: {PWMIS.DataProvider.Data.SqlServer} _dataBaseType: SqlServer _embedAssemblySource: "SqlMapDemo,SqlMapDemo.SqlMap.config" _ParaChar: "@" _ParamsMap: {PWMIS.Common.ParamMapType[0]} _ParasLenth: 0 _ResultClass: ValueType _ResultMap: "" _SqlMapFile: "@R://SqlMapDemo,SqlMapDemo.SqlMap.config"
測試徹底正確,使用 SOD框架的SQL-MAP 技術是否是很簡單?
後續都只須要修改下文件裏面的SQL語句就好了,
一次配置,一鍵生成!
這就是,SOD框架的SQL-MAP 技術的特色!結合SOD框架的ORM功能,它徹底能夠代替MyBatis.Net 。
感謝你們關注PDF.NET SOD框架,這是一個開源免費的框架,詳細信息請看官網 http://www.pwmis.com/sqlmap
框架開源項目地址:http://pwmis.codeplex.com ,本項目示例代碼已經簽入到codeplex 上,你們能夠經過SVN下載使用。
本篇程序已經提供了獨立的下載: Sql-Map Demo