黎勇 易松 鄧忠
摘要:本文圍繞新生兒聽力篩查登記系統(tǒng)的技術(shù)實(shí)現(xiàn),著重從新生兒不同報(bào)告單資料數(shù)據(jù)的保存及展示方面來闡述技術(shù)核心實(shí)現(xiàn)過程,針對不同的基層醫(yī)院需要存儲(chǔ)的新生兒數(shù)據(jù)格式不一致問題,在關(guān)系數(shù)據(jù)庫中采用Key-Value形式來進(jìn)行存儲(chǔ),而數(shù)據(jù)的查詢展示則利用數(shù)據(jù)庫編程技術(shù)或JAVA函數(shù)式編程技術(shù)實(shí)現(xiàn)。
關(guān)鍵詞:Key-Value數(shù)據(jù)存儲(chǔ);數(shù)據(jù)庫編程;JAVA函數(shù)式編程
中圖分類號:TP311.13;R764.04? ? ? ? ? ? ? ? ? ? ? ? ? ?文獻(xiàn)標(biāo)識(shí)碼:B? ? ? ? ? ? ? ? ? ? ? ? ?DOI:10.3969/j.issn.1006-1959.2019.04.004
文章編號:1006-1959(2019)04-0011-03
Abstract:This paper focuses on the technical realization of the newborn hearing screening registration system, focusing on the technical core implementation process from the preservation and display of different report data of newborns, and the inconsistency of the newborn data format that needs to be stored in different primary hospitals. The relational database uses the Key-Value form for storage, while the data query display is implemented using database programming techniques or JAVA functional programming techniques.
Key words:Key-Value data storage;Database programming;JAVA functional programming
先天性聽力損失是新生兒最常見的出生缺陷之一,1‰~3‰的發(fā)病率居我國五類致殘因素之首[1]。就湖南省郴州地區(qū)而言,新生兒聽力篩查存在如下問題:①手工信息的處理方式不但工作量大、流程復(fù)雜,而且數(shù)據(jù)的收集、整合過程難免錯(cuò)漏、殘缺,針對大量數(shù)據(jù)的線性增長無法做到較好的存儲(chǔ),對數(shù)據(jù)的分析、統(tǒng)計(jì)更加困難。②不同地區(qū),由于各醫(yī)院的信息管理系統(tǒng)相互獨(dú)立,患者資料難以做到實(shí)時(shí)共享,從而造成了重復(fù)檢查,不但加大了患者負(fù)擔(dān),同時(shí)也浪費(fèi)了醫(yī)療有限資源。利用信息化技術(shù)實(shí)現(xiàn)的新生兒聽力篩查登記系統(tǒng),不但解放了勞動(dòng)量,有效的將手工作業(yè)模式轉(zhuǎn)換為信息自動(dòng)化管理模式,同時(shí)也確保了數(shù)據(jù)的準(zhǔn)確性、全面性和時(shí)效性[1]。新生兒聽力篩查登記的實(shí)現(xiàn)其主要技術(shù)難點(diǎn)在于不同基層醫(yī)院數(shù)據(jù)格式的統(tǒng)一存儲(chǔ)、數(shù)據(jù)查詢展示及數(shù)據(jù)的統(tǒng)計(jì)分析。現(xiàn)將具體技術(shù)實(shí)現(xiàn)介紹如下。
1數(shù)據(jù)的存儲(chǔ)
由于基層醫(yī)院使用不同的報(bào)告單,要將報(bào)告單內(nèi)容存儲(chǔ)到關(guān)系數(shù)據(jù)庫的同一個(gè)數(shù)據(jù)實(shí)體表就必須將擁有不同內(nèi)容的登記表單轉(zhuǎn)換為統(tǒng)一格式存儲(chǔ),一種實(shí)現(xiàn)方法是將整個(gè)報(bào)告單轉(zhuǎn)換為JSON格式進(jìn)行存儲(chǔ),若要對數(shù)據(jù)做查詢分析則需要解析存儲(chǔ)的JSON格式數(shù)據(jù)[2]??紤]到系統(tǒng)性能及技術(shù)實(shí)現(xiàn),在數(shù)據(jù)存儲(chǔ)中采用了另一種存儲(chǔ)方式,即在關(guān)系型數(shù)據(jù)庫中采取非表格式的Key-Value鍵值對格式的數(shù)據(jù)存儲(chǔ)方式,將不同表單數(shù)據(jù)轉(zhuǎn)換為Key-Value鍵值對形式的縱向存儲(chǔ)[3]。因此,在數(shù)據(jù)庫中設(shè)計(jì)如表1結(jié)構(gòu)的數(shù)據(jù)表。
在數(shù)據(jù)實(shí)體表的設(shè)計(jì)中,id為表的主鍵,通過采用注解@GeneratedValue的生成策略,并指定策略的strategy屬性為AUTO,自動(dòng)生成最適合底層數(shù)據(jù)庫的主鍵生成策略;templateid為對應(yīng)的報(bào)告單模板ID,即不同基層醫(yī)院所使用的不同報(bào)告單登記模板的后臺(tái)標(biāo)識(shí);field為報(bào)告單登記模板中所用組件的命名,如下拉框男女選擇組件命名為sex等;value則為報(bào)告單重組件對應(yīng)的值;rowid是通過UUID.randomUUID()生成的36位字符型長度的唯一識(shí)別碼,用于標(biāo)識(shí)一個(gè)報(bào)告單的所有值。
2數(shù)據(jù)的展示
數(shù)據(jù)的展示通過使用easyui前臺(tái)框架的datagrid來展示,實(shí)現(xiàn)步驟如下:①第一步:選擇報(bào)告單模板,通過選擇的報(bào)告單模板檢索報(bào)告單的字段配置信息。②第二步:通過
2.1存儲(chǔ)過程實(shí)現(xiàn)? 存儲(chǔ)過程編程主要利用動(dòng)態(tài)SQL的拼裝以及循環(huán)結(jié)構(gòu)[4,5]來實(shí)現(xiàn)數(shù)據(jù)的展示功能,其實(shí)現(xiàn)步驟如下。
第一步:定義存儲(chǔ)過程,并確定傳入、傳出參數(shù)。傳入?yún)?shù)包括了模板id、查詢條件conditions、開始頁數(shù)page、頁大小pagesize;傳出參數(shù)僅包含了符合條件的總數(shù)據(jù)條數(shù)totalcount。
第二步:通過傳入的查詢條件字符conditions參數(shù)(格式:“field;condition;value|field;condition;value|…”),拆分重組為SQL查詢條件語句,結(jié)合傳入的開始頁參數(shù)page及頁大小pagesize篩選出符合條件的指定報(bào)告單模板數(shù)據(jù)。
第三步:利用REPEAT …UNTIL …END REPEAT循環(huán)讀取所選報(bào)告單模板字段配置,利用數(shù)據(jù)庫系統(tǒng)函數(shù)CONCAT及GROUP_CONCAT生成動(dòng)態(tài)查詢語句,完成數(shù)據(jù)的行列轉(zhuǎn)換并輸出顯示。CONCAT函數(shù)主要完成字符串的拼接,GROUP_CONCAT函數(shù)主要作用是完成行合并。其實(shí)現(xiàn)代碼如下所示:
第四步:利用Hibernate的createStoredProcedureCall方法調(diào)用指定名稱的存儲(chǔ)過程,通過procedureCall.getOutputs().getCurrent()獲取ResultSetOutput結(jié)果,最終通過ResultSetOutput獲取到datagird的list數(shù)據(jù)列表,OUT模式的totalcount參數(shù)則用于分頁,并展示到前臺(tái)界面。
采用存儲(chǔ)過程實(shí)現(xiàn)的數(shù)據(jù)展示簡化了系統(tǒng)的Java編程,意味著部分業(yè)務(wù)邏輯不再應(yīng)用程序中處理,同時(shí)所有的記錄檢索等操作都是通過存儲(chǔ)過程實(shí)現(xiàn),因此采用存儲(chǔ)過程編程技術(shù)的實(shí)現(xiàn)減少了網(wǎng)絡(luò)交互,而由于不同數(shù)據(jù)庫的內(nèi)部編程語法不太一致,導(dǎo)致了系統(tǒng)不具備可移植性。
2.2 JAVA編程利用JAVA8的新特性實(shí)現(xiàn)? JAVA函數(shù)式編程主要利用對核心類庫的集合類的API和新引入的流(Stream)[6]的改進(jìn)來實(shí)現(xiàn)數(shù)據(jù)的展示功能,其實(shí)現(xiàn)主要步驟如下:
第一步:通過Service層接口調(diào)用自定義函數(shù)getDataByTemplateId(String id),該函數(shù)的主要功能是獲取傳入的指定登記模板的ID來獲取數(shù)據(jù)存儲(chǔ)實(shí)體表中符合條件的所有記錄,其返回結(jié)果為List列表對象。
第二步:通過Stream API處理數(shù)據(jù)集合,使用collect來將一個(gè)數(shù)據(jù)流中的元素進(jìn)行分組,由于在數(shù)據(jù)存儲(chǔ)表中同一報(bào)告單的一次表單提交數(shù)據(jù)是使用的UUID.randomUUID()生成的唯一標(biāo)識(shí),通過collect中的數(shù)據(jù)分組將產(chǎn)生Map
Map
Collectors.groupingBy(Data::getRowid));
在實(shí)現(xiàn)代碼中,應(yīng)用了定義在輔助類Collects中的groupingBy收集器,它通過接收Data實(shí)體的getRowid分類方法,并生成Map結(jié)果,其中g(shù)etRowid方法返回的結(jié)果將作為Map的Key,符合條件的分類lists集合記錄將作為Map的Value。
第三步:申明空的list對象List
第四步:申明迭代器Iterator,用于循環(huán)讀取datamap中的內(nèi)容,申明語句如下:
Iterator
第五步:使用while循環(huán)讀取迭代器中的內(nèi)容,并將一組list內(nèi)容通過forEach循環(huán)讀取并put到新申明的map對象中,最后將最終結(jié)果使用add加入到第三步中的datalist,到此完成了同一報(bào)告單的數(shù)據(jù)分組及數(shù)據(jù)的行列轉(zhuǎn)換展示,java代碼如下所示:
3總結(jié)
利用Key-Value鍵值對格式有效的解決了不同報(bào)告單內(nèi)容字段不一致而無法存儲(chǔ)在關(guān)系數(shù)據(jù)庫的同一數(shù)據(jù)實(shí)體表中的存儲(chǔ)問題,同時(shí)Key-Value鍵值對格式的存儲(chǔ)還為數(shù)據(jù)的查詢及統(tǒng)計(jì)分析提供了便利。在數(shù)據(jù)的展示實(shí)現(xiàn)過程中,既可利用數(shù)據(jù)庫的存儲(chǔ)過程編程技術(shù)實(shí)現(xiàn)又可利用JAVA8的函數(shù)式編程實(shí)現(xiàn)。存儲(chǔ)過程的實(shí)現(xiàn)簡化了JAVA編碼,利用傳入的conditions參數(shù),先檢索符合條件的rowid值,通過rowid值快速查詢有效的數(shù)據(jù),并對數(shù)據(jù)執(zhí)行行列轉(zhuǎn)換及行合并的操作,利用存儲(chǔ)過程的實(shí)現(xiàn)增加了數(shù)據(jù)庫服務(wù)端的處理成本,大量邏輯業(yè)務(wù)的處理約束了軟件的架構(gòu)。利用JAVA8的新特性實(shí)現(xiàn)數(shù)據(jù)展示僅需數(shù)據(jù)庫實(shí)體表,無需實(shí)現(xiàn)自定義函數(shù)及存儲(chǔ)過程,同時(shí)在系統(tǒng)發(fā)布過程中可以做到多web容器部署,從而實(shí)現(xiàn)負(fù)載均衡。
參考文獻(xiàn):
[1]黎曼儂,王瓊,黨峰博,等.新生兒疾病篩查信息系統(tǒng)管理軟件應(yīng)用的效果分析[J].中國醫(yī)學(xué)工程,2014(1):186-188.
[2]徐寶磊,羅江,潘剛.基于JSON的數(shù)據(jù)交換技術(shù)應(yīng)用研究[J].軟件導(dǎo)刊,2017,10(16):173-175.
[3]蔣付彬,王華軍.NoSQL數(shù)據(jù)庫的應(yīng)用及選型研究[J].信息與電腦(理論版),2016(3):141-142.
[4]王志剛,江友華.MySQL高效編程[M].北京:人民郵電出版社,2012:116-128.
[5]梁敬彬.探討動(dòng)態(tài)SQL擴(kuò)展的應(yīng)用[J].福建電腦,2018,34(3):92-94.
[6]Richard Warburton,著.Java8函數(shù)式編程[M].王群鋒,譯.北京:人民郵電出版社,2015:15-31.
[7]宮明.函數(shù)式編程探析[J].電腦編程技巧與維護(hù),2017(3):29-30.
收稿日期:2018-11-12;修回日期:2018-11-22
編輯/楊倩