黎勇 易松 鄧忠

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