亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種基于openEHR模板的數(shù)據(jù)接口動態(tài)生成方法與流程

文檔序號:11654667閱讀:393來源:國知局
本發(fā)明涉及計算機(jī)軟件數(shù)據(jù)接口生成
技術(shù)領(lǐng)域
:,具體涉及一種基于openehr模板的數(shù)據(jù)接口動態(tài)生成方法。
背景技術(shù)
::當(dāng)今世界每天增速最快的毫無疑問是數(shù)據(jù),各級各類醫(yī)院亦是,每天的醫(yī)療活動所產(chǎn)生的數(shù)據(jù)量增速遙遙領(lǐng)先。人們希望這些數(shù)據(jù)發(fā)揮其價值,更好地為醫(yī)療衛(wèi)生行業(yè)的管理、診療、科研和教學(xué)服務(wù),從而提高醫(yī)院業(yè)務(wù)效率,節(jié)省醫(yī)療資源,減少醫(yī)療成本,幫助臨床學(xué)術(shù)研究,通過現(xiàn)有的醫(yī)療數(shù)據(jù)來解決更多醫(yī)學(xué)難題。醫(yī)院建立醫(yī)療數(shù)據(jù)存儲中心,對醫(yī)療活動所產(chǎn)生的數(shù)據(jù)進(jìn)行收集整合,醫(yī)院在數(shù)據(jù)存儲中心上建立各種應(yīng)用系統(tǒng),通過數(shù)據(jù)接口來訪問這些數(shù)據(jù),對這些數(shù)據(jù)加以利用,從而輔助醫(yī)護(hù)人員的工作,幫助醫(yī)護(hù)人員進(jìn)行課題研究,方便實(shí)現(xiàn)醫(yī)院的管理工作。但是隨著醫(yī)療活動的進(jìn)行,醫(yī)院應(yīng)用數(shù)據(jù)需求在不斷的變化,具體體現(xiàn)在兩個方面,一方面是數(shù)據(jù)資源種類的增加,這就需要醫(yī)院數(shù)據(jù)中心增加這些數(shù)據(jù)資源的存儲,并為應(yīng)用提供這些數(shù)據(jù)訪問服務(wù),另一方面是在現(xiàn)有的數(shù)據(jù)資源種類中訪問應(yīng)用所需要所感興趣的數(shù)據(jù),每個應(yīng)用的數(shù)據(jù)需求都不盡相同,這就需要醫(yī)院數(shù)據(jù)存儲中心所提供的數(shù)據(jù)接口能夠靈活適應(yīng)醫(yī)院應(yīng)用系統(tǒng)不斷變化的數(shù)據(jù)需求。面對不斷變化的應(yīng)用數(shù)據(jù)需求,醫(yī)院數(shù)據(jù)存儲中心應(yīng)對這些需求變化的常用方法是按需定制開發(fā)接口,而定制數(shù)據(jù)接口的過程主要涉及人員有應(yīng)用系統(tǒng)開發(fā)人員、醫(yī)院信息管理人員以及第三方臨床數(shù)據(jù)中心維護(hù)人員,具體的開發(fā)過程為應(yīng)用系統(tǒng)開發(fā)人員根據(jù)自身需求制定數(shù)據(jù)需求文檔,提交給醫(yī)院信息管理人員進(jìn)行數(shù)據(jù)訪問權(quán)限的審核;審核通過后,醫(yī)院信息管理人員組織應(yīng)用系統(tǒng)開發(fā)人員與第三方臨床數(shù)據(jù)中心維護(hù)人員進(jìn)行協(xié)商,討論確定數(shù)據(jù)接口規(guī)范;雙方根據(jù)數(shù)據(jù)接口規(guī)范分別進(jìn)行開發(fā),開發(fā)完成后,雙方進(jìn)行數(shù)據(jù)訪問的系統(tǒng)聯(lián)調(diào);聯(lián)調(diào)通過后應(yīng)用系統(tǒng)開發(fā)人員才能最終完成對數(shù)據(jù)的訪問。整個過程中由于理解差異,往往在聯(lián)調(diào)或使用時發(fā)現(xiàn)數(shù)據(jù)接口不符合需求,需要臨床數(shù)據(jù)中心的接口進(jìn)行重新開發(fā),導(dǎo)致接口開發(fā)流程耗時非常大。openehr規(guī)范是由openehr組織制定的描述電子健康數(shù)據(jù)管理、存儲、獲取和交換的電子健康檔案標(biāo)準(zhǔn)規(guī)范,其核心是運(yùn)用兩層建模方法將醫(yī)療領(lǐng)域知識從具體的臨床信息中分離出來,主要包括參考模型(rm),和原型模型(am),原型模型由原型(archetype)和模板(template)組成。參考模型定義了一組表達(dá)醫(yī)學(xué)知識和概念的通用基礎(chǔ)數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu),原型通過對參考模型添加約束來描述每個具體的醫(yī)學(xué)知識和概念,模板根據(jù)實(shí)際應(yīng)用需求對原型進(jìn)一步添加約束來描述具體的數(shù)據(jù)需求。openehr規(guī)范主要解決醫(yī)學(xué)知識和數(shù)據(jù)需求不斷變化導(dǎo)致的信息系統(tǒng)維護(hù)和更新的問題。通過分層方法,信息系統(tǒng)基于穩(wěn)定不變的參考模型建立,醫(yī)學(xué)知識和數(shù)據(jù)需求通過原型和模板表達(dá)。當(dāng)醫(yī)學(xué)知識和數(shù)據(jù)需求發(fā)生變化的時候,通過修改和制定新的原型和模板來表達(dá)變化的部分,信息系統(tǒng)通過解析原型和模板實(shí)現(xiàn)功能的變化,而不用進(jìn)行修改。目前,針對openehr規(guī)范應(yīng)用的研究有很多,例如,openehr官方機(jī)構(gòu)公布了一種領(lǐng)域查詢語言aql(archetypequerylanguage)是專門用于查詢和檢索基于原型的ehr中臨床數(shù)據(jù)的聲明性查詢語言,aql語法與sql語法類似,基于原型屬性路徑進(jìn)行查詢,返回openehr結(jié)構(gòu)化數(shù)據(jù),與具體的存儲結(jié)構(gòu)無關(guān),只需要理解openehr原型所代表的領(lǐng)域知識即可。每當(dāng)領(lǐng)域知識發(fā)生改變時,針對新的原型和原有原型一樣只需要按照aql語法來進(jìn)行查詢即可獲得相應(yīng)的數(shù)據(jù),不需要重新開發(fā)基于openehr的存儲結(jié)構(gòu)的數(shù)據(jù)訪問接口。生物醫(yī)學(xué)工程學(xué)報2014年04期上發(fā)表了一篇論文《基于openehr的原型關(guān)系映射方法》提出了將openehr原型映射為關(guān)系數(shù)據(jù)庫表,并將原型屬性映射為關(guān)系數(shù)據(jù)庫字段的方法,同時對aql進(jìn)行擴(kuò)展,能夠?qū)趏penehr原型生成的關(guān)系數(shù)據(jù)庫進(jìn)行增刪改查等數(shù)據(jù)訪問操作,但是由于原型是對臨床知識的最完整的定義,而模板是根據(jù)臨床需要對原型的進(jìn)一步約束,更符合臨床的需要,因此在原型關(guān)系映射方法的基礎(chǔ)上,將模板映射為關(guān)系數(shù)據(jù)庫表,模板的屬性映射為關(guān)系數(shù)據(jù)庫字段,并且對aql再一次擴(kuò)展,提出對模板的查詢語言作為數(shù)據(jù)訪問接口,但是領(lǐng)域查詢語言專業(yè)要求太高,且返回數(shù)據(jù)格式為模板,臨床應(yīng)用需要對模板解析才能獲得醫(yī)療數(shù)據(jù),而且當(dāng)數(shù)據(jù)量過大時,傳輸速度慢,不易使用,無法滿足實(shí)際的臨床應(yīng)用需求。技術(shù)實(shí)現(xiàn)要素:本發(fā)明提供了一種基于openehr模板的數(shù)據(jù)接口動態(tài)生成方法,解決了現(xiàn)有數(shù)據(jù)接口因靈活性低而造成人力時間浪費(fèi)以及openehr模板查詢語言無法滿足實(shí)際臨床應(yīng)用需求的問題。一種基于openehr模板的數(shù)據(jù)接口動態(tài)生成方法,包括:步驟1,解析openehr模板,并建立模板對象;步驟2,依據(jù)模板對象獲取每個模板屬性對應(yīng)的關(guān)系型臨床數(shù)據(jù)庫結(jié)構(gòu),并創(chuàng)建數(shù)據(jù)接口對象;步驟3,解析客戶端調(diào)用數(shù)據(jù)接口所發(fā)起http請求,并建立httprequest對象;步驟4,根據(jù)步驟2的數(shù)據(jù)接口對象和步驟3的httprequest對象,生成數(shù)據(jù)庫操作sql語句;步驟5,針對基于openehr模板生成的關(guān)系型臨床數(shù)據(jù)庫,執(zhí)行步驟4生成的sql語句,得到數(shù)據(jù)操作結(jié)果;步驟6,根據(jù)步驟5的數(shù)據(jù)操作結(jié)果構(gòu)建httpresponse對象返回給調(diào)用方。作為優(yōu)選,步驟2創(chuàng)建數(shù)據(jù)接口對象包括:自動創(chuàng)建數(shù)據(jù)接口對象和根據(jù)臨床特定數(shù)據(jù)需求自定義數(shù)據(jù)接口對象兩種方式,其中自動創(chuàng)建數(shù)據(jù)接口對象具體包括:每個openehr模板對應(yīng)至少一張關(guān)系數(shù)據(jù)庫表,以每張關(guān)系數(shù)據(jù)庫表為資源自動創(chuàng)建數(shù)據(jù)接口對象,每個數(shù)據(jù)接口對象包括資源描述和請求方法信息:每個數(shù)據(jù)接口對象的資源描述為:模板/版本/數(shù)據(jù)庫表名;每個請求方法包括:輸入?yún)?shù)、輸出參數(shù)、表達(dá)篩選條件的過濾器、以及表達(dá)關(guān)系型臨床數(shù)據(jù)庫中關(guān)系數(shù)據(jù)庫表之間關(guān)系的邏輯關(guān)系。作為優(yōu)選,自動創(chuàng)建數(shù)據(jù)接口對象的請求方法包括get、put、delete以及post,其中:get方法的輸入?yún)?shù)為關(guān)系數(shù)據(jù)庫表的主鍵字段,輸出參數(shù)為關(guān)系數(shù)據(jù)庫表的所有字段,過濾器為關(guān)系數(shù)據(jù)庫表的主鍵值等于,處理邏輯為單張關(guān)系數(shù)據(jù)庫表結(jié)構(gòu);put方法的輸入?yún)?shù)為關(guān)系數(shù)據(jù)庫表的所有字段,輸出參數(shù)為執(zhí)行結(jié)果,過濾器為關(guān)系數(shù)據(jù)庫表的主鍵值等于,處理邏輯為單張數(shù)據(jù)庫表結(jié)構(gòu);delete方法的輸入?yún)?shù)為關(guān)系數(shù)據(jù)庫表的主鍵字段,輸出參數(shù)為執(zhí)行結(jié)果,過濾器為關(guān)系數(shù)據(jù)庫表的主鍵值等于,處理邏輯為單張數(shù)據(jù)庫表結(jié)構(gòu);post方法的輸入?yún)?shù)為關(guān)系數(shù)據(jù)庫表的所有字段,過濾器為空,處理邏輯為單張數(shù)據(jù)庫表結(jié)構(gòu)。作為優(yōu)選,自動創(chuàng)建數(shù)據(jù)接口對象方法中,若關(guān)系數(shù)據(jù)庫表具有外鍵字段,則新建一個數(shù)據(jù)接口對象,該數(shù)據(jù)接口對象的資源描述為:模板/版本/數(shù)據(jù)庫表名/referenceid,該數(shù)據(jù)接口對象的請求方法為get,該get方法的輸入?yún)?shù)為關(guān)系數(shù)據(jù)庫表的外鍵字段,輸出參數(shù)為關(guān)系數(shù)據(jù)庫表的所有字段,過濾器為關(guān)系數(shù)據(jù)庫表的外鍵值等于,處理邏輯為單張數(shù)據(jù)庫表結(jié)構(gòu)。作為優(yōu)選,根據(jù)臨床特定數(shù)據(jù)需求自定義數(shù)據(jù)接口對象,具體包括:步驟2-1、定義數(shù)據(jù)接口對象的資源描述為:模板/版本/自定義名稱;步驟2-2、指定請求方法,所述請求方法為get、put、delete的任意組合,基于模板屬性,定義各請求方法的輸入?yún)?shù)和輸出參數(shù);步驟2-3、在輸入?yún)?shù)的基礎(chǔ)上定義賦值對應(yīng)的請求方法的過濾器屬性;步驟2-4、依據(jù)所選的模板屬性對應(yīng)的關(guān)系型臨床數(shù)據(jù)庫結(jié)構(gòu)創(chuàng)建數(shù)據(jù)接口對象的邏輯關(guān)系:若模板屬性對應(yīng)的數(shù)據(jù)庫字段在同一張關(guān)系數(shù)據(jù)庫表中,則邏輯關(guān)系設(shè)置為單表;若模板屬性對應(yīng)的數(shù)據(jù)庫字段不在同一張關(guān)系數(shù)據(jù)庫表中,針對涉及的所有關(guān)系數(shù)據(jù)庫表,每兩張關(guān)系數(shù)據(jù)庫表對應(yīng)一個邏輯關(guān)系;步驟2-5、將數(shù)據(jù)庫字段名稱按照駝峰命名法構(gòu)建數(shù)據(jù)接口對象各參數(shù)的參數(shù)名。作為優(yōu)選,步驟4生成數(shù)據(jù)庫操作sql語句,具體包括:步驟4-1、解析httprequest對象,獲取請求地址uri,根據(jù)uri與數(shù)據(jù)接口對象的資源描述匹配獲取所要執(zhí)行的數(shù)據(jù)接口對象;步驟4-2、根據(jù)httprequest對象的請求方式定位數(shù)據(jù)接口對象的請求方法,解析該請求方法的輸入?yún)?shù)、輸出參數(shù)、過濾器以及邏輯關(guān)系;步驟4-3、根據(jù)httprequest的輸入?yún)?shù)值和數(shù)據(jù)接口對象的請求方法屬性值生成數(shù)據(jù)庫操作sql語句。作為優(yōu)選,數(shù)據(jù)接口對象的請求方法為get時,生成數(shù)據(jù)庫操作sql語句為select語句,具體生成方法如下:首先,依據(jù)數(shù)據(jù)接口對象的邏輯關(guān)系判斷要操作的關(guān)系數(shù)據(jù)庫表結(jié)構(gòu):若邏輯關(guān)系為1個,判斷是否只有單表操作,若是,則為單表查詢;若不是單表操作,則為多表級聯(lián)查詢;若邏輯關(guān)系為2個以上,則為多表查詢,多表查詢包括多表級聯(lián)查詢和多表非級聯(lián)查詢;其次,采用如下方法拼接sql語句:針對單表查詢:a1、獲取數(shù)據(jù)接口對象的請求方法的輸出參數(shù),構(gòu)建目標(biāo)表達(dá)式為:columnnameasparaname;a2、若orderby屬性值不是null,取orderby屬性值拼接sql語句中的排序要求,表達(dá)式為:columnnamedesc/asc;a3、from子句為該數(shù)據(jù)庫表名;a4、獲取數(shù)據(jù)接口對象的請求方法的邏輯關(guān)系、輸入?yún)?shù)和過濾器,構(gòu)建where子句的條件表達(dá)式為:relationcolumnnameoperationvalue/paraname;式中,用relation屬性值連接條件表達(dá)式;columnname值為過濾器參數(shù)名稱對應(yīng)的數(shù)據(jù)庫字段列名;operation值對應(yīng)相應(yīng)的操作符,如果value屬性值不是null,直接獲取value屬性值;如果value屬性值為null,則從httprequest對象中獲得value屬性值;針對多表級聯(lián)查詢:b1、獲取數(shù)據(jù)接口對象的請求方法的輸出參數(shù),構(gòu)建目標(biāo)表達(dá)式為:tablename.columnnameasparaname;b2、若orderby屬性值不是null,取orderby屬性值拼接sql語句中的排序要求,表達(dá)式為:tablename.columnnamedesc/asc;b3、將關(guān)系數(shù)據(jù)庫表表名按照級聯(lián)關(guān)系進(jìn)行排序,按照關(guān)系數(shù)據(jù)庫表表名序列使用左連接構(gòu)建from子句;b4、獲取數(shù)據(jù)接口對象的請求方法的邏輯關(guān)系、輸入?yún)?shù)和過濾器,構(gòu)建where子句的條件表達(dá)式為:relationtablename.columnnameoperationvalue/paraname;式中,用relation屬性值連接條件表達(dá)式;columnname值為過濾器參數(shù)名稱對應(yīng)的數(shù)據(jù)庫字段列名;operation值對應(yīng)相應(yīng)的操作符,如果value屬性值不是null,直接獲取value屬性值;如果value屬性值為null,則從httprequest對象中獲得value屬性值;針對多表非級聯(lián)查詢:按照各表的級聯(lián)關(guān)系拆分為多條多表級聯(lián)查詢,或多個單表,或單表和多表級聯(lián)查詢的組合。作為優(yōu)選,數(shù)據(jù)接口對象的請求方法為put時,生成數(shù)據(jù)庫操作sql語句為update語句,具體生成方法如下:首先,依據(jù)數(shù)據(jù)接口對象的邏輯關(guān)系判斷要操作的關(guān)系數(shù)據(jù)庫表結(jié)構(gòu):若邏輯關(guān)系為1個,判斷是否只有單表操作,若是,則為單表更新,否則為多表更新;若邏輯關(guān)系為2個以上,則為多表更新;其次,采用如下方法拼接sql語句:針對單表更新:a-1、根據(jù)輸入?yún)?shù)的columnname和paraname確定set子句,set子句的列名為columnname的屬性值,set子句的表達(dá)式為從httprequest對象中獲取到的相應(yīng)paraname值;a-2、根據(jù)數(shù)據(jù)接口對象的請求方法的邏輯關(guān)系、輸入?yún)?shù)和過濾器,構(gòu)建where子句的條件表達(dá)式為:relationcolumnnameoperationvalue/paraname;式中,用relation屬性值連接條件表達(dá)式;columnname值為過濾器參數(shù)名稱對應(yīng)的數(shù)據(jù)庫字段列名;operation值對應(yīng)相應(yīng)的操作符,如果value屬性值不是null,直接獲取value屬性值;如果value屬性值為null,則從httprequest對象中獲得value屬性值;針對多表更新:b-1、將關(guān)系數(shù)據(jù)庫表表名按照級聯(lián)關(guān)系進(jìn)行排序,按照關(guān)系數(shù)據(jù)庫表表名序列使用左連接構(gòu)建from子句;b-2、每條update語句每次更新一張關(guān)系數(shù)據(jù)庫表表的內(nèi)容,update語句的列名由輸入?yún)?shù)的tablename和columnname屬性值確定,表達(dá)式為相應(yīng)的paraname值;b-3、獲取數(shù)據(jù)接口對象的請求方法的邏輯關(guān)系、輸入?yún)?shù)和過濾器,構(gòu)建where子句的條件表達(dá)式為:relationtablename.columnnameoperationvalue/paraname;式中,用relation屬性值連接條件表達(dá)式;columnname值為過濾器參數(shù)名稱對應(yīng)的數(shù)據(jù)庫字段列名;operation值對應(yīng)相應(yīng)的操作符,如果value屬性值不是null,直接獲取value屬性值;如果value屬性值為null,則從httprequest對象中獲得value屬性值。作為優(yōu)選,數(shù)據(jù)接口對象的請求方法為delete時,生成數(shù)據(jù)庫操作sql語句為delete語句,具體生成方法如下:首先,依據(jù)數(shù)據(jù)接口對象的邏輯關(guān)系判斷要操作的關(guān)系數(shù)據(jù)庫表結(jié)構(gòu):若邏輯關(guān)系為1個,判斷是否只有單表操作,若是,則為單表刪除,否則為多表刪除;若邏輯關(guān)系為2個以上,則為多表刪除;其次,采用如下方法拼接sql語句:針對單表刪除:獲取數(shù)據(jù)接口對象的請求方法的邏輯關(guān)系、輸入?yún)?shù)和過濾器,構(gòu)建where子句的條件表達(dá)式為:relationcolumnnameoperationvalue/paraname;式中,用relation屬性值連接條件表達(dá)式;columnname值為過濾器參數(shù)名稱對應(yīng)的數(shù)據(jù)庫字段列名;operation值對應(yīng)相應(yīng)的操作符,如果value屬性值不是null,直接獲取value屬性值;如果value屬性值為null,則從httprequest對象中獲得value屬性值;針對多表刪除:a1、將多張關(guān)系數(shù)據(jù)表使用左連接構(gòu)建from子句;a2、針對每張關(guān)系數(shù)據(jù)庫表,根據(jù)from子句和where子句創(chuàng)建相應(yīng)的臨時表;所述where子句根據(jù)請求方法的輸入?yún)?shù)和過濾器創(chuàng)建,where子句的條件表達(dá)式為:relationcolumnnameoperationvalue/paraname;式中,用relation屬性值連接條件表達(dá)式;columnname值為過濾器參數(shù)名稱對應(yīng)的數(shù)據(jù)庫字段列名;operation值對應(yīng)相應(yīng)的操作符,如果value屬性值不是null,直接獲取value屬性值;如果value屬性值為null,則從httprequest對象中獲得value屬性值;a3、為每張關(guān)系數(shù)據(jù)庫表創(chuàng)建刪除語句,除了要刪除的關(guān)系數(shù)據(jù)表,其余關(guān)系數(shù)據(jù)庫表的刪除語句中的from子句和where子句中的表名替換為臨時表表名,每條刪除語句執(zhí)行完成后,刪除臨時表。作為優(yōu)選,數(shù)據(jù)接口對象的請求方法為post時,生成數(shù)據(jù)庫操作sql語句為insert語句,具體生成方法如下:獲取數(shù)據(jù)接口對象的請求方法的邏輯關(guān)系和輸入?yún)?shù),依據(jù)邏輯關(guān)系中的數(shù)據(jù)庫表名和輸入?yún)?shù)代表的字段名稱構(gòu)建into部分,根據(jù)輸入?yún)?shù)字段對應(yīng)的參數(shù)名稱在http的請求消息中獲取參數(shù)值構(gòu)建values部分字段值。與現(xiàn)有技術(shù)相比,本發(fā)明的有益技術(shù)效果為:(1)通過openehr模板創(chuàng)建數(shù)據(jù)接口對象,根據(jù)數(shù)據(jù)接口對象來動態(tài)生成數(shù)據(jù)接口,當(dāng)有新的數(shù)據(jù)接口需求時,不再需要第三方臨床數(shù)據(jù)中心維護(hù)人員進(jìn)行代碼實(shí)現(xiàn),只需要制定符合自己需求的數(shù)據(jù)接口對象即可,可以節(jié)省大量人力時間;(2)當(dāng)醫(yī)學(xué)知識變化時,導(dǎo)致新的模板產(chǎn)生,本方法可以針對新模板自動生成相應(yīng)的數(shù)據(jù)接口對象,實(shí)現(xiàn)系統(tǒng)動態(tài)適應(yīng)知識變化。附圖說明圖1為本發(fā)明數(shù)據(jù)接口對象的結(jié)構(gòu)示意圖;圖2為關(guān)系數(shù)據(jù)表的邏輯關(guān)系示意圖;圖3為請求方法為get時生成select語句的流程示意圖;圖4為請求方法為put時生成update語句的流程示意圖;圖5為請求方法為delete時生成delete語句的流程示意圖;圖6為本發(fā)明中openehr模板到數(shù)據(jù)接口對象轉(zhuǎn)換方法的流程圖;圖7為本發(fā)明解析openehr模板并建立模板對象的流程示意圖;圖8為本發(fā)明數(shù)據(jù)接口對象自動創(chuàng)建的詳細(xì)流程圖;圖9為用戶根據(jù)需求自定義數(shù)據(jù)接口對象創(chuàng)建的詳細(xì)流程圖;圖10為本發(fā)明中數(shù)據(jù)接口對象動態(tài)生成數(shù)據(jù)接口的流程圖;圖11為本發(fā)明基于openehr模板的數(shù)據(jù)接口動態(tài)生成方法的流程圖。具體實(shí)施方式下面結(jié)合附圖,對本發(fā)明基于openehr模板的數(shù)據(jù)接口動態(tài)生成方法做詳細(xì)描述。一種基于openehr模板的數(shù)據(jù)接口動態(tài)生成方法,所述數(shù)據(jù)接口是符合rest風(fēng)格的restfulwebapi,主要用于對基于openehr模板生成的關(guān)系型臨床數(shù)據(jù)庫進(jìn)行數(shù)據(jù)訪問,其中openehr模板包括:openehr原型文件、openehr模板文件、以及模板與所生成關(guān)系型數(shù)據(jù)庫的對應(yīng)關(guān)系,數(shù)據(jù)接口具體包括查詢、更新、添加以及刪除操作,如圖11所示,所述動態(tài)生成方法包括以下步驟:(1)解析openehr模板(template)并建立模板對象;(2)根據(jù)步驟(1)所述的模板對象,獲取每個模板屬性對應(yīng)的關(guān)系數(shù)據(jù)庫結(jié)構(gòu)(包括數(shù)據(jù)表及對應(yīng)字段),然后創(chuàng)建數(shù)據(jù)接口對象;(3)解析客戶端調(diào)用數(shù)據(jù)接口而發(fā)起http請求,并建立httprequest對象;(4)根據(jù)步驟(2)的數(shù)據(jù)接口對象和步驟(3)的httprequest對象生成數(shù)據(jù)庫操作sql語句;(5)針對基于openehr模板生成的關(guān)系型臨床數(shù)據(jù)庫執(zhí)行步驟(4)所生成的sql語句得到相應(yīng)的數(shù)據(jù)操作結(jié)果;(6)根據(jù)步驟(5)的數(shù)據(jù)操作結(jié)果構(gòu)建httpresponse對象返回給調(diào)用方。本發(fā)明基于openehr模板的數(shù)據(jù)接口動態(tài)生成方法中,每個數(shù)據(jù)接口對象基于單個模板對象創(chuàng)建,一個openehr模板可以對應(yīng)多張關(guān)系數(shù)據(jù)庫表,因此基于單個模板可以有多個數(shù)據(jù)接口對象,表達(dá)了臨床應(yīng)用對臨床數(shù)據(jù)存儲中心的數(shù)據(jù)需求,每當(dāng)數(shù)據(jù)需求發(fā)生變化,只需要根據(jù)openehr模板創(chuàng)建符合該數(shù)據(jù)需求的數(shù)據(jù)接口對象即可,且restfulwebapi能夠適用于多種平臺,是輕量級架構(gòu),易于使用。所述步驟(1)解析openehr模板并建立模板對象包括:解析模板名;解析模板所約束的openehr原型,包括基本類型屬性的屬性名、屬性路徑;解析模板集合類型屬性的屬性名、路徑以及該集合下的所有屬性;解析archetypeslot類型屬性的屬性名、路徑、目標(biāo)原型以及該屬性下的所有屬性。所述步驟(2)創(chuàng)建數(shù)據(jù)接口對象包括:每個數(shù)據(jù)接口對象主要包括資源描述信息、請求方法信息,其中每個請求方法信息中包含輸入?yún)?shù)、輸出參數(shù)、過濾器以及邏輯關(guān)系等屬性,其中過濾器指的是篩選條件,邏輯關(guān)系指的是數(shù)據(jù)庫中表與表之間的關(guān)系。具體結(jié)構(gòu)如圖1所示,每個資源描述信息可以唯一確定一個數(shù)據(jù)接口對象,每個模板屬性獲得的關(guān)系型數(shù)據(jù)庫結(jié)構(gòu)信息主要包括該屬性對應(yīng)的數(shù)據(jù)庫字段名,以及該字段的數(shù)據(jù)類型、是否為主鍵、是否為外鍵、是否允許為空、數(shù)據(jù)庫表名;如果該模板對應(yīng)多張數(shù)據(jù)庫表結(jié)構(gòu),可以獲得該模板對應(yīng)的表與表之間的關(guān)系。獲取一個openehr模板對應(yīng)的關(guān)系數(shù)據(jù)庫結(jié)構(gòu),一個模板可能對應(yīng)多張關(guān)系數(shù)據(jù)庫表,以每張關(guān)系數(shù)據(jù)庫表為資源來創(chuàng)建標(biāo)準(zhǔn)數(shù)據(jù)接口對象,每個數(shù)據(jù)接口對象的資源描述為“模板/版本/數(shù)據(jù)表名”,請求方法為get、put、delete以及post,其中:get方法的輸入?yún)?shù)是該表的主鍵字段,輸出參數(shù)是該表的所有字段,過濾器是該表的主鍵值等于,處理邏輯是單張數(shù)據(jù)庫表結(jié)構(gòu);put方法的輸入?yún)?shù)為所有字段,過濾器為主鍵值等于,輸出參數(shù)為執(zhí)行結(jié)果,處理邏輯是單張數(shù)據(jù)庫表結(jié)構(gòu);delete方法的輸入?yún)?shù)為主鍵字段,過濾器為主鍵值等于,輸出參數(shù)為執(zhí)行結(jié)果,處理邏輯是單張數(shù)據(jù)庫表結(jié)構(gòu);post方法的輸入?yún)?shù)為所有字段,過濾器為空,處理邏輯是單張數(shù)據(jù)庫表結(jié)構(gòu);如果該數(shù)據(jù)庫表有外鍵字段,新建一個數(shù)據(jù)接口對象,其資源描述為“模板/版本/數(shù)據(jù)表名/referenceid”,請求方法為get,該請求方法的輸入?yún)?shù)是該表的外鍵字段,輸出參數(shù)是該表的所有字段,過濾器是該表的外鍵值等于,處理邏輯是單張數(shù)據(jù)庫表結(jié)構(gòu)。每個參數(shù)的參數(shù)名是將數(shù)據(jù)庫字段名稱按照駝峰命名法進(jìn)行構(gòu)建。當(dāng)臨床應(yīng)用有其特定數(shù)據(jù)需求時,基于單個openehr模板對象來創(chuàng)建符合自己需求的數(shù)據(jù)接口對象:(1)該數(shù)據(jù)接口對象的資源描述為“模板/版本/自定義名稱”,用戶根據(jù)自己需要為資源描述添加自定義的名稱;(2)請求方法由用戶指定,可以是get、put、delete方法的任意組合,基于模板屬性,為每個請求方法定義輸入?yún)?shù)、輸出參數(shù);(3)每個請求方法的過濾器屬性在其輸入?yún)?shù)的基礎(chǔ)上進(jìn)行定義賦值,用戶可以制定多個過濾器,創(chuàng)建該數(shù)據(jù)接口對象的過濾器屬性,根據(jù)自己需要設(shè)置過濾器的關(guān)系(relation)為“and”或者“or”,具體的操作設(shè)置為“=”、“>”、“<”、“<=”、“>=”、“in”、“l(fā)ike”、“!=”中的任一操作符;(4)根據(jù)用戶選擇的模板屬性所對應(yīng)的關(guān)系數(shù)據(jù)庫結(jié)構(gòu)來創(chuàng)建該數(shù)據(jù)接口的邏輯關(guān)系,如果所選擇的模板屬性對應(yīng)的數(shù)據(jù)庫字段在同一張數(shù)據(jù)庫表結(jié)構(gòu)中,邏輯關(guān)系設(shè)置為單表;如果所選擇的模板屬性對應(yīng)的數(shù)據(jù)庫字段不在同一張數(shù)據(jù)庫表結(jié)構(gòu)中,對于所涉及的所有數(shù)據(jù)庫表名,每兩張表之間的關(guān)系對應(yīng)一個邏輯關(guān)系,具體為兩張表的主外鍵關(guān)系以及兩張表是不是為一對多的關(guān)系。(5)該數(shù)據(jù)接口對象的每個參數(shù)的參數(shù)名是將數(shù)據(jù)庫字段名稱按照駝峰命名法進(jìn)行構(gòu)建。如果指定輸入?yún)?shù)是區(qū)間參數(shù),則參數(shù)名會在數(shù)據(jù)字段名的基礎(chǔ)上添加“l(fā)owerlimit“或者”upperlimit“;(6)如果請求方法為get方法,用戶可以指定按照某個輸出參數(shù)將輸出結(jié)果升序或者降序進(jìn)行排序。所述步驟(3)解析http請求包括:讀取用戶發(fā)出的數(shù)據(jù)接口請求,包括請求的uri、請求方法以及請求參數(shù)等數(shù)據(jù),構(gòu)建一個httprequest對象。所述步驟(4)生成數(shù)據(jù)庫操作sql語句包括:解析httprequest對象,獲取請求地址uri,根據(jù)uri與數(shù)據(jù)接口對象的資源描述匹配獲取所要執(zhí)行的數(shù)據(jù)接口對象,根據(jù)httprequest對象的請求方式來定位數(shù)據(jù)接口對象的請求方法,解析該請求方法的輸入?yún)?shù)、輸出參數(shù)、過濾器以及邏輯關(guān)系等,根據(jù)httprequest的輸入?yún)?shù)值和數(shù)據(jù)接口對象該請求方式屬性值生成數(shù)據(jù)庫操作表sql語句,所述數(shù)據(jù)庫表操作sql語句為select、insert、update或delete語句。其中請求方法為get對應(yīng)select語句,具體生成方法如圖3所示:獲得數(shù)據(jù)接口對象,按照邏輯關(guān)系情況來判斷要操作的表關(guān)系結(jié)構(gòu),可分為單表查詢和多表查詢,其中多表查詢又分為多表級聯(lián)查詢和多表非級聯(lián)查詢。首先根據(jù)數(shù)據(jù)接口對象中邏輯關(guān)系個數(shù)進(jìn)行判斷,如果關(guān)系個數(shù)為1個,判斷是否為單表,如果是單表,則為單表查詢。如果不是單表,則兩張表的關(guān)系為圖2中所示的連接1,即a表與b表有主外鍵關(guān)系,將兩張表用leftjoin連接為一個關(guān)系,構(gòu)建from子句。而邏輯關(guān)系個數(shù)為多個的時候需要對邏輯關(guān)系進(jìn)行判斷,如果是圖2中連接2,a表與b表存在著主外鍵關(guān)系,b表與c表存在著主外鍵關(guān)系,若a表與c表也存在著主外鍵關(guān)系,但是對于a表、b表、c表的連接沒有實(shí)際意義,因此在進(jìn)行連接時將該邏輯關(guān)系進(jìn)行刪除。圖2中的連接1和連接2屬于多表級聯(lián)查詢。如果邏輯關(guān)系如圖2中的連接3,表示a表與b表、a表與c表是主外鍵關(guān)系,且是一對多的,但是b表與c表沒有關(guān)系,此時a表與b表的邏輯關(guān)系和a表與c表的邏輯關(guān)系是并列的,a表、b表、c表不能構(gòu)成一個關(guān)系,因此將a表與c表的邏輯關(guān)系重新構(gòu)建一個sql語句,圖2中的連接3和連接4屬于多表非級聯(lián)查詢。具體的sql語句拼接算法分別如下:(1)單表查詢:查詢目標(biāo)是單張表,即數(shù)接口信息get請求方式的“issingle”屬性為true。獲取該數(shù)據(jù)接口get方法的輸出參數(shù),根據(jù)“columnname”與“paraname”構(gòu)成目標(biāo)列表達(dá)式,目標(biāo)表達(dá)式的形式為如表1所示:表1columnnameasparaname目標(biāo)表達(dá)式之間用“,”隔開,如果“orderby”屬性不是null,取“orderby”的屬性值拼接sql語句中的排序要求,如表2所示:表2columnnamedesc/asc排序要求之間用“,”隔開。獲取數(shù)據(jù)接口get請求方式中的邏輯關(guān)系,只獲取表名即可。獲取數(shù)據(jù)接口get請求方式中的輸入?yún)?shù)和過濾器,構(gòu)建where子句的條件表達(dá)式如表3所示:表3relationcolumnnameoperationvalue/paraname用“relation”屬性值連接條件表達(dá)式,“columnname”值是過濾器參數(shù)名稱對應(yīng)的數(shù)據(jù)庫字段列名,“operation”值對應(yīng)相應(yīng)的操作符,如果“value”屬性值不是null,直接獲取“value”屬性值,如果為null,則從request對象中獲得該參數(shù)的值。from子句為該數(shù)據(jù)庫表名。(2)多表級聯(lián)查詢:查詢目標(biāo)涉及多張表,且這些表之間的關(guān)系是級聯(lián)的,如圖2中的連接2,可以看到a與b、b與c有一對多的主外鍵關(guān)系,a表與c表或者有主外鍵關(guān)系,或者無直接關(guān)系,要對a、b、c三張表進(jìn)行級聯(lián)查詢,首先根據(jù)該請求方式的輸出參數(shù)來獲取目標(biāo)表達(dá)式如表4所示:表4tablename.columnnameasparaname目標(biāo)表達(dá)式之間用“,”隔開,如果“orderby”屬性不是null,取“orderby”的屬性值拼接sql語句中的排序要求如表5所示:表5tablename.columnnamedesc/asc排序要求之間用“,”隔開。獲取api文件中的邏輯關(guān)系,將表名按照級聯(lián)關(guān)系進(jìn)行排序,(若a表與c表的也存在主外鍵關(guān)系,可以看到在三張表進(jìn)行連接是無關(guān)的,因此可以直接去掉)使用左連接構(gòu)建from子句如表6所示:表6aleftjoinbona.column=b.columnleftjoinconb.column2=c.column2按照表名序列添加“l(fā)eftjoin”;獲取數(shù)據(jù)接口對象get方法中的輸入?yún)?shù)和過濾器,構(gòu)建條件表達(dá)式如表7所示:表7relationtablename.columnnameoperationvalue/paraname用“relation”屬性值連接條件表達(dá)式,“columnname”值是過濾器參數(shù)名稱對應(yīng)的數(shù)據(jù)庫字段列名,“operation”值對應(yīng)相應(yīng)的操作符,如果“value”屬性值不是null,直接獲取“value”屬性值,如果為null,則從request對象中獲得該參數(shù)的值。(3)多表非級聯(lián)查詢:查詢目標(biāo)涉及多張表,且這些表之間的關(guān)系不是級聯(lián)的,如有三張表a,b,c,三張表級聯(lián)關(guān)系如圖2中的連接3,可見a與b、a與c形成一對多的關(guān)系,且b與c是沒有關(guān)聯(lián)的。按照各自的級聯(lián)關(guān)系拆分成多條級聯(lián)查詢的sql語句,a,b,c三表的查詢構(gòu)建成兩條sql語句,首先是根據(jù)數(shù)據(jù)接口對象a,b兩表關(guān)系拼接from子句如表8所示:表8aleftjoinbona.column1=b.column1在數(shù)據(jù)接口對象get請求方式中,篩選a表、b表的輸入?yún)?shù)、輸出參數(shù)以及過濾器,按照級聯(lián)查詢拼接sql語句,按照同樣的方式拼接a、c兩表的查詢語句。請求方法為put對應(yīng)update語句,具體生成方法如圖4所示:按照邏輯關(guān)系情況來判斷要操作的表關(guān)系結(jié)構(gòu),可分為單表更新和多表更新,生成方法分別為:(1)單表更新:更新操作的對象為單張數(shù)據(jù)庫表,即數(shù)據(jù)接口文件put請求方式中邏輯關(guān)系的“issingle”為true,根據(jù)輸入?yún)?shù)的“columnname”以及“paraname”來確定set子句,列名為“columnname”的屬性值,表達(dá)式為從request對象中獲取到的相應(yīng)“paraname”的值;根據(jù)api文件中的輸入?yún)?shù)與過濾器的屬性來拼接where條件子句,與get方法中的單表查詢的條件子句采取一樣的拼接算法。(2)多表更新:當(dāng)要更新的數(shù)據(jù)項涉及多張表,需要多表聯(lián)合更新,多表聯(lián)合更新的語法如表9所示:表9采用如get方法的多表查詢關(guān)系拼接一樣,根據(jù)圖2中的連接情況進(jìn)行關(guān)系連接,確定from子句,但是update語句一次更新只能更新一張表的內(nèi)容,因此更新多表需要多條update語句來完成,這些update語句的列名由輸入?yún)?shù)的“tablename”和“columnname”屬性來確定,即“tablename.columnname”,表達(dá)式為相應(yīng)的paraname值,where條件子句的拼接算法與多表查詢的where條件子句一樣。請求方法為delete對應(yīng)delete語句,具體生成方法如圖5所示:按照邏輯關(guān)系情況來判斷要操作的表關(guān)系結(jié)構(gòu),可分為單表刪除和多表刪除,分別生成方法為:(1)單表刪除:刪除的資源是單張數(shù)據(jù)庫表,根據(jù)數(shù)據(jù)接口對象delete請求方法的邏輯關(guān)系“issingle”屬性為true,確定表名,與get方法一樣,根據(jù)delete請求方法的輸入?yún)?shù)與過濾器拼接where子句。(2)多表刪除:當(dāng)刪除的資源涉及到多表時,sqldelete語句的格式如表10所示:表10首先判斷delete請求方式中的邏輯關(guān)系,對于本文提出的四種連接情況,無論是級聯(lián)還是非級聯(lián),都通過“l(fā)eftjoin”將多張表關(guān)系連接成一個關(guān)系,構(gòu)建from子句,然后根據(jù)輸入?yún)?shù)和過濾器拼接where子句。如果依次執(zhí)行delete語句,由于已經(jīng)刪除部分資源,from子句連接將不存在,則其他刪除語句執(zhí)行刪除資源為0,不符合刪除的需求。因此,創(chuàng)建多表刪除的sql語句首先根據(jù)from子句和where子句來創(chuàng)建每張表相應(yīng)的臨時表,from子句與delete語句中的from子句相同,如表11所示:表11每張表的臨時表名命名規(guī)則是在每張表名的后面添加“temp”,然后按照多表聯(lián)合刪除的格式為每張數(shù)據(jù)庫表創(chuàng)建刪除語句,每條刪除語句的from子句和where子句的表名,除了要刪除的表之外,其他的數(shù)據(jù)庫表的表名全部替換為相應(yīng)的臨時表名(#tablenametemp),每張表刪除語句執(zhí)行完成后,將創(chuàng)建的臨時表刪除,刪除臨時表的sql語句格式為如表12所示:表12droptable#臨時表名假設(shè)在數(shù)據(jù)接口對象的delete請求方式中兩張數(shù)據(jù)庫表a、b的關(guān)系為一對多的主外鍵關(guān)系,主鍵和外鍵字段名稱都是“acolumn1”,如圖2的連接1,而輸入?yún)?shù)為a表的字段“acolumn”和b表的“bcolumn2”字段,他們分別是各自表的主鍵字段,并且同時作為了delete的過濾條件,http請求消息中參數(shù)acolumn1的值為“1”,bcolumn2的值為“b2”,根據(jù)上述數(shù)據(jù)接口對象得到的sqldelete語句組如表13所示:表13請求方法為post對應(yīng)insert語句,具體生成方法為:獲取數(shù)據(jù)接口對象該請求方法中的邏輯關(guān)系和輸入?yún)?shù),將邏輯關(guān)系中的數(shù)據(jù)庫表名和輸入?yún)?shù)該表的字段名稱(即“columnname”),構(gòu)建into部分,根據(jù)該字段對應(yīng)的參數(shù)名稱(即“paraname”)在http的請求消息中獲取參數(shù)值構(gòu)建values部分字段值。通過jdbc執(zhí)行構(gòu)建的sql語句,如果put和delete方法涉及多表操作,將生成的多條sql語句在一個數(shù)據(jù)庫事務(wù)中執(zhí)行,將執(zhí)行結(jié)果以json格式返回。基于執(zhí)行結(jié)果構(gòu)建一個httpresponse對象返回給用戶。圖6為本發(fā)明中openehr模板到數(shù)據(jù)接口對象轉(zhuǎn)換方法的流程圖,其中,步驟s601為解析openehr模板并建立模板對象,圖7展示詳細(xì)流程為:s701,讀取openehr模板文件,s702,解析模板所約束的原型名;s703,根據(jù)原型名獲取原型文件,解析原型;s704,根據(jù)模板文件對原型的約束解析原型文件;s705,判斷其屬性是否在模板文件中進(jìn)行了約束,如果約束出現(xiàn)次數(shù)max=0,則s706,將原型中該屬性隱藏不再使用,如果未添加約束,則s707,解析屬性的路徑值,s708解析屬性名。圖6中的步驟s602是獲取根據(jù)openehr模板對象生成的臨床數(shù)據(jù)存儲中心的關(guān)系型臨床數(shù)據(jù)庫結(jié)構(gòu)。圖6中的步驟s603是按照一定的規(guī)則自動生成該模板的數(shù)據(jù)接口對象,圖8為數(shù)據(jù)接口對象自動創(chuàng)建的詳細(xì)流程:s802根據(jù)模板和模板對應(yīng)的關(guān)系型臨床數(shù)據(jù)庫結(jié)構(gòu)創(chuàng)建數(shù)據(jù)接口對象,首先每個關(guān)系數(shù)據(jù)庫表對應(yīng)一個數(shù)據(jù)接口對象,其uri為“/模板名/版本/數(shù)據(jù)庫表名”。s803為每個關(guān)系數(shù)據(jù)庫表創(chuàng)建了get方法、put方法、delete方法、post方法,分別為針對該表的查詢、更新、刪除以及添加操作,對于每個數(shù)據(jù)庫表字段,如果字段是主鍵,則依次進(jìn)行s805、s806、s807,具體為:s805,創(chuàng)建get方法、put方法、post方法、delete方法的輸入?yún)?shù),參數(shù)名為字段名參考駝峰命名法,將主鍵字段名首字母由大寫轉(zhuǎn)換為小寫,即圖1中的“paraname”屬性,將該openehr模板對象屬性名作為領(lǐng)域概念名即圖1的“concertionattname”屬性,路徑值作為領(lǐng)域概念路徑,即圖1的“conceptionattribute”屬性,將字段數(shù)據(jù)類型作為參數(shù)數(shù)據(jù)類型,即圖1中的“datatype”屬性,將表名作為該參數(shù)的表名,即圖1中的“tablename”屬性,將字段名作為該參數(shù)的字段名,即圖1的“columnname”屬性,將是否為主鍵值作為參數(shù)的是否為主鍵屬性值,即圖1中的“iskey”屬性,將是否外鍵作為參數(shù)的是否為外鍵屬性值,即圖1中的“islink”屬性,將是否允許為空作為參數(shù)的是否允許為空屬性值,即圖1中的“isnull”屬性。s806,創(chuàng)建get方法、put方法、delete方法的過濾器,參數(shù)名是以主鍵作為輸入?yún)?shù)的參數(shù)名,操作為等于,即圖1中的“operation”屬性,值為該參數(shù)變量的值,即圖1中的“value”屬性,設(shè)為空,過濾器之間的關(guān)系為and,即圖1中的“operation”屬性;s807,根據(jù)該主鍵字段創(chuàng)建get方法的輸出參數(shù),參數(shù)對象格式與輸入?yún)?shù)一樣。如果字段是外鍵,s811,判斷是否已經(jīng)創(chuàng)建該數(shù)據(jù)庫表的外鍵數(shù)據(jù)接口對象,如果沒有,s812,創(chuàng)建新的數(shù)據(jù)接口對象,uri為“/模板名/版本/數(shù)據(jù)庫表名/referenceid”,s814,該數(shù)據(jù)接口的請求方法為get,如果該表的數(shù)據(jù)庫字段為外鍵,s816,根據(jù)外鍵字段創(chuàng)建該請求方法的輸入?yún)?shù),s817,創(chuàng)建該請求方法的過濾器,s818,創(chuàng)建該請求方法的輸出參數(shù)。如果表的字段既不是主鍵字段也不是外鍵字段,則s809,根據(jù)該字段創(chuàng)建put方法和post方法的輸入?yún)?shù),s810,創(chuàng)建get方法的輸出參數(shù);而數(shù)據(jù)接口對象以單張數(shù)據(jù)表為資源,因此每個數(shù)據(jù)接口對象的邏輯關(guān)系為單表,即圖1中的“issingle”為“true”;每個數(shù)據(jù)接口對象的初始版本為1。圖6中的步驟s604是根據(jù)臨床特定數(shù)據(jù)需求創(chuàng)建數(shù)據(jù)接口對象,圖9為用戶根據(jù)需求自定義數(shù)據(jù)接口對象創(chuàng)建的詳細(xì)流程:s902,用戶根據(jù)自己的數(shù)據(jù)需求選擇openehr模板進(jìn)行編輯符合自己需求的數(shù)據(jù)接口對象,獲取到模板對象以及模板對應(yīng)的關(guān)系數(shù)據(jù)庫結(jié)構(gòu),s903,創(chuàng)建數(shù)據(jù)接口對象資源地址,其uri為“/模板名/版本/自定義名稱”,s904,用戶根據(jù)自己數(shù)據(jù)操作需求制定數(shù)據(jù)接口對象請求方法,可以是get方法、put方法、以及delete方法,如果是get方法,s906,用戶根據(jù)模板對象屬性創(chuàng)建請求方法的輸入?yún)?shù),根據(jù)該模板對象的屬性、路徑值以及該屬性對應(yīng)的關(guān)系數(shù)據(jù)庫字段結(jié)構(gòu)為圖1中的輸入?yún)?shù)屬性進(jìn)行賦值,s907,根據(jù)模板對象屬性來創(chuàng)建該方法的輸出參數(shù),根據(jù)該模板對象的屬性、路徑值以及該屬性對應(yīng)的關(guān)系數(shù)據(jù)庫字段結(jié)構(gòu)為圖1中的輸出參數(shù)屬性進(jìn)行賦值,輸入?yún)?shù)和輸出參數(shù)屬性的創(chuàng)建方法與步驟s603中輸入?yún)?shù)、輸出參數(shù)創(chuàng)建方法一致;s908是在該請求方法的輸入?yún)?shù)中進(jìn)行過濾器的編輯,將輸入?yún)?shù)的參數(shù)名作為過濾器的參數(shù)名,選擇操作符“=”、“>”、“<”、“<=”、“>=”、“in”、“l(fā)ike”、“?。健钡囊粋€操作符作為過濾器的操作符,即圖1中的“operation”屬性,值可以為具體值作為篩選條件,也可以為空,表示參數(shù)值作為具體的篩選條件,選擇“and”或者“or”作為過濾器間的關(guān)系,即圖1中的“relation”屬性;s909在該請求方法的輸出參數(shù)上制定查詢結(jié)果的排序方式,可以為“asc”或者“desc”,分別表示輸出結(jié)果按照該輸出參數(shù)升序或者降序排序,即圖1中的”orderby“屬性;如果是put方法,s911與s906采用同樣的方法來創(chuàng)建put方法的輸入?yún)?shù),步驟s912與s908采用一樣的方法在輸入?yún)?shù)上指定put方法的過濾器;如果是delete方法,同put方法一樣為delete方法來創(chuàng)建輸入?yún)?shù)和過濾器。圖10為本發(fā)明中數(shù)據(jù)接口對象動態(tài)生成數(shù)據(jù)接口的流程圖,本發(fā)明中進(jìn)行動態(tài)數(shù)據(jù)接口的生成主要是基于servlet來執(zhí)行,用戶發(fā)出數(shù)據(jù)接口調(diào)用的http請求,步驟s1002是一個運(yùn)行的servlet程序,獲取到用戶發(fā)送的http請求,構(gòu)建一個httprequest對象,步驟s1003根據(jù)httprequest對象,獲取發(fā)出的http請求的地址,獲取資源描述地址uri和請求方法,根據(jù)uri和請求方法來獲取數(shù)據(jù)接口對象內(nèi)容,根據(jù)數(shù)據(jù)接口對象內(nèi)容和http請求的輸入?yún)?shù)來構(gòu)建相應(yīng)的sql語句,步驟s1004使用jdbc來執(zhí)行所生成的sql語句,并獲得執(zhí)行結(jié)果,步驟s1005按照servlet構(gòu)建httpresponse對象方法將數(shù)據(jù)操作結(jié)果構(gòu)建一個httpresponse對象返回給用戶。表14是用戶發(fā)送的一個http請求:表14servlet根據(jù)http請求構(gòu)建響應(yīng)的httprequest對象,可以看到該請求的uri為:/apibyopenehr/instruction.request-lab_test/v1/getlabtestbypid;其中“apibyopenehr”是servlet程序名稱,“/instruction.request-lab_test/v1/getlabtest-bypid”是數(shù)據(jù)接口對象的資源描述地址,“patientidentifier_id=00552846”是查詢字符串,請求方法是get,因此根據(jù)“/instruction.request-lab_test/v1/getlabtestbypid”和get請求方法可以獲取數(shù)據(jù)接口對象,get方法對應(yīng)于數(shù)據(jù)查詢操作,根據(jù)輸出參數(shù)創(chuàng)建查詢目標(biāo)列,根據(jù)邏輯關(guān)系創(chuàng)建from子句,根據(jù)輸入?yún)?shù)、過濾器以及http請求的輸入?yún)?shù)“00552846”來創(chuàng)建條件表達(dá)式。步驟s1005連接到openehr模板生成的數(shù)據(jù)庫服務(wù)器,將sql語句執(zhí)行,執(zhí)行結(jié)果;步驟s1006根據(jù)數(shù)據(jù)結(jié)果構(gòu)建一個httpresponse對象,以json格式返還給用戶。當(dāng)前第1頁12當(dāng)前第1頁12
當(dāng)前第1頁1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1