程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#發現之旅第十一講 使用反射和特性構造自己的ORM框架(上)(3)

C#發現之旅第十一講 使用反射和特性構造自己的ORM框架(上)(3)

編輯:關於C語言

這種將映射信息保存在代碼中的方式有利有弊,好處是程序代碼比較集中,修改代碼方便,壞處就是當數據庫結構或者映射關系發生改變時,需要修改代碼,這導致重新編譯重新部署。一些ORM框架使用XML配置文件來保存對象和數據庫的映射關系,不過這會導致代碼,數據庫和映射配置文件的三者同步更新的操作,工作量大,會加大開發成本,當然好處是當數據庫結構或者映射關系發生改變時,只需要修改數據庫和配置文件,程序代碼不需要更新,從這方面看有利於系統的維護。不過在很多實踐中,數據庫或映射關系改變時,很容易導致程序代碼必須作相應的修改,此時會導致代碼,數據庫和映射配置文件的同步更新工作。因此映射配置信息采用何種保存模式需要開發者自己權衡,不過在這裡由於是要演示使用反射和特性的,因此映射配置信息是保存在代碼中的。當然我們可以建立一個ORM框架,既支持使用特性存儲映射關系,也可以使用映射配置文件,不過比較復雜,本框架程序是演示程序,不會實現該功能。

開發者在編制存儲數據的類型後,使用BindTableAttribute和FIEldBindAttribute特性建立了映射關系後,ORM框架程序就能根據這些類型來操作數據庫了,目前的設計將提供以下幾種功能。

查詢數據庫,返回對象

使用本功能,框架可以根據指定的SQL查詢語句和對象類型查詢數據庫,並根據查詢結果生成若干個對象,並設置剛剛創建的對象的屬性值為字段值。在這個功能中,需要首先指定SQL查詢語句和對象類型。

在這個功能中,框架程序首先獲得對象類型的所有公開屬性,獲得其附加的BindFIEldAttribute特性,獲得這些屬性綁定的數據庫字段名。然後執行SQL查詢,遍歷所有查詢的紀錄,對每一個記錄都創建一個數據對象,並根據字段和屬性的映射關系將數據庫字段值保存到對象的屬性值中。如此就實現了查詢數據庫獲得對象的功能。

這個功能中需要用戶指定SQL查詢語言,也可以根據對象類型綁定的數據表名稱來自己拼湊SQL語句。

將對象插入到數據庫

在本功能中,框架程序使用反射獲得對象類型附加的BindTableAttribute特性,獲得該對象映射的數據表名;然後遍歷所有的公開實例屬性,若屬性附加了BindFIEldAttribute特性,則獲得該屬性映射的字段名。然後收集所有的屬性值和它們映射的字段名,使用字符串拼湊生成一個Insert的SQL語句。然後調用數據庫連接對象執行這個SQL語句,以實現向數據庫新增記錄的功能。

根據對象修改數據庫記錄

在本功能中,框架程序使用指定的對象來修改數據庫中的記錄。此時對象類型中至少有一個屬性附加了關鍵字段映射特性。框架程序使用反射獲得對象類型附加的BindTableAttribute 特性,獲得該對象映射的數據表名,然後遍歷屬性,獲得對象屬性和數據庫字段之間的映射關系。然後收集屬性值,使用字符串拼湊生成一個“Update 數據表名 Set 字段1=屬性1的值 ,字段2=屬性2的值 ”的SQL語句。然後還遍歷屬性,找到所有附加了關鍵字段特性的屬性以及綁定的字段名,拼湊出“Where 關鍵字段1=屬性1的值 and 關鍵字段2=屬性2的值”,這樣就能拼湊出一個完整的更新數據庫用的Update的SQL語句,然後調用數據庫連接對象執行這個SQL語句,就能實現更新數據庫記錄的功能。

根據對象刪除數據庫記錄

在本功能中,框架程序獲得對象類型綁定的數據表名,並遍歷所有的附加了綁定關鍵字段的特性,然後拼湊出“Delete From 數據表名Where 關鍵字段1=屬性1的值 and 關鍵字段2=屬性2的值”的SQL語句,然後調用數據庫連接對象來執行這個SQL更新語句,這樣就實現了刪除數據庫記錄的功能。

框架程序代碼說明

根據程序設計,我已經初步的把框架程序開發出來,現在對其源代碼進行說明。

數據表綁定信息 BindTableAttribute類型

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved