標籤:類的屬性 快速 gre 標準 models sch direct 等於 資料庫的操作
隨著大資料技術的興起和快速發展,人們更多的開始關注HDFS、HBase、Hive等技術。但是談到強一致性,我們又不得不迴歸現實,只能繼續沿用RDBMS儲存強一致性的資料。我們日常接觸到的絕大多數的應用(從App到遊戲,從互連網應用到SAP)都是基於資料的,應用程式執行的過程也是不斷進行資料處理的過程,而應用的設計是物件導向的,資料庫更多是面向資料的,兩種不同思維造成系統理解、設計的複雜性。同時隨著業務複雜度的不斷提高,對資料庫的依賴也不斷增加,逐漸造成系統與資料庫耦合過於緊密。
隨著物件導向、系統解耦的要求,我們希望能有一種技術實現將資料庫結構轉化成易於理解的程式資料結構。通過對程式資料的處理,轉化為對資料庫的操作。而這正是ORM(對象關係映射object Relational Mapping)的一個理論基礎。
ORM方法論基於三個核心原則:
簡單性:以最基本的形式建模資料。
傳達性:資料庫結構被任何人都能理解的語言文檔化。
精確性:基於資料模型建立正確標準化了的結構。
一、ORM與IBatis
早些年在Java領域有一個非常知名的架構SSH(Spring + Struts +Hibernate)。他們各自承擔這不同的職責,實現了表現層、業務層和資料持久化層分離,降低了各層耦合。其中Hibernate則主要是實現了業務層與資料化持久層的解耦。Hibernate建立的理論基礎是ORM。它是建立將物件導向的資料轉化和操作映射為資料持久化操作的一種技術。
在ORM的領域中除了Hibernate還有很多其他架構。例如EntityFrameword、IBatis等。我們今天要介紹的就是IBatis,這個被稱為“半自動化”的ORM架構。
要介紹IBatis首先要說一下“半自動化”這個定語。之所有成IBatis為“半自動化”,是相對於Hibernate而言的。Hibernate可以實現不編寫Sql語句實現將商務資料執行轉化為資料庫操作。IBatis沒有像Hibernate那樣進行全面的封裝,它並沒有拋棄Sql語句,甚至它不會減少Sql語句的編寫量,它只是提供了一種將Sql語句與系統分離的方式,這也給我們留下了足夠了空間發揮Sql的強大文法。
二、IBatis原理
IBatis的基本原理的理解可以從理解官方文檔中的這個圖開始
IBatis以SqlMap為核心,將輸入參數、輸出結果進行持久化語句與CLR類型的轉化。輸入參數類(Parameter object)經過SqlMap中設定的資料處理方式,並結合持久化資料處理方式(ADO.NET),從而產生輸出結果類(Result object)。對於.NET應用程式業務處理來說,實現了類的方法處理,從而實現了應用邏輯與資料持久化的隔離。
從可以看出,輸入參數Parameter object和輸出結果Result object均支援集合類型、基本類型、實值型別。其中間為核心的資料轉化過程。資料轉化過程是通過XML配置進行約束的。本文章為技術實踐文章,因此重點為IBatis相關設定檔的使用。
三、IBatis設定檔
1、SqlMap.config
IBatis基本運行環境的核心設定檔為SqlMap.config檔案。它類似於應用程式的App.config和Web.config。IBatis的其他檔案均是通過此設定檔載入到系統中的。基本的SqlMap.config如所示:
SqlMap.config主要包括幾部分:Settings、providers、database、sqlMaps
Settings:主要進行IBatis全域基礎配置,它包括三個配置項
節點名 |
說明 |
預設值 |
useStatementNamespaces |
是否使用語句命名空間,這裡的命名空間指的是對應檔中sqlMap節點的namespace屬性。即如果該參數設為"true", 語句調用時需追加命名空間。 |
FALSE |
cacheModelsEnabled |
配置是否啟用IBatis的配置項緩衝機制 |
TRUE |
validateSqlMap |
配置是否啟用SqlMapConfig.xsd schema驗證對應檔 |
FALSE |
其中useStatementNamespaces是在系統內容中可能需要應用的。當值為“true”調用語句時需要添加其設定檔頭中命名空間名稱。例如
當useStatementNamespaces="true",調用時則需要通過名稱“Complex.ComplexMap”,如果為false則通過名稱"ComplexMap"進行調用。
Providers:配置資料驅動提供類設定檔的路徑和檔案名稱。
此配置中對應的檔案中描述了多種資料驅動方式,通過配置可以保證IBatis支援市面上主流的資料(如Oracle\MsSql\MySql\sqlite\access等)。如需更換資料庫,需要將設定檔中相應啟動器的Enabled設定為“true”,並修改Database節中的配置即可。
Database:主要用來進行資料庫磁碟機配置和資料庫連接字串的配置。
provider的值應與providers設定檔中的name對應,並需要將providers設定檔中enabled設定為“true”。
dataSource的值為資料庫連接字串。為了更好的匹配串連字元,減少修改連接字串的複雜度,可採用properties進行預定義處理。
sqlMaps:可以在配置節中添加XML對應檔的位置,以指定項目內所包含的所有對應檔。引用xml檔案有三種方式
參數 |
說明 |
resource |
指定資料驅動設定檔從項目的根目錄進行載入,如resource="providers.config" |
url |
指定資料驅動設定檔從檔案的絕對路徑進行載入,如url="c:\IBatis\Resources\providers.config" -或者- url="file://c:\IBatis\Resources\providers.config" |
embedded |
指定資料驅動設定檔可以作為程式集的資源檔進行載入,如embedded="Resources.providers.config, MyApp.Data" |
設定檔中還有一些其他的配置方式(如properties、alias、typeHandlers),這裡就不一一介紹。
2、SqlMap.XML
SqlMap主要包括三部分,入參配置(Parameter)、返回結果配置(Result)、資料操作Sql配置(statements)。
parameter
用於配置入參格式,通過配置傳入到statements中,parameter可以用過parameterClass或parameterMap兩種方式傳入。
parameterClass可配置為應用程式類別名,將相應的類執行個體傳入到IBatis架構,通過其屬性名稱作為SqlMap語句匹配元素進行配置,從而產生相應的Sql語句。
parameterMap可以對parameterClass進行擴充,從而實現空值轉化、欄位匹配等功能,通過配置的方式實現對空值、名稱匹配等的處理。
Result
Resul也包括兩種形式,resultClass和resultMap。resultClass配置可以將傳回值映射為設定的類的執行個體,可以將查詢結果等映射到相應的類中。
resultMap對resultClass擴充,可以設定資料查詢欄位與類資料欄位的對應關係。
屬性 |
說明 |
parameterMap |
參數映射,需結合parameterMap節點對映射關係加以定義,對於預存程序之外的statement而言,建議使用parameterClass作為參數配置方式,一方面避免了參數映射配置工作,另一方面其效能表現更加出色 |
parameterClass |
參數類。指定了參數類型的完整類名(包括命名空間),可以通過別名避免每次書寫冗長的類名 |
resultMap |
結果映射,需結合resultMap節點對映射關係加以定義 |
resultClass |
結果類。指定了結果類型的完整類名(包括命名空間),可以通過別名避免每次書寫冗長的類名 |
其中parameterMap和resultMap格式類似,主要包含如下屬性:
屬性 |
說明 |
property |
指定類中的一個屬性 |
column |
定義的參數名稱 |
direction |
用於聲明預存程序的參數方向(input,output,inputoutput) |
dbType |
用於指定property映射到資料庫中的資料類型 |
type |
用於為參數的對象指定CLR類型 |
nullValue |
指定在property為何值時,將會在儲存資料時候,替換為null,這是經常會被用到的 |
size |
用於指定最大值 |
註:parameter和result都會涉及到類的屬性,按照C#語言特性,屬性等均是區分大小寫,因此在進行XML配置時,需要特別注意。
Statements
IBatis進行類和Sql進行相互轉化的核心。他主要由id、parameter、result、動態Sql組成,前面初步介紹了id、parameter、result,以下終端介紹動態Sql語句。
為了更靈活的進行Sql語句匹配,IBatis進行了定義了多個運算子。
運算子 |
條件 |
說明 |
常式 |
isEqual |
二元條件 |
相等 |
<isEqual prepend="and" property="StartDate" compareValue="25/12/2004"> |
isNotEqual |
二元條件 |
不相等 |
<isNotEqual prepend="AND" property="year" compareValue="0"> |
isGreaterEqual |
二元條件 |
大於等於靜態值 |
<isGreaterEqual compareValue="3" > |
isGreaterThan |
二元條件 |
大於 |
<isGreaterThan prepend="AND" property="Id" compareValue="0" > |
isLessEqual |
二元條件 |
小於等於 |
<isLessEqual compareValue="3" > |
isLessThan |
二元條件 |
小於 |
<isLessThan compareValue="3" > |
isNotEmpty |
一元條件 |
是否不為 null 或不為空白 |
<isNotEmpty prepend="and" property="LastName" > |
isEmpty |
一元條件 |
是否為 null或空 |
|
isNotNull |
一元條件 |
檢查屬性是否不為 null。 |
<isNotNull prepend="AND" property="FirstName"> |
isNotParameterPresent |
|
檢查是否不存在參數對象 |
<isNotParameterPresent prepend=”AND”> |
isNotPropertyAvailable |
一元條件 |
檢查是否不存在該屬性 |
|
isNull |
一元條件 |
檢查屬性是否為 null。 |
|
isParameterPresent |
|
檢查是否存在參數對象(不為 null)。 |
isPropertyAvailable |
一元條件 |
檢查是否存在該屬性 |
|
iterate |
|
|
|
運算子的使用主要是針對輸入參數的。
二元運算子
<isEqual property="name" compareValue="1" prepend="and"> a1= ‘abc‘ </isEqual>
輸入參數name屬性的值等於1時,將在sql中組合 a1= ‘abc‘,否則不進行Sql組合。
類似isNotEqual、isGreaterEqual、isGreaterThan、isLessEqual、isLessThan等均為類似的用法。
一元運算子
<isEmpty property="name" prepend="and"> a1= ‘abc‘ </isEqual>
輸入參數name屬性的值為空白時,將在sql中組合 a1= ‘abc‘,否則不進行Sql組合。
數組運算子
將數組轉為化sql語句的一種方式,例如
<iterate property="Ids" open="(" close=")" conjunction="," =""> #Ids[]#</iterate>
將數組轉化為類似於“(1,2,3,4,5)”的Sql語句。
通過一系列的配置我們將程式的一個方法或一個對資料庫的操作轉化為一個SqlMap.Xml中的配置,方法入參轉化為parameter,方法出參轉化為result,而方法名轉化為id,從而實現了物件導向的業務方法轉化為資料庫操作。
IBatis除了以上文法要點,還包括一些其他文法例如extends、緩衝等。完整的文法支援,保證了IBatis對絕大多數情境的支援。本文在很多知識點只是進行了簡單的說明,遠遠沒有展示IBatis的全貌。只有通過不斷的學習積累,並靈活應用才能發揮其強大的配置功能,才能更好的發揮IBatis的功能,實現真正的業務與資料的分離。
iBatis.net技術實踐