一、框架的由來 快速入門
有關框架的更多信息,請看框架官方主頁!本套框架的思想是借鑒Java平台的Hibernate 和 iBatis 而來,兼有ORM和SQL-MAP的特性,同時還參考了后來.NET的LINQ(本框架成型於2006年,當時還未聽說過LINQ)使用風格,設計了OQL查詢表達式。本框架的設計思想是通用的,完全可以移植到Java 平台,現在只提供了.NET平台的實現,暫且將本框架命名為 PDF.NET |
|
從2013.10.1日起,原PDF.NET 將更名為 SODone SQL-MAP,ORM,Data Control framework PDF.NET 開源歷史:
開源協議:
注:框架的支持工具指的是集成開發工具,可以連接各種數據庫進行查詢,生成實體類,SQL-MAP DAL和 SqlMap.config 文件。 |
二、開源捐助賬號
右圖為二維碼捐款方式 感謝所有PDF.NET 框架的會員朋友熱心的捐助,並為框架不斷完善和推廣作出的傑出貢獻!2015新春之際,送紅包給大家! |
三、快速入門:
3.1,總覽
SOD框架分為3大部分:
- SQL-MAP
- ORM
- Data Control
3.2,“SqlHelper”基礎
這三大部分,都是基於AdoHelper組件,它符合MS DAAB標准,所以熟悉SqlHelper的人應該很容易上手,下面舉例說明:
AdoHelper helper=new SqlServer(); DataSet ds=helper.ExecuteDataSet( ”Data Source=.;Initial Catalog=LocalDB;Integrated Security=True”, CommandType.Text, ”SELECT * FROM Table_User”);
AdoHelper是一個抽象類,所以它可以實例化成其他數據庫訪問類,比如繼續下面的代碼:
helper=new Access(); //Access數據庫訪問類 DataSet dsAcc=helper.ExecuteDataSet( ”Provider=Microsoft.ACE.OLEDB.12.0;Jet OLEDB:Engine Type=6;Data Source=D:\Data\SuperMarket.accdb”, CommandType.Text, ”SELECT * FROM Table_User”);
在 PWMIS.Core.dll SOD核心庫中,內置了SqlServer,SqlServerCe,Access,Oracle,OleDb,Odbc 等常見的數據庫訪問類提供程序。
在程序中每次都指定連接字符串和查詢命令類型,好處是“隨用隨取”,線程安全,隨時隨地“SqlHelper”,但不好之處就是代碼冗余,所以可以把數據訪問類類型和連接字符串放到應用程序配置文件中(App.config / Web.config ):
<connectionStrings> <add name="AccessDb"
connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Jet OLEDB:Engine Type=6;Data Source= |DataDirectory|SuperMarket.accdb"
providerName="Access"/> </connectionStrings>
在上面的連接配置中, providerName="Access" 表示這將是用SOD框架的Access數據庫訪問提供程序,同樣道理,如果 providerName="SqlServer" 將使用SqlServer提供程序。
如果是SOD 核心程序之外的數據訪問提供程序,需要使用下面格式的連接配置:
<add name="default" connectionString="server=10.0.0.1;User Id=pdfnet;password=pdfnet2015;CharSet=utf8;DataBase=test;Allow Zero Datetime=True" providerName="PWMIS.DataProvider.Data.MySQL,PWMIS.MySqlClient"/>
這個配置說明,連接名為 default 的SOD數據訪問驅動程序 所在程序集 是 PWMIS.MySqlClient.dll ,提供程序全名稱是 PWMIS.DataProvider.Data.MySQL 。
注意:Web.config 文件中,連接字符串支持|DataDirectory| 路徑格式。
配置了數據庫連接信息之后,就可以在程序中像下面這樣使用了:
using PWMIS.DataProvider.Adapter;//… AdoHelper accessDb1=MyDB.Instance;//應用程序配置文件連接配置節的最后一個數據連接配置 AdoHelper accessDb2=MyDB.GetDBHelperByConnectionName(“AccessDb”); //連接字符串名字
AdoHelper mySqlDb=MyDB.GetDBHelperByConnectionName(“default”); //連接字符串名字 bool flag= accessDb.GetType() == typeof(Access); //flag=true;
bool flag2= mySqlDb.GetType() == typeof(PWMIS.DataProvider.Data.MySQL); //flag2=true;
注意示例中的 MyDB.Instance 對象,這是系統使用的默認數據訪問類,它始終讀取的是應用程序配置文件連接配置節的最后一個數據連接配置,這是一個靜態單利對象,請勿在事務中使用它,初此之外,在任何地方使用它都是可以的,但仍然不建議你在多線程環境下使用 MyDB.Instance 這個AdoHelper的單例對象,推薦 accessDb2 的AdoHeper 實例化方式。
3.3,微型ORM
除此之外,AdoHelper 對象還是一個“微型ORM”,請看下面的示例:
AdoHelper dbLocal = new SqlServer(); dbLocal.ConnectionString = "Data Source=.;Initial Catalog=LocalDB;Integrated Security=True"; var dataList = dbLocal.GetList(reader => { return new { UID=reader.GetInt32(0), Name=reader.GetString(1) }; }, "SELECT UID,Name FROM Table_User WHERE Sex={0} And Height>={1:5.2}",1, 1.60M);
上面將一條SQL語句的結果,直接映射到了一個匿名實體類上,注意還有格式化參數的功能。
如果不想接SQL結果映射到匿名類型上,而是一個結構根SQL結果類型相同的POCO類上,可以這樣使用:
//假設UserPoco 對象跟 Table_User 表是映射的相同結構 AdoHelper dbLocal = new SqlServer(); dbLocal.ConnectionString = "Data Source=.;Initial Catalog=LocalDB;Integrated Security=True"; var list=dbLoal.QueryList<UserPoco>("SELECT UID,Name FROM Table_User WHERE Sex={0} And Height>={1:5.2}",1, 1.60M);
該功能可以類似流行的Dapper 數據訪問組件,可以使用SOD AdoHelper替代使用。
3.4,小結:
上面說明了PDF.NET SOD框架最基礎的數據訪問組件 AdoHelper 的使用,但這也是很多新手朋友不太清楚的地方,特別是 MyDB.Instance 單例對象容易濫用,一定要掌握。
SOD框架絕大部分情況下,只需要進行上面的數據連接配置,即可順利運行代碼了,比起Entity Framework 的配置來,是不是簡單很多?
看到這里,我想你應該入門了,下面就讓我們簡要的瀏覽下SOD框架的一個大概。
----
四、SQL-MAP
你是不是曾經或者看到過別人做的項目,
- 大量拼接SQL語句,或者SQL參數化查詢后拖沓呈長而又繁瑣的代碼,甚至SQL滿天飛?
- 維護這樣的代碼是不是非常痛苦?
- 每天寫這樣的CRUD代碼是不是感覺有點浪費生命?
現在好了,你可以將所有SQL語句集中寫到一個配置文件中,集中管理維護你的查詢程序,甚至,這個工作你可以丟給DBA去做!
本功能類似於Java界著名的 iBatis 和移植到.Net的 MyBatis.Net ,但是,SQL-MAP去除了它們沉長的配置,並且使用工具自動生成代碼,使得編寫DAL 數據訪問層不需要寫一行代碼,請參考下面的文章:
更多的內容,你也可以參考SOD框架官方博客的介紹:
(PDF.NET框架實例講解)將存儲過程映射為實體類 深藍醫生 2011-08-18 17:25 閱讀:1748 評論:6
使用XSD編寫具有智能提示的XML文件(以SQL-MAP腳本為實例) 深藍醫生 2011-05-13 12:17 閱讀:1609 評論:7
PDF.NET(PWMIS數據開發框架)之SQL-MAP目標和規范 深藍醫生 2011-05-07 00:05 閱讀:937 評論:1
抽象SQL查詢:SQL-MAP技術的使用 深藍醫生 2011-05-06 11:59 閱讀:3598 評論:21
使用OQL+SQLMAP解決ORM多表復雜的查詢問題 深藍醫生 2011-02-25 19:08 閱讀:928 評論:0
PDF.NET數據開發框架 之SQL-MAP使用存儲過程 深藍醫生 2010-07-03 23:31 閱讀:2386 評論:4
五、ORM
SOD框架發明了獨具特色的ORM查詢語言OQL,它基本覆蓋了SQL92標准的大部分功能,使得你在VS IDE 使用“對象化的SQL”。目前做到這個功能的除了Linq之外,沒有更多的ORM具有這個能力,但是對比EF框架的查詢語言Linq,OQL有自己的特色,它跟SQL更為接近,對.NET框架的依賴非常小,這使得你有可能將OQL移植到Java ,C++ 這樣的面向對象的語言。
下面給出一個簡單的示例,有關該示例的詳細內容,請參考這篇博客文章《DataSet的靈活,實體類的方便,DTO的效率:SOD框架的數據容器,打造最適合DDD的ORM框架》
SOD的實體類示例:
public class UserEntity:EntityBase, IUser { public UserEntity() { TableName = "Users"; IdentityName = "User ID"; PrimaryKeys.Add("User ID"); } public int UserID { get { return getProperty<int>("User ID"); } set { setProperty("User ID", value); } } public string FirstName { get { return getProperty<string>("First Name"); } set { setProperty("First Name", value,20); } } public string LasttName { get { return getProperty<string>("Last Name"); } set { setProperty("Last Name", value,10); } } public int Age { get { return getProperty<int>("Age"); } set { setProperty("Age", value); } } }
這是一個簡單的用戶信息實體類,它繼承了一個接口 IUser ,在App.config 中配置了數據連接后,就可以像下面這樣使用了:
EntityBuilder.RegisterType(typeof(IUser), typeof(UserEntity)); UserEntity user = EntityBuilder.CreateEntity<IUser>() as UserEntity; //實體類作為索引器使用
bool flag = (user["User ID"] == null);//true //刪除測試數據 LocalDbContext context = new LocalDbContext();//自動創建表 OQL deleteQ = OQL.From(user) .Delete() .Where(cmp=>cmp.Comparer(user.UserID,">",0)) //為了安全,不帶Where條件是不會全部刪除數據的 .END; context.UserQuery.ExecuteOql(deleteQ); Console.WriteLine("插入3條測試數據"); //插入幾條測試數據 context.Add<UserEntity>(new UserEntity() { FirstName ="zhang", LasttName="san" }); context.Add<IUser>(new UserDto() { FirstName = "li", LasttName = "si", Age = 21 }); context.Add<IUser>(new UserEntity() { FirstName = "wang", LasttName = "wu", Age = 22 }); //查找姓張的一個用戶 UserEntity uq = new UserEntity() { FirstName = "zhang" }; OQL q = OQL.From(uq) .Select(uq.UserID, uq.FirstName, uq.Age) .Where(uq.FirstName) .END; //下面的語句等效 //UserEntity user2 = EntityQuery<UserEntity>.QueryObject(q,context.CurrentDataBase); UserEntity user2 = context.UserQuery.GetObject(q);
注意:該實例需要SOD框架最新版本的支持,你也可以使用之前的方式,使用EntityQuery<T> 來操作實體類。
另外,SOD的ORM也支持根據接口之間創建實體類並查詢的功能,請看下面的示例:
static void TestGOQL() { string sqlInfo=""; //下面使用 ITable_User 或者 Table_User均可 List<ITable_User> userList = OQL.FromObject<ITable_User>() //.Select() //選全部自斷 .Select(s => new object[] { s.UID, s.Name, s.Sex }) //僅選取3個字段 .Where((cmp, user) => cmp.Property(user.UID) < 100) .OrderBy((o,user)=>o.Asc(user.UID)) .Limit(5, 1) //限制5條記錄每頁,取第一頁 .Print(out sqlInfo) .ToList(); Console.WriteLine(sqlInfo); Console.WriteLine("User List item count:{0}",userList.Count); }
有關該功能的詳細內容介紹,請看博客文章《一行代碼調用實現帶字段選取+條件判斷+排序+分頁功能的增強ORM框架》。
六、Data Control
框架支持Windows Forms,WebForms 的窗體編程,擴展了一套數據控件,包括常用的 文本框、復選框、單選框、列表框、日歷控件、標簽控件等。這些控件全部遵循SOD的窗體數據接口,實現這個接口的控件將極大的簡化窗體應用程序的數據操作,有關內容詳細介紹,請看這篇博客文章:
《不使用反射,“一行代碼”實現Web、WinForm窗體表單數據的填充、收集、清除,和到數據庫的CRUD》
你也可以在 pwmis.codeplex.com 下載源碼,找到下面地址對應的SimpleAccessWinForm,
或者下載這個 PDF.Net_V4.6 WinForm 數據表單實例
或者看這個 WebTestTool
這2個示例應用程序,都演示了WinForm下如何使用Data Control 數據控件簡化CRUD窗體編程。
另外,如果你是WebForms 應用程序,開源項目的超市管理系統源碼 你可以看看,
或者直接下載這個(版本較老) PDF.Net_V4.6_OpenSource (new)
結束語:
SOD不僅僅是一個ORM,它還有SQL-MAP和DataControl,具體可以看框架官網 http://www.pwmis.com/sqlmap ,9年歷史鑄就的成果,堅固可靠。
非常感謝你看到這里,相信你初步了解了SOD框架的基本功能,如果您還有其它問題,歡迎你在項目的開源網站 pwmis.codeplex.com 的討論去發帖,或者去官方博客相關文章回帖也可。
最后,祝願所有.NET 程序員早日擺脫日復一日的CRUD功能,感謝大家對PDF.NET SOD框架一如既往的支持,
2015年新春之際,祝賀各位會員和其他使用框架的朋友喜氣洋洋,合家歡樂,萬事如意!
附注:如果大家還沒有買到節日期間的火車票,推薦本框架開發作者自主開發的《12306無聲購票彈窗通知小工具》,工作搶票2不誤,綠色無毒安全放心!
深藍醫生
2015.2 月春節