本發(fā)明涉及數(shù)據(jù)庫(kù)應(yīng)用技術(shù)領(lǐng)域,更為具體地,涉及一種數(shù)據(jù)庫(kù)訪問(wèn)系統(tǒng)及其訪問(wèn)方法。
背景技術(shù):
由于網(wǎng)絡(luò)的飛速發(fā)展,出現(xiàn)了很多基于java的web開(kāi)發(fā)框架,其中,Hibernate是當(dāng)前流行的java web開(kāi)發(fā)架構(gòu)中數(shù)據(jù)庫(kù)持久層訪問(wèn)技術(shù),通過(guò)提供各式接口,并提供SQL的轉(zhuǎn)換語(yǔ)言HQL來(lái)進(jìn)行操作,簡(jiǎn)化了SQL的寫(xiě)法,使之更容易與一個(gè)實(shí)體bean進(jìn)行映射,將數(shù)據(jù)庫(kù)的關(guān)聯(lián)操作通過(guò)配置與bean的復(fù)雜關(guān)聯(lián)形式實(shí)現(xiàn),依賴程序來(lái)保證數(shù)據(jù)庫(kù)的完整性,這種開(kāi)發(fā)框架只是對(duì)SQL進(jìn)行了封裝,對(duì)業(yè)務(wù)操作時(shí)還是交由開(kāi)發(fā)者自主實(shí)現(xiàn),對(duì)于純粹業(yè)務(wù)開(kāi)發(fā)的開(kāi)發(fā)人員來(lái)說(shuō)更多是一種額外的負(fù)擔(dān),增加了錯(cuò)誤的機(jī)率與學(xué)習(xí)成本。
另外,對(duì)于市場(chǎng)所有的持久化方案都是將SQL作為切入數(shù)據(jù)庫(kù)的方式,而數(shù)據(jù)處理則交給開(kāi)發(fā)進(jìn)行。
技術(shù)實(shí)現(xiàn)要素:
鑒于上述問(wèn)題,本發(fā)明的目的是提供一種只寫(xiě)類SQL語(yǔ)言從而達(dá)到操作數(shù)據(jù)庫(kù)的能力的數(shù)據(jù)庫(kù)訪問(wèn)系統(tǒng)及其訪問(wèn)方法。
根據(jù)本發(fā)明的一個(gè)方面,提供一種數(shù)據(jù)庫(kù)訪問(wèn)系統(tǒng)包括業(yè)務(wù)層、邏輯層和數(shù)據(jù)層,其中,所述業(yè)務(wù)層包括接口模塊,所述接口模塊包括一個(gè)以上的接口,每一個(gè)接口采用注解方式定義有類SQL語(yǔ)句和接口方法;所述邏輯層,位于所述業(yè)務(wù)層和所述數(shù)據(jù)層之間,用于接收數(shù)據(jù)庫(kù)操作請(qǐng)求數(shù)據(jù),根據(jù)所述數(shù)據(jù)庫(kù)操作請(qǐng)求數(shù)據(jù)觸發(fā)所述接口模塊中相應(yīng)的接口,解析所述接口的類SQL語(yǔ)句,實(shí)現(xiàn)所述接口的接口方法的處理邏輯;所述數(shù)據(jù)層,執(zhí)行所述邏輯層的處理邏輯,獲得返回值并反饋給所述邏輯層。
根據(jù)本發(fā)明的另一個(gè)方面,提供一種利用上述數(shù)據(jù)庫(kù)訪問(wèn)系統(tǒng)對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn)的方法包括:在業(yè)務(wù)層的接口模塊內(nèi)設(shè)置有一個(gè)以上的接口,其中,所述接口采用注解方式定義有類SQL語(yǔ)句和接口方法;通過(guò)邏輯層接收數(shù)據(jù)庫(kù)操作請(qǐng)求數(shù)據(jù),根據(jù)所述數(shù)據(jù)庫(kù)操作請(qǐng)求數(shù)據(jù)觸發(fā)業(yè)務(wù)層中相應(yīng)的接口,對(duì)所述接口內(nèi)的類SQL語(yǔ)句進(jìn)行解析,生成實(shí)現(xiàn)所述接口方法的處理邏輯;在數(shù)據(jù)層執(zhí)行所述邏輯層的處理邏輯,獲得返回值并反饋給所述邏輯層,實(shí)現(xiàn)所述接口方法。
本發(fā)明所述數(shù)據(jù)庫(kù)訪問(wèn)系統(tǒng)通過(guò)注解方式采用類SQL語(yǔ)言在業(yè)務(wù)層的接口內(nèi)定義接口方法,從持久化對(duì)象中獲取數(shù)據(jù)并且實(shí)例化實(shí)體對(duì)象,開(kāi)發(fā)者利用類SQL語(yǔ)言實(shí)現(xiàn)關(guān)注業(yè)務(wù)層,而不需要了解底層機(jī)制,提高開(kāi)發(fā)者在開(kāi)發(fā)時(shí)的開(kāi)發(fā)效率,減少開(kāi)發(fā)公司經(jīng)濟(jì)與時(shí)間上的投入,以及擴(kuò)展的維護(hù)成本。更加關(guān)注類似SQL語(yǔ)言開(kāi)發(fā)方式,對(duì)于開(kāi)發(fā)及錯(cuò)誤排查更有效率。
另外,本發(fā)明所述本發(fā)明所述數(shù)據(jù)庫(kù)訪問(wèn)系統(tǒng)直接在接口上查看接口方法,相對(duì)于在配置文件查看接口方法中,不需要切換視圖,能夠解決配置文件過(guò)大,維護(hù)乏味的問(wèn)題。
附圖說(shuō)明
通過(guò)參考以下結(jié)合附圖的說(shuō)明及權(quán)利要求書(shū)的內(nèi)容,并且隨著對(duì)本發(fā)明的更全面理解,本發(fā)明的其它目的及結(jié)果將更加明白及易于理解。在附圖中:
圖1是本發(fā)明數(shù)據(jù)庫(kù)訪問(wèn)系統(tǒng)第一實(shí)施例的構(gòu)成示意圖;
圖2是本發(fā)明數(shù)據(jù)庫(kù)訪問(wèn)系統(tǒng)第二實(shí)施例的構(gòu)成示意圖。
在所有附圖中相同的標(biāo)號(hào)指示相似或相應(yīng)的特征或功能。
具體實(shí)施方式
在下面的描述中,出于說(shuō)明的目的,為了提供對(duì)一個(gè)或多個(gè)實(shí)施例的全面理解,闡述了許多具體細(xì)節(jié)。然而,很明顯,也可以在沒(méi)有這些具體細(xì)節(jié)的情況下實(shí)現(xiàn)這些實(shí)施例。以下將結(jié)合附圖對(duì)本發(fā)明的具體實(shí)施例進(jìn)行詳細(xì)描述。
以下將結(jié)合附圖對(duì)本發(fā)明的具體實(shí)施例進(jìn)行詳細(xì)描述。
圖1是本發(fā)明數(shù)據(jù)庫(kù)訪問(wèn)系統(tǒng)第一實(shí)施例的構(gòu)成示意圖,如圖1所示,所述數(shù)據(jù)庫(kù)訪問(wèn)系統(tǒng)1000包括業(yè)務(wù)層100、邏輯層200和數(shù)據(jù)層300,其中:
業(yè)務(wù)層100,包括接口模塊110,所述接口模塊110包括一個(gè)以上的接口111,每一個(gè)接口111采用注解方式定義有類SQL語(yǔ)句和接口方法,例如,接口A
上述接口A中采用注解(@SQL)方式定義類SQL語(yǔ)句和接口方法(select方法);
邏輯層200,位于業(yè)務(wù)層100和數(shù)據(jù)層300之間,邏輯層200接收數(shù)據(jù)庫(kù)操作請(qǐng)求數(shù)據(jù),根據(jù)所述數(shù)據(jù)庫(kù)操作請(qǐng)求數(shù)據(jù)觸發(fā)業(yè)務(wù)層100的接口模塊110中相應(yīng)的接口111,對(duì)所述接口111內(nèi)的類SQL語(yǔ)句進(jìn)行解析,實(shí)現(xiàn)所述接口111的接口方法的處理邏輯;
數(shù)據(jù)層300,執(zhí)行所述邏輯層200的處理邏輯,獲得返回值并反饋給所述邏輯層200。
利用上述數(shù)據(jù)庫(kù)訪問(wèn)系統(tǒng)100對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn)的方法包括:
在業(yè)務(wù)層100的接口模塊110內(nèi)設(shè)置有一個(gè)以上的接口111,其中,所述接口采用注解方式定義有類SQL語(yǔ)句和接口方法;
通過(guò)邏輯層200接收數(shù)據(jù)庫(kù)操作請(qǐng)求數(shù)據(jù),根據(jù)所述數(shù)據(jù)庫(kù)操作請(qǐng)求數(shù)據(jù)觸發(fā)業(yè)務(wù)層100中相應(yīng)的接口111,對(duì)所述接口111內(nèi)的類SQL語(yǔ)句進(jìn)行解析,生成實(shí)現(xiàn)所述接口方法的處理邏輯;
在數(shù)據(jù)層300執(zhí)行所述邏輯層200的處理邏輯,獲得返回值并反饋給所述邏輯層200,實(shí)現(xiàn)所述接口方法。
在本實(shí)施方式中,數(shù)據(jù)庫(kù)訪問(wèn)系統(tǒng)1000將業(yè)務(wù)封裝到類SQL語(yǔ)句中,并結(jié)合接口的方式構(gòu)建了數(shù)據(jù)庫(kù)訪問(wèn)業(yè)務(wù)通用的邏輯框架,因此,開(kāi)發(fā)者在開(kāi)發(fā)過(guò)程中能夠利用類SQL語(yǔ)句實(shí)現(xiàn)所關(guān)注的業(yè)務(wù)本身,而不需要了解底層機(jī)制,能夠大幅降低開(kāi)發(fā)難度,從而能夠大幅縮短開(kāi)發(fā)周期,并大幅消減開(kāi)發(fā)成本。
另外,由于類SQL語(yǔ)句定義在業(yè)務(wù)層的接口中,因此,能夠在業(yè)務(wù)層集中管理類SQL語(yǔ)句,能夠有效地降低維護(hù)成本,并能夠有效地提高排錯(cuò)效率。
再者,開(kāi)發(fā)者能夠直接在接口上查看類SQL語(yǔ)句,與在xml等配置文件中查看的方法相比,不需要切換視圖,既能夠解決配置文件過(guò)大、過(guò)多的問(wèn)題,又能夠提高開(kāi)發(fā)效率。
上述數(shù)據(jù)庫(kù)訪問(wèn)系統(tǒng)1000實(shí)際業(yè)務(wù)開(kāi)發(fā)時(shí),SQL語(yǔ)句已經(jīng)能表達(dá)絕大部分的業(yè)務(wù)需要,以一個(gè)簡(jiǎn)單的SQL語(yǔ)句來(lái)復(fù)用各種邏輯處理,比如訪問(wèn)數(shù)據(jù)庫(kù),過(guò)濾規(guī)則,參數(shù)傳遞,生成對(duì)象則對(duì)于業(yè)務(wù)來(lái)說(shuō)其一保證了底層的一致,其二極大復(fù)用了以前需要重復(fù)實(shí)現(xiàn)或依賴特定編程模式實(shí)現(xiàn)的程序段。
圖1示出了本發(fā)明數(shù)據(jù)庫(kù)訪問(wèn)系統(tǒng)的業(yè)務(wù)層的一個(gè)實(shí)施例,如圖1所示,所述業(yè)務(wù)層100包括接口模塊110和會(huì)話管理模塊120,
其中,所述會(huì)話管理模塊120,用于管理業(yè)務(wù)層100與其他層之間的會(huì)話;
其中,所述接口模塊110的接口111可以采用注解的方式定義有執(zhí)行查詢、更新、刪除、插入等的類SQL語(yǔ)句,所述類SQL語(yǔ)句設(shè)置有sql和sqlType兩個(gè)參數(shù),其中,
sql參數(shù)用于定義待解析類SQL語(yǔ)句,如接口A的例子中,sql參數(shù)定義的待解析類SQL語(yǔ)句中包含兩個(gè)待替換變量“#{semester}”和“#{year}”,即,以“#{待替換變量名}”的方式設(shè)置一個(gè)以上的待替換變量,該待替換變量將在解析處理中被替換為類SQL輸入?yún)?shù)中的相應(yīng)的實(shí)際值,優(yōu)選地,所述替換變量的類型還包括參數(shù)的位置,此外,對(duì)于待替換變量,還可以以“#{待替換變量名@參數(shù)位置}”的形式指定獲取實(shí)際值的參數(shù)位置,例如,可以以指定為“#{semester@1}”,當(dāng)bean中的成員變量semester為參數(shù)列表(例如List、String數(shù)組等)時(shí),能夠指定將該待替換變量“#{semester@1}”替換為成員變量semester的參數(shù)列表中的第一個(gè)參數(shù),能夠在類SQL語(yǔ)句的paramType參數(shù)中使用具有參數(shù)列表形式的成員變量的bean,從而提高易用性,有助于功能的擴(kuò)展,另外,所述類SQL語(yǔ)句中,可以采用注解來(lái)指定sql選擇的列項(xiàng)映射到j(luò)avabean的成員變量或者全部變量,也可以采用設(shè)定別名(例如as)的方式實(shí)現(xiàn)sql到返回值javabean的變量的映射,如接口A的例子中,使用“as”關(guān)鍵字對(duì)“ID”字段指定了別名“id”,對(duì)“Year”字段指定了別名“year”,對(duì)“Semester”字段指定了別名“semester”,對(duì)“Status”指定了別名“status”;
sqlType參數(shù)用于定義待解析SQL語(yǔ)句的CRUD操作類型,例如,對(duì)應(yīng)插入操作的SQLTYPE.INSERT類型、對(duì)應(yīng)查詢操作的SQLTYPE.SELECT類型、對(duì)應(yīng)更新操作的SQLTYPE.UPDATE類型以及對(duì)應(yīng)刪除操作的SQLTYPE.DELETE類型。
優(yōu)選地,接口111的所述類SQL語(yǔ)句還設(shè)置有resultType和paramType參數(shù)中的一個(gè)或兩個(gè),其中,
resultType參數(shù)用于定義SQL執(zhí)行返回值的類型,所述SQL執(zhí)行返回值的類型既可以是開(kāi)發(fā)者自定義的bean類型(如接口A中的“com.cuc.beans.LabManageBatcher”),也可以是String、List等Java標(biāo)準(zhǔn)API提供的類型;
paramType參數(shù)用于定義SQL輸入?yún)?shù)的類型,所述SQL輸入?yún)?shù)的類型既可以是開(kāi)發(fā)者自定義的bean類型(如接口A的例子中的“com.cuc.beans.LabManageBatcher”),也可以是String、List等Java標(biāo)準(zhǔn)API提供的類型,例如,接口B是采用注解方式定義有類SQL語(yǔ)句執(zhí)行更新操作的接口111,如下所示:
在上述接口B中包括采用注解方式定義的類SQL語(yǔ)句和接口方法(update),sql參數(shù)定義的待解析SQL語(yǔ)句中包含四個(gè)待替換變量“#{status}”、“#{id}”、“#{semester}”和“#{year}”,sqlType參數(shù)定義的待解析SQL語(yǔ)句的CRUD操作類型為對(duì)應(yīng)更新操作的SQLTYPE.UPDATE。
“com.cuc.beans.LabManageBatcher”,paramType參數(shù)定義的SQL輸入?yún)?shù)的類型為開(kāi)發(fā)者自定義的bean類型“com.cuc.beans.LabManageBatcher”,在該類SQL語(yǔ)句中并沒(méi)有設(shè)置resultType參數(shù)。
圖1還示出了是本發(fā)明數(shù)據(jù)庫(kù)訪問(wèn)系統(tǒng)的邏輯層一個(gè)實(shí)施例,如圖1所示,所述邏輯層200包括:
接收模塊210,接收例如查詢、刪除、更新、插入等的數(shù)據(jù)庫(kù)操作請(qǐng)求數(shù)據(jù)。進(jìn)一步,接收模塊210可以將數(shù)據(jù)庫(kù)操作請(qǐng)求數(shù)據(jù)保存在規(guī)定的bean中。例如,接口A的例子中,接收模塊210可以將數(shù)據(jù)庫(kù)操作請(qǐng)求數(shù)據(jù)保存在與數(shù)據(jù)表“l(fā)abmanagebatcher”對(duì)應(yīng)的開(kāi)發(fā)者自定義的“com.cuc.beans.LabManageBatcher”類型的bean中;
調(diào)用模塊220,根據(jù)接收模塊210接收的數(shù)據(jù)庫(kù)操作請(qǐng)求數(shù)據(jù),調(diào)用業(yè)務(wù)層100相應(yīng)的接口111,從而觸發(fā)用于實(shí)現(xiàn)所述接口111的接口方法的操作,優(yōu)選地,所述調(diào)用模塊220采用調(diào)用方式通過(guò)映射表觸發(fā)相應(yīng)的接口111,例如,
DefaultQuery query=new DefaultQuery();
SelectRecord test=(A)query.getMapper(A.class);
test.select(batcher);
當(dāng)調(diào)用getMapper方法時(shí),將會(huì)觸發(fā)實(shí)現(xiàn)上述接口A的接口方法select的操作,例如添加一個(gè)數(shù)據(jù)層的相關(guān)類的操作,比如打開(kāi)數(shù)據(jù)庫(kù)連接,打開(kāi)Session,打開(kāi)事務(wù)等。實(shí)現(xiàn)所述接口方法的操作可以是預(yù)先設(shè)定的默認(rèn)的操作,也可以是開(kāi)發(fā)者根據(jù)業(yè)務(wù)需求具體開(kāi)發(fā)的操作,對(duì)此并不作任何特別限定;
解析模塊230,根據(jù)所述數(shù)據(jù)庫(kù)操作請(qǐng)求數(shù)據(jù),將所述接口111的類SQL語(yǔ)句解析成標(biāo)準(zhǔn)SQL語(yǔ)句,實(shí)現(xiàn)業(yè)務(wù)層100所述接口方法的處理邏輯,例如,對(duì)接口A的解析,當(dāng)解析#{semester}這個(gè)時(shí),將會(huì)解析成對(duì)方法參數(shù)的解析,也就是對(duì)參數(shù)LabManageBatche中的semester字段進(jìn)行獲取值。
下面,舉例說(shuō)明邏輯層200的具體處理。
例如,在接收模塊210接收到的數(shù)據(jù)庫(kù)操作請(qǐng)求數(shù)據(jù)是對(duì)數(shù)據(jù)表“l(fā)abmanagebatcher”進(jìn)行查詢操作的請(qǐng)求,并且在該數(shù)據(jù)庫(kù)操作請(qǐng)求數(shù)據(jù)中包含查詢條件“Semester:1,Year:2016”。在這種情況下,接收模塊210可以將請(qǐng)求數(shù)據(jù)中的查詢條件保存在與數(shù)據(jù)表“l(fā)abmanagebatcher”對(duì)應(yīng)的開(kāi)發(fā)者自定義的“com.cuc.beans.LabManageBatcher”類型的bean中,假設(shè)該bean的變量名為“batcher”。在“com.cuc.beans.LabManageBatcher”類型的bean中,定義有用于保存“ID”信息的成員變量“id”,用于保存“Year”信息的成員變量“year”,用于保存“Semester”信息的成員變量“semester”以及用于保存“Status”信息的成員變量“status”。由接收模塊210接收到的查詢條件中的“Semester”和“Year”信息被分別保存在成員變量“semester”和“year”中,即,在變量名為“batcher”的bean中,成員變量“semester”的變量值被設(shè)定為“1”,成員變量“year”的變量值被設(shè)定為“2016”。
接下來(lái),調(diào)用模塊220根據(jù)數(shù)據(jù)庫(kù)操作請(qǐng)求數(shù)據(jù)(例如操作對(duì)象的數(shù)據(jù)表名稱或者操作對(duì)象的業(yè)務(wù)識(shí)別編碼等),調(diào)用相應(yīng)的接口111,在此,假設(shè)調(diào)用上述接口A,從而觸發(fā)預(yù)先設(shè)定的默認(rèn)的操作或者開(kāi)發(fā)者自定義的用于實(shí)現(xiàn)該接口A的接口方法select()的操作。
解析模塊230根據(jù)數(shù)據(jù)庫(kù)操作請(qǐng)求數(shù)據(jù),將上述接口SelectRecord中的類SQL語(yǔ)句解析成標(biāo)準(zhǔn)SQL語(yǔ)句。例如,在上述接口SelectRecord的類SQL語(yǔ)句中,sql參數(shù)中包含待替換變量“#{semester}”和“#{year}”,在這種情況下,解析模塊230根據(jù)保存在上述變量名為“batcher”的bean中的相應(yīng)的成員變量的變量值,將待替換變量替換為實(shí)際值,即,將“#{semester}”替換為成員變量“semester”的變量值“1”,并將“#{year}”替換為成員變量“year”的變量值“2016”。
由此,上述接口SelectRecord中的類SQL語(yǔ)句被解析為標(biāo)準(zhǔn)SQL語(yǔ)句:select ID as id,Year as year,Semester as semester,Status as status from labmanagebatcher where Semester='1'and Year='2016'。
在此,使用別名的目的在于,在該標(biāo)準(zhǔn)SQL語(yǔ)句的執(zhí)行結(jié)果中,字段名稱“ID”、“Year”、“Semester”和“Status”以別名的形式返回,即返回字段“id”、“year”、“semester”和“status”,由此,使SQL執(zhí)行結(jié)果中的字段名稱與resultType參數(shù)中指明的作為返回值的類型的“com.cuc.beans.LabManageBatcher”類型中的各個(gè)成員變量名稱相對(duì)應(yīng),從而能夠使用公知的賦值方法將SQL執(zhí)行結(jié)果順利地賦予到“com.cuc.beans.LabManageBatcher”類型的bean中。
圖1還示出了本發(fā)明數(shù)據(jù)庫(kù)訪問(wèn)系統(tǒng)的數(shù)據(jù)層一個(gè)實(shí)施例,如圖3所示,所述數(shù)據(jù)層300包括:
數(shù)據(jù)庫(kù)310;
操作接口320,在數(shù)據(jù)庫(kù)中存儲(chǔ)或者獲得數(shù)據(jù)的接口,提供可變粒度的數(shù)據(jù)庫(kù)操作接口;
數(shù)據(jù)庫(kù)會(huì)話管理模塊330,用于完成數(shù)據(jù)庫(kù)操作過(guò)程中的會(huì)話管理;
事務(wù)處理模塊340,用于執(zhí)行數(shù)據(jù)庫(kù)事務(wù);
回滾處理模塊350,用于執(zhí)行數(shù)據(jù)庫(kù)操作的回滾;
基本操作模塊360,用于執(zhí)行普通的數(shù)據(jù)庫(kù)增、刪、改、查操作。
優(yōu)選地,在數(shù)據(jù)層300中還包括映射模塊370,該映射模塊370用于實(shí)現(xiàn)數(shù)據(jù)庫(kù)310與bean對(duì)象的映射,使用類SQL語(yǔ)句將數(shù)據(jù)庫(kù)310中的數(shù)據(jù)表與指定的bean對(duì)象關(guān)聯(lián)起來(lái),從而實(shí)現(xiàn)數(shù)據(jù)表中字段與bean中的成員變量之間的自動(dòng)映射。
圖2是本發(fā)明所述數(shù)據(jù)庫(kù)訪問(wèn)系統(tǒng)的第二實(shí)施例的示意圖,如圖2所示,在此實(shí)施方式中,業(yè)務(wù)層100還包括注冊(cè)模塊130,所述注冊(cè)模塊130,注冊(cè)有一個(gè)以上的自定義數(shù)據(jù)處理函數(shù),包括一個(gè)以上的自定義數(shù)據(jù)處理類和自定義數(shù)據(jù)處理函數(shù)配置文件,其中,
所述自定義數(shù)據(jù)處理函數(shù)具有的一個(gè)以上的待處理參數(shù);
所述自定義數(shù)據(jù)處理類用于實(shí)現(xiàn)自定義數(shù)據(jù)處理函數(shù)的具體處理邏輯,例如,當(dāng)用戶想要自定義實(shí)現(xiàn)正則過(guò)濾功能的自定義數(shù)據(jù)處理函數(shù)filterReg時(shí),可以自定義一個(gè)自定義數(shù)據(jù)處理類FilterReg,并在該FilterReg類中描述實(shí)現(xiàn)正則過(guò)濾功能的具體處理邏輯,即通過(guò)自定義數(shù)據(jù)處理類FilterReg實(shí)現(xiàn)自定義數(shù)據(jù)處理函數(shù)filterReg的具體處理邏輯。
所述自定義數(shù)據(jù)處理函數(shù)配置文件用于描述自定義數(shù)據(jù)處理函數(shù)與自定義數(shù)據(jù)處理類之間的映射關(guān)系,在自定義數(shù)據(jù)處理函數(shù)配置文件中,可以采用“自定義數(shù)據(jù)處理函數(shù)名=自定義數(shù)據(jù)處理類名.class”的形式定義一個(gè)以上的映射關(guān)系,例如,在自定義數(shù)據(jù)處理函數(shù)配置文件中定義有“filterReg=FilterReg.class”,使自定義數(shù)據(jù)處理函數(shù)filterReg與用于實(shí)現(xiàn)該函數(shù)的具體邏輯處理的自定義數(shù)據(jù)處理類FilterReg相互對(duì)應(yīng)。
優(yōu)選地,為了使處理邏輯共通化,可以使自定義數(shù)據(jù)處理類均繼承自規(guī)定的基礎(chǔ)類,并在規(guī)定的基礎(chǔ)類中實(shí)現(xiàn)各種共通處理邏輯,從而能夠減少重復(fù)開(kāi)發(fā),能夠提高維護(hù)的效率。
在類SQL語(yǔ)句的sql參數(shù)中,可以進(jìn)一步使用在注冊(cè)模塊120中注冊(cè)的自定義數(shù)據(jù)處理函數(shù),例如,為了對(duì)特定字段的查詢結(jié)果數(shù)據(jù)進(jìn)行正則過(guò)濾,可以在類SQL語(yǔ)句中使用自定義數(shù)據(jù)處理函數(shù)filterReg,所述類SQL語(yǔ)句如下:
@SQL(sql="select filterReg(ID,'[0-9A-Z]')as id,Year as year,Semester as semester,Status as status from labmanagebatcher where Semester='#{semester}'and Year='#{year}'",sqlType=SQLTYPE.SELECT,resultType="com.cuc.beans.LabManageBatcher",paramType="com.cuc.beans.LabManageBatcher")。
在上述例子中,字段“ID”的字段值將作為“待處理參數(shù)”被傳遞給自定義數(shù)據(jù)處理函數(shù)filterReg,通過(guò)自定義數(shù)據(jù)處理類FilterReg對(duì)字段“ID”的字段值進(jìn)行開(kāi)發(fā)者自定義的數(shù)據(jù)處理。
在第二實(shí)施方式中,邏輯層200還包括判斷模塊240,判斷調(diào)用模塊220調(diào)用的接口111的類SQL語(yǔ)句中是否存在自定義數(shù)據(jù)處理函數(shù),當(dāng)存在自定義數(shù)據(jù)處理函數(shù)時(shí),發(fā)送不翻譯自定義數(shù)據(jù)處理函數(shù)的指令給解析單元230,并將所述自定義數(shù)據(jù)處理函數(shù)的名稱和位置發(fā)送給數(shù)據(jù)層;當(dāng)不存在自定義數(shù)據(jù)處理函數(shù)時(shí),發(fā)送解析類SQL語(yǔ)句的指令給解析單元230。
此時(shí),解析模塊230根據(jù)判斷模塊240的指令對(duì)所述類SQL語(yǔ)句進(jìn)行解析,具體而言,當(dāng)解析模塊230從判斷模塊接收到不翻譯自定義數(shù)據(jù)處理函數(shù)的指令時(shí),對(duì)除自定義數(shù)據(jù)處理函數(shù)以外的類SQL語(yǔ)句進(jìn)行解析;當(dāng)判斷模塊240判斷為在待解析SQL語(yǔ)句中不存在自定義數(shù)據(jù)處理函數(shù)時(shí),解析模塊230執(zhí)行與上述第一實(shí)施方式相同的處理。
例如,對(duì)于上述存在有自定義數(shù)據(jù)處理函數(shù)filterReg的待解析SQL語(yǔ)句,解析模塊230將其解析為標(biāo)準(zhǔn)SQL:select ID as id,Year as year,Semester as semester,Status as status from labmanagebatcher where Semester='1'and Year='2016'。在第二實(shí)施方式中,對(duì)待解析SQL語(yǔ)句中的待替換變量進(jìn)行替換的方法與上述第一實(shí)施方式相同。
在第二實(shí)施方式中,與上述第一實(shí)施方式同樣地,數(shù)據(jù)層300執(zhí)行邏輯層200解析后的標(biāo)準(zhǔn)SQL語(yǔ)句并獲取該標(biāo)準(zhǔn)SQL語(yǔ)句執(zhí)行的返回值之后,根據(jù)判斷模塊240的判斷結(jié)果,對(duì)標(biāo)準(zhǔn)SQL語(yǔ)句執(zhí)行的返回值執(zhí)行自定義數(shù)據(jù)處理。即,當(dāng)數(shù)據(jù)層300接收到所述自定義數(shù)據(jù)處理函數(shù)的名稱和位置時(shí),數(shù)據(jù)層300根據(jù)注冊(cè)模塊120中的自定義數(shù)據(jù)處理函數(shù)配置文件,查找與該自定義數(shù)據(jù)處理函數(shù)對(duì)應(yīng)的自定義數(shù)據(jù)處理類,并將標(biāo)準(zhǔn)SQL語(yǔ)句執(zhí)行的返回值中的作為自定義數(shù)據(jù)處理函數(shù)的待處理參數(shù)的字段值傳遞給該自定義數(shù)據(jù)處理類,并且用該自定義數(shù)據(jù)處理類的返回值替換該標(biāo)準(zhǔn)SQL語(yǔ)句執(zhí)行的返回值中的作為自定義數(shù)據(jù)處理函數(shù)的待處理參數(shù)的字段值;當(dāng)數(shù)據(jù)層300沒(méi)有接收到所述自定義數(shù)據(jù)處理函數(shù)的名稱和位置時(shí),數(shù)據(jù)層300執(zhí)行與上述第一實(shí)施方式同樣的處理。
在上述的例子中,數(shù)據(jù)層300將字段“ID”的字段值作為自定義數(shù)據(jù)處理函數(shù)filterReg的待處理參數(shù)傳遞給與自定義數(shù)據(jù)處理函數(shù)filterReg對(duì)應(yīng)的自定義數(shù)據(jù)處理類FilterReg,并用自定義數(shù)據(jù)處理類FilterReg的返回值替換字段“ID”的字段值,進(jìn)而作為別名“id”的值返回給邏輯層200。
根據(jù)第二實(shí)施方式,開(kāi)發(fā)者能夠根據(jù)業(yè)務(wù)需求開(kāi)發(fā)并注冊(cè)自定義數(shù)據(jù)處理函數(shù),能夠以標(biāo)準(zhǔn)SQL函數(shù)的方式在待解析SQL語(yǔ)句中描述想要進(jìn)行的數(shù)據(jù)處理,能夠封裝自定義數(shù)據(jù)處理函數(shù),從而有效地提高開(kāi)發(fā)效率和維護(hù)效率。
在本發(fā)明的一個(gè)優(yōu)選實(shí)施例中,注冊(cè)模塊130還注冊(cè)返回值對(duì)象,對(duì)接口111的接口方法中的返回值進(jìn)行處理,數(shù)據(jù)返回時(shí),根據(jù)返回值類型來(lái)處理數(shù)據(jù),例如,根據(jù)返回值對(duì)象進(jìn)行分頁(yè):
@SQL(sqlType=SQLTYPE.SELECT,sql="select ID as id,StudentClass as studentClass,TeacherID as teacherID,StudyTime as studyTime,Type as type,BatcherID as batcherID,LabID as labID FROM Course",resultType="com.cuc.beans.Course")
PageResult<Course>getAll()。
上述例子中,分頁(yè)根據(jù)返回值的類型決定的,例如PageResult返回值,通過(guò)PageResult返回值來(lái)自動(dòng)進(jìn)行實(shí)現(xiàn)分頁(yè)的業(yè)務(wù)邏輯,不再需要開(kāi)發(fā)者自己實(shí)現(xiàn),其中,分頁(yè)查詢?cè)诘玫接脩舻恼?qǐng)求后,會(huì)根據(jù)配置信息也就是返回值PageResult決定是否進(jìn)行分頁(yè),并返回一個(gè)課程的列表對(duì)象在頁(yè)面進(jìn)行數(shù)據(jù)迭代以及分頁(yè)信息獲取,使得開(kāi)發(fā)無(wú)需關(guān)心是如何實(shí)現(xiàn)的,只要做相關(guān)配置即可。
通過(guò)注冊(cè)模塊130注冊(cè)的返回值對(duì)象將已經(jīng)處理好的從SQL里返回的數(shù)據(jù)映射成另外一種類型,使用者可以進(jìn)行多種數(shù)據(jù)映射開(kāi)發(fā)。實(shí)施時(shí),會(huì)判斷接口方法是否具有注冊(cè)對(duì)象,如果具有注冊(cè)對(duì)象,則進(jìn)行相應(yīng)處理,如分頁(yè),過(guò)濾等。
綜上所述,參照附圖以示例的方式描述了根據(jù)本發(fā)明提出的數(shù)據(jù)庫(kù)訪問(wèn)系統(tǒng)及其訪問(wèn)方法。但是,本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,對(duì)于上述本發(fā)明所提出的系統(tǒng)及方法,還可以在不脫離本發(fā)明內(nèi)容的基礎(chǔ)上做出各種改進(jìn)。因此,本發(fā)明的保護(hù)范圍應(yīng)當(dāng)由所附的權(quán)利要求書(shū)的內(nèi)容確定。