專利名稱:一種對(duì)數(shù)據(jù)庫進(jìn)行訪問的方法和裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)庫技術(shù),特別涉及一種對(duì)數(shù)據(jù)庫進(jìn)行訪問的方法和裝置。
背景技術(shù):
對(duì)數(shù)據(jù)庫的訪問通常采用執(zhí)行結(jié)構(gòu)化查詢語言(SQL,Structured QueryLanguage)語句的方式,在此過程中系統(tǒng)將查詢參數(shù)拼裝在SQL語句中,然后執(zhí)行該 SQL語句。通常系統(tǒng)往往要支持多種數(shù)據(jù)庫,例如SQL Server與Oracle數(shù)據(jù)庫等,在實(shí)現(xiàn)相同功能時(shí),不同類型的數(shù)據(jù)庫常常會(huì)用到不同的SQL語句。由于現(xiàn)有技術(shù)中,SQL語句是編寫在代碼中的,因此在實(shí)現(xiàn)對(duì)不同類型數(shù)據(jù)庫某一相同功能的訪問時(shí),需要在調(diào)用方對(duì)數(shù)據(jù)庫類型進(jìn)行區(qū)分,也就是說,針對(duì)同一功能需要在方法上對(duì)不同數(shù)據(jù)庫類型進(jìn)行區(qū)分,調(diào)用方根據(jù)不同的數(shù)據(jù)庫類型調(diào)用不同的SQL語句。例如,要對(duì)SQL krver與Oracle數(shù)據(jù)庫兩種數(shù)據(jù)庫進(jìn)行查詢前N個(gè)數(shù)據(jù)的訪問, 那么在進(jìn)行SQL語句編寫時(shí),需要在代碼中對(duì)這兩種數(shù)據(jù)庫進(jìn)行方法上的區(qū)分。假設(shè)SQL Server 對(duì)應(yīng)的方法為 Queryl,相應(yīng)的 SQL i吾句為 select top N employee_id from tbl_ employee order by salary desc ;0racle數(shù)據(jù)庫對(duì)應(yīng)的方法為Query2,才畫應(yīng)的SQLi吾句為 select employee_id fromtbl_employee where rownum< = N order by salary desc。在對(duì)SQL Server進(jìn)行查詢前N個(gè)數(shù)據(jù)的訪問時(shí),在調(diào)用方需要調(diào)用方法Queryl,在對(duì)Oracle 數(shù)據(jù)庫進(jìn)行查詢前N個(gè)數(shù)據(jù)的訪問時(shí),在調(diào)用方需要調(diào)用方法QUery2。然后選擇對(duì)應(yīng)的SQL 語句,根據(jù)用戶輸入的訪問參數(shù)對(duì)SQL語句中的變量N進(jìn)行賦值后,執(zhí)行SQL語句。例如需要查詢前10個(gè)數(shù)據(jù)時(shí),將N賦值為10??梢钥闯?,現(xiàn)有技術(shù)中對(duì)數(shù)據(jù)庫的訪問,需要在調(diào)用方實(shí)現(xiàn)各數(shù)據(jù)庫類型的差異, 針對(duì)同一功能的訪問,需要在方法上對(duì)不同數(shù)據(jù)庫類型進(jìn)行區(qū)分,從而提高了調(diào)用方操作的復(fù)雜度,當(dāng)系統(tǒng)中的數(shù)據(jù)庫類型較多時(shí),缺點(diǎn)更加明顯。
發(fā)明內(nèi)容
有鑒于此,本發(fā)明提供了一種對(duì)數(shù)據(jù)庫進(jìn)行訪問的方法和裝置,以便于在調(diào)用方屏蔽數(shù)據(jù)庫類型的差異,降低調(diào)用方操作的復(fù)雜度?!N對(duì)數(shù)據(jù)庫進(jìn)行訪問的方法,應(yīng)用于包含多種類型數(shù)據(jù)庫模板的數(shù)據(jù)庫訪問裝置,每種類型的數(shù)據(jù)庫模板中包含該類型數(shù)據(jù)庫的SQL語句以及SQL語句對(duì)應(yīng)的功能標(biāo)識(shí), 所述數(shù)據(jù)庫模板中具有相同功能的SQL語句對(duì)應(yīng)相同的功能標(biāo)識(shí);該方法包括A、數(shù)據(jù)庫訪問裝置啟動(dòng)后,加載所有模板;B、接收到調(diào)用指令后,確定當(dāng)前連接的數(shù)據(jù)庫類型對(duì)應(yīng)的所有SQL語句構(gòu)成的結(jié)果集;C、在所述結(jié)果集中查詢所述調(diào)用指令包含的功能標(biāo)識(shí)對(duì)應(yīng)的SQL語句,執(zhí)行該 SQL語句以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的訪問。
一種對(duì)數(shù)據(jù)庫進(jìn)行訪問的裝置,該裝置包括SQL模板單元、模板控制單元和SQL 執(zhí)行單元;所述SQL模板單元,用于存儲(chǔ)多種類型的數(shù)據(jù)庫模板,每種類型的數(shù)據(jù)庫模板中包含該類型數(shù)據(jù)庫的SQL語句以及SQL語句對(duì)應(yīng)的功能標(biāo)識(shí),所述數(shù)據(jù)庫模板中具有相同功能的SQL語句對(duì)應(yīng)相同的功能標(biāo)識(shí);所述模板控制單元,用于在所述裝置啟動(dòng)后,加載所有模板;所述SQL執(zhí)行單元,用于接收到調(diào)用指令后,確定當(dāng)前連接的數(shù)據(jù)庫類型對(duì)應(yīng)的所有SQL語句構(gòu)成的結(jié)果集,在所述結(jié)果集中查詢所述調(diào)用指令包含的功能標(biāo)識(shí)對(duì)應(yīng)的 SQL語句,執(zhí)行該SQL語句以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的訪問。由以上技術(shù)方案可以看出,本發(fā)明通過模板的形式保存各數(shù)據(jù)庫的SQL語言及其對(duì)應(yīng)功能標(biāo)識(shí),各數(shù)據(jù)庫模板中具有相同功能的SQL語句對(duì)應(yīng)相同的功能標(biāo)識(shí),使得在調(diào)用方進(jìn)行功能調(diào)用時(shí),無需對(duì)數(shù)據(jù)庫類型進(jìn)行調(diào)用,僅需要通過調(diào)用指令發(fā)送要訪問的操作對(duì)應(yīng)的功能標(biāo)識(shí),數(shù)據(jù)庫訪問裝置便能夠從當(dāng)前連接的數(shù)據(jù)庫類型對(duì)應(yīng)的所有SQL語句構(gòu)成的結(jié)果集中,查詢出該功能標(biāo)識(shí)對(duì)應(yīng)的SQL語句,并執(zhí)行該SQL語句以實(shí)現(xiàn)數(shù)據(jù)庫的訪問??梢钥闯觯景l(fā)明能夠在調(diào)用方屏蔽數(shù)據(jù)庫的類型差異,降低調(diào)用方操作的復(fù)雜度。
圖1為本發(fā)明提供的主要方法流程圖;圖2為本發(fā)明實(shí)施例提供的執(zhí)行層次示意圖;圖3為本發(fā)明提供的裝置結(jié)構(gòu)圖。
具體實(shí)施例方式為了使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面結(jié)合附圖和具體實(shí)施例對(duì)本發(fā)明進(jìn)行詳細(xì)描述。本發(fā)明提供的主要方法可以如圖1所示,主要包括以下步驟步驟101 預(yù)先定義各類型數(shù)據(jù)庫模板,每個(gè)數(shù)據(jù)庫模板中包含該類型數(shù)據(jù)庫的 SQL語句以及SQL語句對(duì)應(yīng)的功能標(biāo)識(shí);其中,數(shù)據(jù)庫模板中具有相同功能的SQL語句對(duì)應(yīng)相同的功能標(biāo)識(shí)。步驟102 訪問數(shù)據(jù)庫的裝置啟動(dòng)后,加載所有模板。步驟103 接收到調(diào)用指令后,確定當(dāng)前連接的數(shù)據(jù)庫類型對(duì)應(yīng)的所有SQL語句構(gòu)成的結(jié)果集。步驟104 在步驟103確定的結(jié)果集中,查詢調(diào)用指令包含的功能標(biāo)識(shí)對(duì)應(yīng)的SQL 語句,執(zhí)行該SQL語句以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的訪問。下面結(jié)合具體實(shí)施例對(duì)本發(fā)明所提供的上述方法進(jìn)行詳細(xì)描述。圖2為本發(fā)明所提供方法的執(zhí)行層次示意圖,主要分為SQL模板層、模板控制中間層和SQL執(zhí)行層。對(duì)應(yīng)執(zhí)行流程可以具體包括以下步驟步驟201 預(yù)先定義各類型數(shù)據(jù)庫模板,每個(gè)數(shù)據(jù)庫模板中包含該類型數(shù)據(jù)庫的 SQL語句以及SQL語句對(duì)應(yīng)的功能標(biāo)識(shí)。在該實(shí)施例中,模板中SQL語句及其標(biāo)識(shí)的定義狀況可以包括以下幾種形式
第一種形式僅存在數(shù)據(jù)庫模板,各數(shù)據(jù)庫模板中包含對(duì)應(yīng)類型數(shù)據(jù)庫的SQL語句以及SQL語句對(duì)應(yīng)的功能標(biāo)識(shí)。假設(shè)存在SQL Server數(shù)據(jù)庫、Oracle數(shù)據(jù)庫和MySQL數(shù)據(jù)庫等,則可以根據(jù)數(shù)據(jù)庫類型,分別預(yù)先定義SQL krver模板、Orac Ie模板和My SQL模板等。其中,SQL Server 模板中存儲(chǔ)SQL Server數(shù)據(jù)庫的SQL語句,Oracle模板中存儲(chǔ)Oracle數(shù)據(jù)庫的SQL語句, MySQL模板存儲(chǔ)MySQL數(shù)據(jù)庫的SQL語句。各數(shù)據(jù)庫模板中的各SQL語句都存在與其對(duì)應(yīng)的功能標(biāo)識(shí),在各類型的數(shù)據(jù)庫模板中相同功能的SQL語句對(duì)應(yīng)相同的功能標(biāo)識(shí),每個(gè)功能標(biāo)識(shí)在一個(gè)數(shù)據(jù)庫模板中是唯一的。例如,在 SQL Server 模板中定義 query, subsqll =“select top N employee_id from tbl_employee order by salary desc,,;在 Oracle 模板中定義 query, subsqll = "select employee_id from tbl_employee whererownum < = N order by salary desc,,,由于這兩個(gè)SQL語句都對(duì)應(yīng)查詢前N個(gè)數(shù)據(jù)的功能,因此,對(duì)應(yīng)相同的功能標(biāo)識(shí)query, subsqll。需要說明的是,在各模板中可以采用擴(kuò)展標(biāo)記語言(XML)文件的形式來進(jìn)行定義,也可以采用“ID = SQL語句”的形式進(jìn)行定義,本發(fā)明中以ID = SQL語句”的形式為例。第二種形式由于在某些情況下可能存在多種類型的數(shù)據(jù)庫對(duì)應(yīng)同一功能的SQL 語句是相同的,為了對(duì)這種情況下的SQL語句進(jìn)行復(fù)用,除了設(shè)置各類型數(shù)據(jù)庫模板之外, 還可以設(shè)置通用語句模板。通用語句模板中存儲(chǔ)多種類型數(shù)據(jù)庫的相同SQL語句以及SQL 語句對(duì)應(yīng)的功能標(biāo)識(shí),如圖2中SQL模板層所示。例如,如果某個(gè)SQL語句對(duì)于SQL Server數(shù)據(jù)庫、Oracle數(shù)據(jù)庫和MvSQL數(shù)據(jù)庫都相同,則可以不在各類型的數(shù)據(jù)庫模板中定義,僅在通用語句模板中定義即可。第三種形式為了最大限度地對(duì)各類型數(shù)據(jù)庫的SQL語句進(jìn)行復(fù)用,在第二種形式的基礎(chǔ)上,可以在通用語句模板的SQL語句中對(duì)數(shù)據(jù)庫模板中的功能標(biāo)識(shí)進(jìn)行引用,被引用的功能標(biāo)識(shí)稱為模板變量。即功能標(biāo)識(shí)作為模板變量在數(shù)據(jù)庫模板中定義,在通用語句模板中被引用。例如,查詢數(shù)據(jù)庫中的前N個(gè)數(shù)據(jù),對(duì)應(yīng)于SQL krver數(shù)據(jù)庫和Oracle數(shù)據(jù)庫,必須采用特定的SQL語句,而其它數(shù)據(jù)庫則采用相同的SQL語句。這種情況下,可以首先在采用特定 SQLi吾句的 SQL Server 模板中定義 query, subsqll = “select top 10 employee, id from tbl_employee order by salarydesc,,。在 Oracle 模板中定義 query, subsqll = "select employee_id fromtbl_ employee where rownum < = 10 order by salary desc,,。為了最大限度地復(fù)用相同的SQL語句,則在通用語句模板中定義query, test = "select N from tbl_employee where employee_id not in,并使該語句弓| 用 query, subsqll,以表征query, test和query, subsqll完成相同功能。如果采用“$ {模板變量} ”的方式進(jìn)行模板變量的引用,則通用語句模板中可以表示為query, test = “select N from tbl_employee where employee_id notin($ {query, subsqll}),,。當(dāng)然,本發(fā)明對(duì)模板變量的具體引用形式并不限制,還可以采用其它引用形式。這種方式中,功能標(biāo)識(shí)query, test針對(duì)SQL krver數(shù)據(jù)庫對(duì)應(yīng)的SQL語句應(yīng)該為 select top 10 employee_id from tbl_employee order by salary desc,針對(duì)Oracle數(shù)據(jù)庫對(duì)應(yīng)的 SQL i吾句應(yīng)該為 select employee_id from tbl_employeewhere rownum < =IOorder by salary desc,針對(duì)其它數(shù)據(jù)庫對(duì)應(yīng)的 SQLi吾句為 select N from tbl_employee where employee_id not in。第四種形式由于在實(shí)際使用時(shí),系統(tǒng)可能會(huì)新增支持的數(shù)據(jù)庫類型,為了在增加數(shù)據(jù)庫類型的同時(shí),不對(duì)已有模板產(chǎn)生影響和修改,可以在上述引用規(guī)則的基礎(chǔ)上新增一種形式當(dāng)數(shù)據(jù)庫模板中的功能標(biāo)識(shí)和通用語句模板中的功能標(biāo)識(shí)相同,而對(duì)應(yīng)的SQL語句不同時(shí),優(yōu)先使用數(shù)據(jù)庫模板中該功能標(biāo)識(shí)對(duì)應(yīng)的SQL語句。例如,從數(shù)據(jù)庫中選擇特定名稱的數(shù)據(jù),原有的數(shù)據(jù)庫類型對(duì)應(yīng)的SQL語句均相同,則在通用語句模板中定義query, subsqll = “select*from tbl_test”。如果后來新增加了一種類型的數(shù)據(jù)庫SQL Server,而SQL krver對(duì)應(yīng)的選擇特定名稱的數(shù)據(jù)對(duì)應(yīng)的SQL 語句與其它數(shù)據(jù)庫并不相同,為了不對(duì)已有模板產(chǎn)生影響,則可以在SQL Server模板中定義query, subsqll = "select name fromtbl_test”,雖然與通用語句模板中功能標(biāo)識(shí)相同, 但對(duì)應(yīng)的SQL語句并不相同,此時(shí),SQL krver數(shù)據(jù)庫中該功能的SQL語句以SQL Server 模板中的為準(zhǔn)。第五種形式在通用模板中定義的功能標(biāo)識(shí)作為模板變量被數(shù)據(jù)庫模板引用。這種形式通常出現(xiàn)在數(shù)據(jù)庫模板中的SQL語句包含子查詢功能的情況下,當(dāng)數(shù)據(jù)庫模板中相同功能的SQL語句中可能存在一部分SQL語句相同,其它部分的SQL語句不同。 通常相同部分的SQL語句具有一定的子查詢功能。雖然在數(shù)據(jù)庫模板中該相同功能的SQL 語句不完全相同,但在這些SQL語句中相同的SQL語句可以在通用模板中定義,數(shù)據(jù)庫模板中SQL語句對(duì)通用模板中的模板變量進(jìn)行引用即可。舉一個(gè)具體的例子,假設(shè)功能標(biāo)識(shí)salary. toplO對(duì)應(yīng)的功能為取第2部門的所有員工中薪金最高的前10個(gè)人。在SQL krver數(shù)據(jù)庫中,salary. toplO對(duì)應(yīng)的SQL語句為select top 10 employee. employee_id from(select^from tbl_employee where department_no = 2) employee order byemployee. salary desc。在 Oracle 數(shù)據(jù)庫中, salary. toplO 對(duì)應(yīng)的 SQL i吾句為select employee. employee_id from(select 氺 from tbl_employee wheredepartment_no = 2)employee where rownum < = 10 order by employee, salarydesc。其中,兩個(gè)SQL語句中具有相同的部分,即select * from tbl_employeewhere department_no = 2,該相同的部分用于完成查詢第2部門員工的子查詢功能。在此,可以將該相同的部分定義在通用語句模板中,并采用模板變量employee, department進(jìn)行表示, 例如表不為:employee. department = (select*from tbl_employee where department— no =》。然后分別在SQL krver數(shù)據(jù)庫和Oracle數(shù)據(jù)庫的SQL語句中進(jìn)行引用,分別表 /Jn 為salary. toplO = select toplO employee. employee_id from$ {employee, department}employee order byemployee. salary desc 以及 salary. toplO = select employee. employee_id from${employee, department}employee where rownum < = 10 order byemployee. salary desc。這種形式下,對(duì)數(shù)據(jù)庫模板中的SQL語句進(jìn)行解析時(shí),如果解析到的SQL語句引用了通用語句模板中的功能表示,則利用被引用的功能標(biāo)識(shí)(即模板變量)在通用語句模板中對(duì)應(yīng)的SQL語句替換該解析到的SQL語句中引用功能標(biāo)識(shí)的部分。在上述例子中,解析至Ij salary. toplO 對(duì)應(yīng)的 SQLi吾句時(shí),將通用語句模板中 select*from tbl_employee wheredepartment_no = 2 的 SQL 語句替換 salary. toplO 對(duì)應(yīng)的 SQL 語句中的 $ {employee, department}艮口可。步驟202 訪問數(shù)據(jù)庫的裝置啟動(dòng)后,加載所有模板。本步驟在圖2所示的模板控制中間層執(zhí)行,按照指定的安裝目錄從SQL模板層中讀取全部模板至內(nèi)存中。步驟203 將各模板中的SQL語句進(jìn)行解析和整合,分別得到各數(shù)據(jù)庫類型對(duì)應(yīng)的結(jié)果集,結(jié)果集中包含對(duì)應(yīng)數(shù)據(jù)庫的所有SQL語句以及SQL語句對(duì)應(yīng)的功能標(biāo)識(shí)。在本步驟中,按照加載的各模板的中的定義,將各模板都解析成SQL語句對(duì)應(yīng)功能標(biāo)識(shí)的形式。如果模板中存在對(duì)模板變量的引用,則SQL語句中會(huì)包含模板變量。如果加載的各模板均為數(shù)據(jù)庫模板,即不存在通用語句模板(對(duì)應(yīng)步驟201中的第一種形式),則直接通過上述解析過程即可獲得各類型數(shù)據(jù)庫的SLQ語句集合。如果加載的各模板中還包括通用語句模板,則在解析之后還會(huì)包含整合過程,通過通用語句模板中SQL語句引用的模板變量來整合各數(shù)據(jù)庫的SQL語句。各數(shù)據(jù)庫的結(jié)果集除了從對(duì)應(yīng)數(shù)據(jù)庫模板中解析出的內(nèi)容之外,還可能包含通用語句模板中的內(nèi)容。對(duì)通用語句模板中的各SQL語句進(jìn)行遍歷,對(duì)遍歷到的SQL語句執(zhí)行以下操作如果當(dāng)前遍歷到的SQL語句沒有引用模板變量(對(duì)應(yīng)步驟201中的第二種形式), 則將該SQL語句及其功能標(biāo)識(shí)分別添加到各數(shù)據(jù)庫的結(jié)果集中;其中在添加時(shí),如果數(shù)據(jù)庫中已經(jīng)存在要添加的功能標(biāo)識(shí)(對(duì)應(yīng)步驟201中的第四種形式),則不執(zhí)行添加操作;如果不存在要添加的功能標(biāo)識(shí),則執(zhí)行添加操作。如果當(dāng)前遍歷到的SQL語句引用模板變量(對(duì)應(yīng)步驟201中的第三種形式),則在各數(shù)據(jù)庫的結(jié)果集中查找該模板變量,并在查找到該模板變量的結(jié)果集中,將該SQL語句對(duì)應(yīng)的功能標(biāo)識(shí)替換查找到的模板變量,并將當(dāng)前遍歷到的SQL語句及其對(duì)應(yīng)的功能標(biāo)識(shí)添加到?jīng)]有查找到該模板變量的結(jié)果集中。步驟204:當(dāng)接收到調(diào)用方的調(diào)用指令時(shí),確定當(dāng)前連接的數(shù)據(jù)庫類型,并獲取當(dāng)前連接的數(shù)據(jù)庫類型對(duì)應(yīng)的結(jié)果集。本步驟在圖2所示的SQL執(zhí)行層執(zhí)行。當(dāng)需要對(duì)數(shù)據(jù)庫進(jìn)行訪問時(shí),必先建立與數(shù)據(jù)庫之間的連接,因此,訪問數(shù)據(jù)庫的裝置在接收到調(diào)用方的調(diào)用指令時(shí),首先確定當(dāng)前連接的數(shù)據(jù)庫類型,然后從模板控制中間層獲取當(dāng)前連接的數(shù)據(jù)庫類型對(duì)應(yīng)的結(jié)果集。步驟205 根據(jù)調(diào)用指令中包含的功能標(biāo)識(shí),在獲取的結(jié)果集中查詢調(diào)用指令中攜帶的功能標(biāo)識(shí)對(duì)應(yīng)的SQL語句。在本發(fā)明中,調(diào)用方不需要對(duì)數(shù)據(jù)庫類型進(jìn)行區(qū)分,只需要對(duì)數(shù)據(jù)庫訪問的功能進(jìn)行調(diào)用,即將包含功能標(biāo)識(shí)的調(diào)用指令發(fā)送給SQL執(zhí)行層。由以上描述可以看出,功能標(biāo)識(shí)并沒有對(duì)數(shù)據(jù)庫類型進(jìn)行區(qū)分。在步驟204中已經(jīng)獲取了要訪問的數(shù)據(jù)庫的所有SQL語句構(gòu)成的結(jié)果集,在該結(jié)果集中查詢出調(diào)用指令中攜帶的功能標(biāo)識(shí)對(duì)應(yīng)的SQL語句,該SQL語句就是對(duì)要訪問的數(shù)據(jù)庫執(zhí)行訪問操作對(duì)應(yīng)的SQL語句。步驟206 利用調(diào)用指令中的訪問參數(shù)對(duì)查詢的SQL語句進(jìn)行賦值后,執(zhí)行SQL語句以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的訪問。在調(diào)用指令中還可以包含訪問參數(shù),利用該訪問參數(shù)對(duì)SQL語句中的訪問變量進(jìn)行賦值。例如,當(dāng)功能標(biāo)識(shí)對(duì)應(yīng)的訪問操作是查詢前N個(gè)數(shù)據(jù)時(shí),訪問參數(shù)可以是具體的N值。另外,在該賦值過程中,除了對(duì)SQL語句中訪問變量進(jìn)行賦值外,還可以包含形式變更以適應(yīng)SQL語法的需要。例如,當(dāng)訪問變量為字符串時(shí),自動(dòng)在字符串前后加上單引號(hào);當(dāng)訪問變量為列表或數(shù)組時(shí),自動(dòng)轉(zhuǎn)換成在各數(shù)據(jù)之間用逗號(hào)分隔的形式。在對(duì)SQL語句完成賦值后,執(zhí)行該SQL語句。如果需要進(jìn)一步返回查詢結(jié)果,則可以向調(diào)用方返回對(duì)數(shù)據(jù)庫的訪問結(jié)果。以上是對(duì)本發(fā)明所提供的方法進(jìn)行的詳細(xì)描述,下面對(duì)本發(fā)明所提供的數(shù)據(jù)庫訪問裝置進(jìn)行詳細(xì)描述。圖3為本發(fā)明提供的裝置結(jié)構(gòu)圖,如圖3所示,該裝置可以包括SQL 模板單元300、模板控制單元310和SQL執(zhí)行單元320。SQL模板單元300,用于存儲(chǔ)多種類型的數(shù)據(jù)庫模板,每種類型的數(shù)據(jù)庫模板中包含該類型數(shù)據(jù)庫的SQL語句以及SQL語句對(duì)應(yīng)的功能標(biāo)識(shí),數(shù)據(jù)庫模板中具有相同功能的 SQL語句對(duì)應(yīng)相同的功能標(biāo)識(shí)。模板控制單元310,用于在裝置啟動(dòng)后,加載SQL模板單元300中存儲(chǔ)的所有模板。SQL執(zhí)行單元320,用于接收到調(diào)用指令后,確定當(dāng)前連接的數(shù)據(jù)庫類型對(duì)應(yīng)的所有SQL語句構(gòu)成的結(jié)果集,在結(jié)果集中查詢調(diào)用指令包含的功能標(biāo)識(shí)對(duì)應(yīng)的SQL語句,執(zhí)行該SQL語句以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的訪問。SQL執(zhí)行單元320可以接收調(diào)用方的調(diào)用指令,在執(zhí)行SQL語句實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的訪問后,還可以進(jìn)一步將訪問結(jié)果返回給調(diào)用方。上述的SQL模板單元300、模板控制單元310和SQL執(zhí)行單元320對(duì)應(yīng)圖2中的 SQL模板層、模板控制中間層和SQL執(zhí)行層。其中,模板控制單元310可以包括模板加載子單元311、模板解析子單元312和結(jié)果處理子單元313。模板加載子單元311,用于在裝置啟動(dòng)后,加載所有模板。模板解析子單元312,用于對(duì)加載的所有模板中的SQL語句進(jìn)行解析。結(jié)果處理子單元313,用于根據(jù)解析結(jié)果,分別得到各數(shù)據(jù)庫類型對(duì)應(yīng)的結(jié)果集, 結(jié)果集中包含對(duì)應(yīng)數(shù)據(jù)庫的所有SQL語句以及SQL語句對(duì)應(yīng)的功能標(biāo)識(shí)。更優(yōu)地,為了對(duì)多種類型數(shù)據(jù)庫的相同SQL語句進(jìn)行復(fù)用,SQL模板單元300還存儲(chǔ)通用語句模板,通用語句模板中包含多種類型數(shù)據(jù)庫相同的SQL語句以及SQL語句對(duì)應(yīng)的功能標(biāo)識(shí)。這種情況下,模板控制單元310還可以包括語句整合子單元314,用于對(duì)解析得到的通用語句模板中的各SQL語句進(jìn)行遍歷,將遍歷到的SQL語句及其功能標(biāo)識(shí)分別添加到各數(shù)據(jù)庫類型對(duì)應(yīng)的結(jié)果集中。為了最大限度的復(fù)用SQL語句,通用語句模板中的SQL語句可以引用數(shù)據(jù)庫模板中的功能標(biāo)識(shí),其中,被引用的功能標(biāo)識(shí)對(duì)應(yīng)的SQL語句與引用該功能標(biāo)識(shí)的SQL語句具有相同功能。這種情況下,語句整合子單元314可以具體包括語句遍歷模板3141、第一判斷模塊3142、添加處理模塊3143和標(biāo)識(shí)查找模塊3144。語句遍歷模塊3141,用于對(duì)解析得到的通用語句模板中的各SQL語句進(jìn)行遍歷。
第一判斷模塊3142,用于判斷當(dāng)前遍歷到的SQL語句是否引用了其它功能標(biāo)識(shí), 如果否,向添加處理模塊3143發(fā)送第一處理通知;如果是,將被引用的功能標(biāo)識(shí)發(fā)送給標(biāo)識(shí)查找模塊3144。添加處理模塊3143,用于接收到第一處理通知后,將遍歷到的SQL語句及其功能標(biāo)識(shí)分別添加到各數(shù)據(jù)庫類型對(duì)應(yīng)的結(jié)果集中;接收到第二處理通知后,將當(dāng)前遍歷到的 SQL語句及其對(duì)應(yīng)的功能標(biāo)識(shí)添加到?jīng)]有查找到被引用的功能標(biāo)識(shí)的結(jié)果集中。標(biāo)識(shí)查找模塊3144,用于接收到所述被引用的功能標(biāo)識(shí)后,在各數(shù)據(jù)庫類型對(duì)應(yīng)的結(jié)果集中查找被引用的功能標(biāo)識(shí),將查找到被引用的功能標(biāo)識(shí)的結(jié)果集中,將當(dāng)前遍歷到的SQL語句對(duì)應(yīng)的功能標(biāo)識(shí)替換查找到的結(jié)果集中被引用的功能標(biāo)識(shí),并向添加處理模塊3143發(fā)送第二處理通知。更進(jìn)一步地,當(dāng)SQL模板單元300中新增一種類型的數(shù)據(jù)庫模板時(shí),如果新增的數(shù)據(jù)庫模板中存在與通用語句模板中具有相同功能的不同SQL語句時(shí),該具有相同功能的不同SQL語句采用相同的功能標(biāo)識(shí)。這種情況下,語句整合子單元314還可以進(jìn)一步包括第二判斷模塊3145,用于在添加處理模塊3143在將遍歷到的SQL語句及其功能標(biāo)識(shí)添加到結(jié)果集中之前,判斷要添加到的結(jié)果集中是否已經(jīng)存在要添加的功能標(biāo)識(shí),如果是,則禁止添加處理模塊3143將遍歷到的SQL語句及其功能標(biāo)識(shí)添加到結(jié)果集中,否則,允許添加處理模塊3143將遍歷到的SQL 語句及其功能標(biāo)識(shí)添加到結(jié)果集中。還有一種情況,數(shù)據(jù)庫模板中的SQL語句可以引用通用語句模板中的功能標(biāo)識(shí)。 模板解析子單元312在對(duì)數(shù)據(jù)庫模板中的SQL語句進(jìn)行解析時(shí),如果解析到的SQL語句引用了通用語句模板中的功能標(biāo)識(shí),則利用被引用的功能標(biāo)識(shí)在通用語句模板中對(duì)應(yīng)的SQL 語句替換解析到的SQL語句中引用功能標(biāo)識(shí)的部分。另外,上述SQL執(zhí)行單元320可以具體包括類型確定子單元321、語句查詢子單元322、變量賦值子單元323和語句執(zhí)行子單元324。類型確定子單元321,用于接收到調(diào)用指令后,確定當(dāng)前連接的數(shù)據(jù)庫類型對(duì)應(yīng)的所有SQL語句構(gòu)成的結(jié)果集。語句查詢子單元322,用于在類型確定子單元321確定的結(jié)果集中,查詢調(diào)用指令包含的功能標(biāo)識(shí)對(duì)應(yīng)的SQL語句。變量賦值子單元323,用于利用調(diào)用指令中的訪問參數(shù)對(duì)語句查詢子單元322查詢到的SQL語句進(jìn)行賦值。語句執(zhí)行子單元324,用于執(zhí)行賦值后的SQL語句以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的訪問。由以上描述可以看出,本發(fā)明提供的方法和裝置可以具備以下優(yōu)點(diǎn)1)本發(fā)明通過模板的形式保存各數(shù)據(jù)庫的SQL語言及其對(duì)應(yīng)功能標(biāo)識(shí),各數(shù)據(jù)庫模板中具有相同功能的SQL語句對(duì)應(yīng)相同的功能標(biāo)識(shí),使得在調(diào)用方進(jìn)行功能調(diào)用時(shí),無需對(duì)數(shù)據(jù)庫類型進(jìn)行調(diào)用,僅需要通過調(diào)用指令發(fā)送要訪問的操作對(duì)應(yīng)的功能標(biāo)識(shí),數(shù)據(jù)庫訪問裝置便能夠從當(dāng)前連接的數(shù)據(jù)庫類型對(duì)應(yīng)的所有SQL語句構(gòu)成的結(jié)果集中,查詢出該功能標(biāo)識(shí)對(duì)應(yīng)的SQL語句,并執(zhí)行該SQL語句以實(shí)現(xiàn)數(shù)據(jù)庫的訪問??梢钥闯觯景l(fā)明能夠在調(diào)用方屏蔽數(shù)據(jù)庫的類型差異,降低調(diào)用方操作的復(fù)雜度。2)在本發(fā)明中通過設(shè)置通用語句模板來存儲(chǔ)多種類型數(shù)據(jù)庫相同的SQL語句及其對(duì)應(yīng)的功能標(biāo)識(shí),并可以進(jìn)一步結(jié)合功能標(biāo)識(shí)作為模板變量的引用功能,最大限度地復(fù)用各類型數(shù)據(jù)庫中相同的SQL語句。3)當(dāng)在數(shù)據(jù)庫訪問裝置支持新的類型的數(shù)據(jù)庫時(shí),在數(shù)據(jù)庫訪問裝置中新增對(duì)應(yīng)的數(shù)據(jù)庫模板,當(dāng)新增的數(shù)據(jù)庫模板中存在與通用語句模板中具有相同功能的不同SQL語句時(shí),采用與通用語句模板中相同的功能標(biāo)識(shí),并且在對(duì)該數(shù)據(jù)庫執(zhí)行該功能標(biāo)識(shí)時(shí),采用該數(shù)據(jù)庫模板中該功能標(biāo)識(shí)對(duì)應(yīng)的SQL語句。這種漸進(jìn)式的增加方式,使得在新增加模板時(shí),不會(huì)對(duì)已有模板中的內(nèi)容產(chǎn)生影響。4)采用模板的方式定義各數(shù)據(jù)庫的SQL語句,相比較在代碼中編寫各數(shù)據(jù)庫的 SQL語句的方式,在進(jìn)行修改和維護(hù)時(shí)僅需要對(duì)模板中的定義進(jìn)行變更而不必修改已有代碼,使得修改和維護(hù)更加簡單和方便。5)在各模板中采用功能標(biāo)識(shí)對(duì)SQL語句進(jìn)行標(biāo)識(shí),并對(duì)各數(shù)據(jù)庫模板中具有同一功能的SQL語句采用相同的功能標(biāo)識(shí),增強(qiáng)了 SQL語句的可閱讀性。以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明保護(hù)的范圍之內(nèi)。
權(quán)利要求
1.一種對(duì)數(shù)據(jù)庫進(jìn)行訪問的方法,其特征在于,應(yīng)用于包含多種類型數(shù)據(jù)庫模板的數(shù)據(jù)庫訪問裝置,每種類型的數(shù)據(jù)庫模板中包含該類型數(shù)據(jù)庫的結(jié)構(gòu)化查詢語言SQL語句以及SQL語句對(duì)應(yīng)的功能標(biāo)識(shí),所述數(shù)據(jù)庫模板中具有相同功能的SQL語句對(duì)應(yīng)相同的功能標(biāo)識(shí);該方法包括A、數(shù)據(jù)庫訪問裝置啟動(dòng)后,加載所有模板;B、接收到調(diào)用指令后,確定當(dāng)前連接的數(shù)據(jù)庫類型對(duì)應(yīng)的所有SQL語句構(gòu)成的結(jié)果集;C、在所述結(jié)果集中查詢所述調(diào)用指令包含的功能標(biāo)識(shí)對(duì)應(yīng)的SQL語句,執(zhí)行該SQL語句以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的訪問。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,在步驟A中所述加載所有模板之后還包括將各模板中的SQL語句進(jìn)行解析,分別得到各數(shù)據(jù)庫類型對(duì)應(yīng)的結(jié)果集,所述結(jié)果集中包含對(duì)應(yīng)數(shù)據(jù)庫的所有SQL語句以及SQL語句對(duì)應(yīng)的功能標(biāo)識(shí)。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述數(shù)據(jù)庫裝置還包含通用語句模板,用于存儲(chǔ)多種類型數(shù)據(jù)庫相同的SQL語句以及SQL語句對(duì)應(yīng)的功能標(biāo)識(shí);在所述將各模板中的SQL語句進(jìn)行解析之后還包括對(duì)通用語句模板中的各SQL語句進(jìn)行遍歷,將遍歷到的SQL語句及其功能標(biāo)識(shí)分別添加到各數(shù)據(jù)庫類型對(duì)應(yīng)的結(jié)果集中。
4.根據(jù)權(quán)利要求3所述的方法,其特征在于,所述通用語句模板中的SQL語句引用所述數(shù)據(jù)庫模板中的功能標(biāo)識(shí),被引用的功能標(biāo)識(shí)對(duì)應(yīng)的SQL語句與引用該功能標(biāo)識(shí)的SQL語句具有相同功能;在所述將遍歷到的SQL語句及其功能標(biāo)識(shí)分別添加到各數(shù)據(jù)庫類型對(duì)應(yīng)的結(jié)果集中之前還包括判斷當(dāng)前遍歷到的SQL語句是否引用了其它功能標(biāo)識(shí),如果否,繼續(xù)執(zhí)行所述將遍歷到的SQL語句及其功能標(biāo)識(shí)分別添加到各數(shù)據(jù)庫類型對(duì)應(yīng)的結(jié)果集中;如果是,在各數(shù)據(jù)庫類型對(duì)應(yīng)的結(jié)果集中查找被引用的功能標(biāo)識(shí),在查找到被引用的功能標(biāo)識(shí)的結(jié)果集中,將所述當(dāng)前遍歷到的SQL語句對(duì)應(yīng)的功能標(biāo)識(shí)替換查找到的結(jié)果集中被引用的功能標(biāo)識(shí),并將所述當(dāng)前遍歷到的SQL語句及其對(duì)應(yīng)的功能標(biāo)識(shí)添加到?jīng)]有查找到被引用的功能標(biāo)識(shí)的結(jié)果集中。
5.根據(jù)權(quán)利要求3或4所述的方法,其特征在于,當(dāng)在數(shù)據(jù)庫訪問裝置中新增一種類型的數(shù)據(jù)庫模板時(shí),如果該新增的數(shù)據(jù)庫模板中存在與通用語句模板中具有相同功能的不同 SQL語句時(shí),該具有相同功能的不同SQL語句采用相同的功能標(biāo)識(shí);在將遍歷到的SQL語句及其功能標(biāo)識(shí)添加到結(jié)果集中之前,還包括判斷要添加到的結(jié)果集中是否已經(jīng)存在要添加的功能標(biāo)識(shí),如果是,則不將遍歷到的SQL語句及其功能標(biāo)識(shí)添加到結(jié)果集中,否則,將遍歷到的SQL語句及其功能標(biāo)識(shí)添加到結(jié)果集中。
6.根據(jù)權(quán)利要求3所述的方法,其特征在于,數(shù)據(jù)庫模板中的SQL語句引用所述通用語句模板中的功能標(biāo)識(shí);在對(duì)數(shù)據(jù)庫模板中的SQL語句進(jìn)行解析時(shí),如果解析到的SQL語句引用了通用語句模板中的功能標(biāo)識(shí),則利用被引用的功能標(biāo)識(shí)在通用語句模板中對(duì)應(yīng)的SQL語句替換所述解析到的SQL語句中引用功能標(biāo)識(shí)的部分。
7.根據(jù)權(quán)利要求1、2、3、4或6所述的方法,其特征在于,步驟C中所述執(zhí)行該SQL語句具體包括利用所述調(diào)用指令中的訪問參數(shù)對(duì)查詢到的SQL語句進(jìn)行賦值,執(zhí)行賦值后的SQL語句。
8.—種對(duì)數(shù)據(jù)庫進(jìn)行訪問的裝置,其特征在于,該裝置包括SQL模板單元、模板控制單元和SQL執(zhí)行單元;所述SQL模板單元,用于存儲(chǔ)多種類型的數(shù)據(jù)庫模板,每種類型的數(shù)據(jù)庫模板中包含該類型數(shù)據(jù)庫的SQL語句以及SQL語句對(duì)應(yīng)的功能標(biāo)識(shí),所述數(shù)據(jù)庫模板中具有相同功能的SQL語句對(duì)應(yīng)相同的功能標(biāo)識(shí);所述模板控制單元,用于在所述裝置啟動(dòng)后,加載所有模板;所述SQL執(zhí)行單元,用于接收到調(diào)用指令后,確定當(dāng)前連接的數(shù)據(jù)庫類型對(duì)應(yīng)的所有 SQL語句構(gòu)成的結(jié)果集,在所述結(jié)果集中查詢所述調(diào)用指令包含的功能標(biāo)識(shí)對(duì)應(yīng)的SQL語句,執(zhí)行該SQL語句以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的訪問。
9.根據(jù)權(quán)利要求8所述的裝置,其特征在于,所述模板控制單元包括模板加載子單元、模板解析子單元和結(jié)果處理子單元;所述模板加載子單元,用于在所述裝置啟動(dòng)后,加載所有模板;所述模板解析子單元,用于對(duì)加載的所有模板中的SQL語句進(jìn)行解析;所述結(jié)果處理子單元,用于根據(jù)解析結(jié)果,分別得到各數(shù)據(jù)庫類型對(duì)應(yīng)的結(jié)果集,所述結(jié)果集中包含對(duì)應(yīng)數(shù)據(jù)庫的所有SQL語句以及SQL語句對(duì)應(yīng)的功能標(biāo)識(shí)。
10.根據(jù)權(quán)利要求9所述的裝置,其特征在于,所述SQL模板單元還存儲(chǔ)通用語句模板, 通用語句模板中包含多種類型數(shù)據(jù)庫相同的SQL語句以及SQL語句對(duì)應(yīng)的功能標(biāo)識(shí);所述模板控制單元還包括語句整合子單元,用于對(duì)解析得到的通用語句模板中的各 SQL語句進(jìn)行遍歷,將遍歷到的SQL語句及其功能標(biāo)識(shí)分別添加到各數(shù)據(jù)庫類型對(duì)應(yīng)的結(jié)果集中。
11.根據(jù)權(quán)利要求10所述的裝置,其特征在于,所述通用語句模板中的SQL語句引用所述數(shù)據(jù)庫模板中的功能標(biāo)識(shí),被引用的功能標(biāo)識(shí)對(duì)應(yīng)的SQL語句與引用該功能標(biāo)識(shí)的SQL 語句具有相同功能;所述語句整合子單元具體包括語句遍歷模板、第一判斷模塊、添加處理模塊和標(biāo)識(shí)查找模塊;所述語句遍歷模塊,用于對(duì)解析得到的通用語句模板中的各SQL語句進(jìn)行遍歷;所述第一判斷模塊,用于判斷當(dāng)前遍歷到的SQL語句是否引用了其它功能標(biāo)識(shí),如果否,向所述添加處理模塊發(fā)送第一處理通知;如果是,將被引用的功能標(biāo)識(shí)發(fā)送給所述標(biāo)識(shí)查找模塊;所述添加處理模塊,用于接收到第一處理通知后,將遍歷到的SQL語句及其功能標(biāo)識(shí)分別添加到各數(shù)據(jù)庫類型對(duì)應(yīng)的結(jié)果集中;接收到第二處理通知后,將所述當(dāng)前遍歷到的 SQL語句及其對(duì)應(yīng)的功能標(biāo)識(shí)添加到?jīng)]有查找到被引用的功能標(biāo)識(shí)的結(jié)果集中;所述標(biāo)識(shí)查找模塊,用于接收到所述被引用的功能標(biāo)識(shí)后,在各數(shù)據(jù)庫類型對(duì)應(yīng)的結(jié)果集中查找所述被引用的功能標(biāo)識(shí),將查找到被引用的功能標(biāo)識(shí)的結(jié)果集中,將所述當(dāng)前遍歷到的SQL語句對(duì)應(yīng)的功能標(biāo)識(shí)替換查找到的結(jié)果集中被引用的功能標(biāo)識(shí),并向所述添加處理模塊發(fā)送第二處理通知。
12.根據(jù)權(quán)利要求11所述的裝置,其特征在于,當(dāng)所述SQL模板單元中新增一種類型的數(shù)據(jù)庫模板時(shí),如果新增的數(shù)據(jù)庫模板中存在與通用語句模板中具有相同功能的不同SQL語句時(shí),該具有相同功能的不同SQL語句采用相同的功能標(biāo)識(shí);所述語句整合子單元還包括第二判斷模塊,用于在所述添加處理模塊在將遍歷到的 SQL語句及其功能標(biāo)識(shí)添加到結(jié)果集中之前,判斷要添加到的結(jié)果集中是否已經(jīng)存在要添加的功能標(biāo)識(shí),如果是,則禁止所述添加處理模塊將遍歷到的SQL語句及其功能標(biāo)識(shí)添加到結(jié)果集中,否則,允許所述添加處理模塊將遍歷到的SQL語句及其功能標(biāo)識(shí)添加到結(jié)果集中。
13.根據(jù)權(quán)利要求10所述的裝置,其特征在于,所述數(shù)據(jù)庫模板中的SQL語句引用所述通用語句模板中的功能標(biāo)識(shí);所述模板解析子單元在對(duì)數(shù)據(jù)庫模板中的SQL語句進(jìn)行解析時(shí),如果解析到的SQL語句引用了通用語句模板中的功能標(biāo)識(shí),則利用被引用的功能標(biāo)識(shí)在通用語句模板中對(duì)應(yīng)的 SQL語句替換所述解析到的SQL語句中引用功能標(biāo)識(shí)的部分。
14.根據(jù)權(quán)利要求8至13任一權(quán)項(xiàng)所述的裝置,其特征在于,所述SQL執(zhí)行單元具體包括類型確定子單元、語句查詢子單元、變量賦值子單元和語句執(zhí)行子單元;所述類型確定子單元,用于接收到調(diào)用指令后,確定當(dāng)前連接的數(shù)據(jù)庫類型對(duì)應(yīng)的所有SQL語句構(gòu)成的結(jié)果集;所述語句查詢子單元,用于在所述類型確定子單元確定的結(jié)果集中,查詢所述調(diào)用指令包含的功能標(biāo)識(shí)對(duì)應(yīng)的SQL語句;所述變量賦值子單元,用于利用所述調(diào)用指令中的訪問參數(shù)對(duì)所述語句查詢子單元查詢到的SQL語句進(jìn)行賦值;所述語句執(zhí)行子單元,用于執(zhí)行賦值后的SQL語句以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的訪問。
全文摘要
本發(fā)明提供了一種對(duì)數(shù)據(jù)庫進(jìn)行訪問的方法和裝置,應(yīng)用于包含多種類型的數(shù)據(jù)庫模板的數(shù)據(jù)庫訪問裝置。每種類型的數(shù)據(jù)庫模板中包含該類型數(shù)據(jù)庫的結(jié)構(gòu)化查詢語言(SQL)語句以及SQL語句對(duì)應(yīng)的功能標(biāo)識(shí),數(shù)據(jù)庫模板中具有相同功能的SQL語句對(duì)應(yīng)相同的功能標(biāo)識(shí);數(shù)據(jù)庫訪問裝置啟動(dòng)后,加載所有模板;接收到調(diào)用指令后,確定當(dāng)前連接的數(shù)據(jù)庫類型對(duì)應(yīng)的所有SQL語句構(gòu)成的結(jié)果集;在結(jié)果集中查詢調(diào)用指令包含的功能標(biāo)識(shí)對(duì)應(yīng)的SQL語句,執(zhí)行該SQL語句以實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的訪問。本發(fā)明能夠在調(diào)用方屏蔽數(shù)據(jù)庫的類型差異,降低調(diào)用方操作的復(fù)雜度,并充分利用各個(gè)數(shù)據(jù)庫特有的SQL語句。
文檔編號(hào)G06F17/30GK102193922SQ20101011990
公開日2011年9月21日 申請(qǐng)日期2010年3月4日 優(yōu)先權(quán)日2010年3月4日
發(fā)明者余天舒, 楊靜濤 申請(qǐng)人:杭州華三通信技術(shù)有限公司