999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

淺談基于Qt反射機制的對象關系映射框架

2020-10-09 11:13:10童辰蔣超蔣俊銘
科學與信息化 2020年26期

童辰 蔣超 蔣俊銘

摘 要 C++語言不具備高級語言如Java的反射機制,無法在程序運行時獲取類的結構信息,在開發數據庫交互程序時不具備Hibernate、Mybatis等對象關系映射能力。Qt是基于C++語言的工具包,提供QProperty宏獲取類結構信息,本文基于該特性,開發對象關系映射框架,實現數據庫數據到類對象的雙向轉換,支持數據庫的增、刪、改、查操作,支持主流的Oracle和Mysql數據庫,支持緩存操作,提高訪問效率。同時開發配套工具自動生成數據類代碼。

關鍵詞 對象關系映射;Qt;Oracle;Mysql

引言

對象關系映射(Object Relational Mapping,簡稱ORM)模式是一種為了解決面向對象與關系數據庫存在的互不匹配的技術。簡單來說,ORM是通過使用類成員變量和數據庫之間映射的元數據,將程序中的對象自動持久化到關系數據庫中。而C++作為主流且歷史悠久的開發語言,不具備在程序運行時獲取類的結構信息的能力。C++的數據類型如何適配Oracle和Mysql的數據類型。數據庫操作均需要使用Sql語句,程序函數如何轉換為Sql語句。對于頻繁訪問的程序對象如何設計緩存避免訪問數據庫提高效率。類文件通常代碼比較多,如何加快代碼開發速度,這些問題都需要研究討論。

1運行時類結構信息獲取

Qt的類對象在C++的基礎上封裝了類數據結構信息并支持運行時獲取接口。首先需要對其實現原理進行了解[1]。通常C++的編譯過程為預處理->編譯->鏈接->運行,Qt編譯的過程中,有一個moc的過程,即為moc->預處理->編譯->鏈接->運行。在moc過程中,需要識別一些特殊的宏Q_OBJECT、Q_PROPERTY、Q_INVOKABLE,然后根據頭文件生成moc實現文件,實現文件中包含了類數據結構信息并支持運行時獲取接口,獲取接口包括metaObject(),property(),className(),method(),constructor()等。

2程序類型和數據庫類型的轉換

不同數據庫的數據類型定義是有差異的,Oracle和Mysql在數據類型定義上差異較大,如何屏蔽數據庫類型的差異性?可以使用QVariant通用數據類型與數據庫類型進行第一次映射,QVariant類的函數屏蔽了類型操作細節,與QSqldatabase類配合,通過加載不同的數據庫插件屏蔽了數據庫類型差異[2]。

C++常用的數據類型有int、double等,Qt也定義了QString、QDatetime等更為方便實用的類對象,對于int、double、QString、QDatetime等常用類型,QVariant能自動根據數據庫類型進行轉換,但是一些性能或空間限制下,將數據庫時間類型設置為int,則QVariant無法自動轉換。本框架使用Q_CLASSINFO()宏進行映射,比如上述例子,標注類成員為int類型,對應的數據庫類型為時間類型,在生成數據庫sql語句時根據此映射進行轉換。

3類成員變量生成數據庫Sql語句

數據庫支持Sql進行增刪改查,限制數據庫數據可以映射到程序類對象,自然對數據庫的增刪改查也要提升到對程序類對象,需要對增刪改查四個動作分別封裝處理函數。類對象與業務相關所以字段均不一致,而處理函數參數只能是一種類型。有兩種解決方案:①使用模板參數作為函數入參,缺點是代碼實現必須編寫在頭文件中,不利用功能更新升級,調用時需要注明參數類型,代碼冗長。②抽象公共基類,所有類均繼承該類,利用多態特性,將基類作為函數入參,這樣分離了接口和實現,擴展性好。綜合比較選擇方案2。

對數據庫數據的操作包括增刪改查四種,基本語法基本一致,不同數據差異主要在字段不一致,只要保證類成員變量名和數據庫表每一個字段名對應,即可實現數據對象到Sql語句的轉換,包括如下4種情況。增加數據,Insert into 表名字段名 values(字段值)。刪除數據,Delete from 表名 where 主鍵=值。修改數據,update 表名字段名 values(字段值)。查詢,Select 字段名 from 表名 where 條件 order 條件。從上述可見,不同操作差異的地方就是表名、字段名、主鍵、條件,在類定義中只要定義了前三者即可,條件的可變性較大,可在處理函數擴展參數,作為入參輸入。

4程序緩存設計

程序設計中經常出現核心數據頻繁使用,如果每次均從數據庫獲取則延時大影響程序的運行效率,前面對數據庫的操作已經封裝了增刪改查四種函數,則可以在函數實現中緩存數據。當增加數據到數據庫成功同時增加緩存,刪除數據庫成功時刪除緩存,修改數據庫成功時修改緩存,查詢數據庫時同步增加緩存,如此就實現程序使用的每一個數據在緩存中均具備且和數據庫保持狀態一致。當數據量大時,要快速檢索數據,使用Map結構進行存儲,分兩層進行檢索,先按照類型再按照每一條數據的主鍵值進行檢索,從而將檢索效率提高到O(nlgn)時間復雜度級別。

5類代碼文件生成工具

數據類代碼因為包含成員變量的讀寫函數、元數據配置定義、其他配置定義、字段值打印等,代碼量較大,若手寫代碼開發效率低。通過分析多個數據類代碼文件,其差異的地方在于成員變量名、類名、表配置名、主鍵名等,而這些信息均可以從對應的數據庫表拿到,因此所有的信息來源是數據庫表,配合數據類代碼模板即可實現完整的數據類代碼。生成工具提供數據庫表名的輸入框,從數據庫表基礎信息中提取字段名、主鍵等信息,替換代碼模板中的占位符,即可生成數據類代碼。

6結束語

本文研究了Qt運行時類結構信息獲取方法,解決數據庫類型和程序類型映射問題,提出類成員變量生成Sql語句的方案,進一步優化程序緩存設計,研究類代碼文件生成工具,從而實現C++語言下的對象關系映射框架,極大提高了數據庫交互程序的開發效率和穩定性。

參考文獻

[1] Mark S,白建平.Qt高級編程[M].北京:電子工業出版社,2011:171.

[2] 王維波,栗寶鵑,候春望.Qt 5.9 C++ 開發指南[M].北京:人民郵電出版社,2018:213.

主站蜘蛛池模板: 999在线免费视频| 精品伊人久久大香线蕉网站| 黄网站欧美内射| 香蕉eeww99国产在线观看| 色婷婷在线影院| 伊人成人在线| 日韩一区二区三免费高清| 欧美爱爱网| 一区二区在线视频免费观看| 中美日韩在线网免费毛片视频| av一区二区无码在线| 重口调教一区二区视频| 91精品国产自产在线老师啪l| 人妻21p大胆| 国产区人妖精品人妖精品视频| 国产精品成| 不卡无码h在线观看| 伊人丁香五月天久久综合| 香蕉99国内自产自拍视频| 成人精品午夜福利在线播放 | 四虎亚洲国产成人久久精品| 国产美女免费网站| 青青青国产免费线在| 国产精品成人免费视频99| 欧美亚洲另类在线观看| 婷婷六月激情综合一区| 91精品aⅴ无码中文字字幕蜜桃 | 色天天综合| 欧美一级特黄aaaaaa在线看片| 玖玖精品在线| 婷婷久久综合九色综合88| 亚洲永久免费网站| 国产精品亚洲αv天堂无码| 一区二区三区四区日韩| 亚洲无码不卡网| 国产精品香蕉在线| 亚洲成A人V欧美综合天堂| 日本午夜在线视频| 亚洲清纯自偷自拍另类专区| 亚洲精品无码抽插日韩| 国产精品yjizz视频网一二区| 永久天堂网Av| 91成人免费观看| 国产打屁股免费区网站| 国产精品污视频| 热99re99首页精品亚洲五月天| 亚洲精品图区| 一区二区三区国产| 日韩东京热无码人妻| 久久国产亚洲偷自| 中文字幕调教一区二区视频| 亚洲av片在线免费观看| 亚洲天堂首页| 欧美一区二区三区欧美日韩亚洲 | 久久久久久久久18禁秘| 亚洲天堂首页| 国产在线高清一级毛片| 999精品在线视频| 无码高潮喷水在线观看| www中文字幕在线观看| 一本久道热中字伊人| 97国产在线视频| 四虎综合网| 精品国产中文一级毛片在线看| 97在线视频免费观看| 中文字幕久久亚洲一区| 伦精品一区二区三区视频| 亚洲综合一区国产精品| 99国产在线视频| 亚洲精品男人天堂| 欧美色丁香| 国产精品精品视频| AV不卡在线永久免费观看| 亚洲无码视频一区二区三区| 日韩东京热无码人妻| 欧美日韩综合网| 久久精品人人做人人爽| 久久精品亚洲专区| 亚洲人成网站在线观看播放不卡| 热久久这里是精品6免费观看| 国产精品久久自在自2021| 欧美一区二区人人喊爽|