版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第C++設(shè)計(jì)與實(shí)現(xiàn)ORM系統(tǒng)實(shí)例詳解目錄介紹依賴關(guān)系設(shè)計(jì)思路項(xiàng)目進(jìn)度數(shù)據(jù)庫(kù)通用接口實(shí)例構(gòu)造智能查詢方式設(shè)計(jì)單元測(cè)試運(yùn)行方法
介紹
我們通用的ORM,基本模式都是想要脫離數(shù)據(jù)庫(kù)的,幾乎都在編程語(yǔ)言層面建立模型,由程序去與數(shù)據(jù)庫(kù)打交道。雖然脫離了數(shù)據(jù)庫(kù)的具體操作,但我們要建立各種模型文檔,用代碼去寫表之間的關(guān)系等等操作,讓初學(xué)者一時(shí)如墜云霧。我的想法是,將關(guān)系數(shù)據(jù)庫(kù)擁有的完善設(shè)計(jì)工具之優(yōu)勢(shì),來實(shí)現(xiàn)數(shù)據(jù)設(shè)計(jì)以提供結(jié)構(gòu)信息,讓json對(duì)象自動(dòng)映射成為標(biāo)準(zhǔn)的SQL查詢語(yǔ)句。只要我們理解了標(biāo)準(zhǔn)的SQL語(yǔ)言,我們就能夠完成數(shù)據(jù)庫(kù)查詢操作。
依賴關(guān)系
本項(xiàng)目依賴本人的另一個(gè)項(xiàng)目Zjson,此項(xiàng)目提供簡(jiǎn)潔、方便、高效的Json庫(kù)。該庫(kù)使用方便,是一個(gè)單文件庫(kù),只需要下載并引入項(xiàng)目即可。具體信息請(qǐng)移步gitee-Zjson或github-Zjson。
設(shè)計(jì)思路
ZORM數(shù)據(jù)傳遞采用json來實(shí)現(xiàn),使數(shù)據(jù)標(biāo)準(zhǔn)能從最前端到最后端達(dá)到和諧統(tǒng)一。此項(xiàng)目目標(biāo),不但在要C++中使用,還要作為動(dòng)態(tài)鏈接庫(kù)與node.js結(jié)合用使用,因此希望能像javascript一樣,簡(jiǎn)潔方便的操作json。所以先行建立了zjson庫(kù),作為此項(xiàng)目的先行項(xiàng)目。設(shè)計(jì)了數(shù)據(jù)庫(kù)通用操作接口,實(shí)現(xiàn)與底層實(shí)現(xiàn)數(shù)據(jù)庫(kù)的分離。該接口提供了CURD標(biāo)準(zhǔn)訪問,以及批量插入和事務(wù)操作,基本能滿足平時(shí)百分之九十以上的數(shù)據(jù)庫(kù)操作。項(xiàng)目基本目標(biāo),支持Sqlite3,Mysql,Postges三種關(guān)系數(shù)據(jù)庫(kù),同時(shí)支持windows、linux和macOS。
項(xiàng)目進(jìn)度
現(xiàn)在已經(jīng)實(shí)現(xiàn)了sqlit3與mysql的所有功能,postgres也做了技術(shù)準(zhǔn)備。
我選擇的技術(shù)實(shí)現(xiàn)方式,基本上是最底層高效的方式。sqlit3-sqllit3.h(官方的標(biāo)準(zhǔn)c接口);mysql-capi(MySQLConnectorC6.1);postgres-pqxx。
任務(wù)列表:
數(shù)據(jù)庫(kù)通用接口
應(yīng)用類直接操作這個(gè)通用接口,實(shí)現(xiàn)與底層實(shí)現(xiàn)數(shù)據(jù)庫(kù)的分離。該接口提供了CURD標(biāo)準(zhǔn)訪問,以及批量插入和事務(wù)操作,基本能滿足平時(shí)百分之九十以上的數(shù)據(jù)庫(kù)操作。
classZORM_APIIdb
public:
virtualJsonselect(stringtablename,Jsonparams,vectorstringfields=vectorstring(),Jsonvalues=Json(JsonType::Array))=0;
virtualJsoncreate(stringtablename,Jsonparams)=0;
virtualJsonupdate(stringtablename,Jsonparams)=0;
virtualJsonremove(stringtablename,Jsonparams)=0;
virtualJsonquerySql(stringsql,Jsonparams=Json(),Jsonvalues=Json(JsonType::Array),vectorstringfields=vectorstring())=0;
virtualJsonexecSql(stringsql,Jsonparams=Json(),Jsonvalues=Json(JsonType::Array))=0;
virtualJsoninsertBatch(stringtablename,Jsonelements,stringconstraint="id")=0;
virtualJsontransGo(Jsonsqls,boolisAsync=false)=0;
實(shí)例構(gòu)造
全局查詢開關(guān)變量:
DbLogClose:sql查詢語(yǔ)句顯示開關(guān)parameterized:是否使用參數(shù)化查詢
Sqlite3:
Jsonoptions;
options.addSubitem("connString","./db.db");//數(shù)據(jù)庫(kù)位置
options.addSubitem("DbLogClose",false);//顯示查詢語(yǔ)句
options.addSubitem("parameterized",false);//不使用參數(shù)化查詢
DbBase*db=newDbBase("sqlite3",options);
Mysql:
Jsonoptions;
options.addSubitem("db_host","");//mysql服務(wù)IP
options.addSubitem("db_port",3306);//端口
options.addSubitem("db_name","dbtest");//數(shù)據(jù)庫(kù)名稱
options.addSubitem("db_user","root");//登記用戶名
options.addSubitem("db_pass","123456");//密碼
options.addSubitem("db_char","utf8mb4");//連接字符設(shè)定[可選]
options.addSubitem("db_conn",5);//連接池配置[可選],默認(rèn)為2
options.addSubitem("DbLogClose",true);//不顯示查詢語(yǔ)句
options.addSubitem("parameterized",true);//使用參數(shù)化查詢
DbBase*db=newDbBase("mysql",options);
智能查詢方式設(shè)計(jì)
查詢保留字:page,size,sort,fuzzy,lks,ins,ors,count,sum,group
page,size,sort,分頁(yè)排序在sqlit3與mysql中這比較好實(shí)現(xiàn),limit來分頁(yè)是很方便的,排序只需將參數(shù)直接拼接到orderby后就好了。
查詢示例:
Jsonp;
p.addSubitem("page",1);
p.addSubitem("size",10);
p.addSubitem("size","sortdesc");
(newDbBase(...))-select("users",p);
生成sql:SELECT*FROMusersORDERBYagedescLIMIT0,10
fuzzy,模糊查詢切換參數(shù),不提供時(shí)為精確匹配提供字段查詢的精確匹配與模糊匹配的切換。
Jsonp;
p.addSubitem("username","john");
p.addSubitem("password","123");
p.addSubitem("fuzzy",1);
(newDbBase(...))-select("users",p);
生成sql:SELECT*FROMusersWHEREusernamelike'%john%'andpasswordlike'%123%'
ins,lks,ors這是最重要的三種查詢方式,如何找出它們之間的共同點(diǎn),減少冗余代碼是關(guān)鍵。
Jsonp;
p.addSubitem("ins","age,11,22,36");
(newDbBase(...))-select("users",p);
生成sql:SELECT*FROMusersWHEREagein(11,22,26)
Jsonp;
p.addSubitem("ors","age,11,age,36");
(newDbBase(...))-select("users",p);
生成sql:SELECT*FROMusersWHERE(age=11orage=26)
Jsonp;
p.addSubitem("lks","username,john,password,123");
(newDbBase(...))-select("users",p);
生成sql:SELECT*FROMusersWHERE(usernamelike'%john%'orpasswordlike'%123%')
ins,數(shù)據(jù)庫(kù)表單字段in查詢,一字段對(duì)多個(gè)值,例:
查詢示例:ors,數(shù)據(jù)庫(kù)表多字段精確查詢,or連接,多個(gè)字段對(duì)多個(gè)值,例:
查詢示例:lks,數(shù)據(jù)庫(kù)表多字段模糊查詢,or連接,多個(gè)字段對(duì)多個(gè)值,例:查詢示例:
count,sum這兩個(gè)統(tǒng)計(jì)求和,處理方式也類似,查詢時(shí)一般要配合group與fields使用。
Jsonp;
p.addSubitem("count","1,total");
(newDbBase(...))-select("users",p);
生成sql:SELECT*,count(1)astotalFROMusers
Jsonp;
p.addSubitem("sum","age,ageSum");
(newDbBase(...))-select("users",p);
生成sql:SELECTusername,sum(age)asageSumFROMusers
count,數(shù)據(jù)庫(kù)查詢函數(shù)count,行統(tǒng)計(jì),例:查詢示例:sum,數(shù)據(jù)庫(kù)查詢函數(shù)sum,字段求和,例:查詢示例:
group,數(shù)據(jù)庫(kù)分組函數(shù)group,例:
查詢示例:
Jsonp;
p.addSubitem("group","age");
(newDbBase(...))-select("users",p);
生成sql:SELECT*FROMusersGROUPBYage
不等操作符查詢支持
支持的不等操作符有:,=,,=,,=;逗號(hào)符為分隔符,一個(gè)字段支持一或二個(gè)操作。
特殊處:使用=可以使某個(gè)字段跳過search影響,讓模糊匹配與精確匹配同時(shí)出現(xiàn)在一個(gè)查詢語(yǔ)句中
一個(gè)字段一個(gè)操作,示例:查詢示例:
Jsonp;
p.addSubitem("age",",10");
(newDbBase(...))-select("users",p);
生成sql:SELECT*FROMusersWHEREage10
一個(gè)字段二個(gè)操作,示例:查詢示例:
Jsonp;
p.addSubitem("age","=,10,=,33");
(newDbBase(...))-select("users",p);
生成sql:SELECT*FROMusersWHEREage=10andage=33
使用=去除字段的fuzzy影響,示例:查詢示例:
Jsonp;
p.addSubitem("age","=,18");
p.addSubitem("username","john");
p.addSubitem("fuzzy","1");
(newDbBase(...))-select("users",p);
生成sql:SELECT*FROMusersWHEREage=18andusernamelike'%john%'
具體使用方法,請(qǐng)參看uinttest。
單元測(cè)試
有完整功能的單元測(cè)試用例,請(qǐng)參見tests目錄下的測(cè)試用例。
測(cè)試用例運(yùn)行結(jié)果樣例
項(xiàng)目地址
/zhoutk/zorm
/zhoutk/zorm
運(yùn)行方法
該項(xiàng)目在vs2025,gcc7.5,clang12.0下均編譯運(yùn)行正常。
gitclone/zhoutk/zorm
cdzorm
cmake-Bbuild.
windows
cdbuildcma
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- gmp中人員培訓(xùn)管理制度
- 幼兒園藝術(shù)教育培訓(xùn)制度
- 嚴(yán)格培訓(xùn)常規(guī)管理制度
- 制藥廠從業(yè)培訓(xùn)制度
- 鉗工培訓(xùn)室規(guī)章制度
- 培訓(xùn)學(xué)校信息管理制度
- 常見意外事件培訓(xùn)制度
- 飲品培訓(xùn)人員管理制度
- 開展小學(xué)校本培訓(xùn)制度
- 新員工培訓(xùn)處罰制度
- GB/T 17213.4-2015工業(yè)過程控制閥第4部分:檢驗(yàn)和例行試驗(yàn)
- FZ/T 73009-2021山羊絨針織品
- JJF 1069-2012 法定計(jì)量檢定機(jī)構(gòu)考核規(guī)范(培訓(xùn)講稿)
- GB∕T 5900.2-2022 機(jī)床 主軸端部與卡盤連接尺寸 第2部分:凸輪鎖緊型
- 2011-2015廣汽豐田凱美瑞維修手冊(cè)wdl
- DFMEA編制作業(yè)指導(dǎo)書新版
- KTronics籃輸送式洗碗碟機(jī)操作手冊(cè)
- DB35∕T 1844-2019 高速公路邊坡工程監(jiān)測(cè)技術(shù)規(guī)程
- 城市管理綜合執(zhí)法局城管執(zhí)法與執(zhí)法程序PPT模板
- 閥門基礎(chǔ)知識(shí)上
- 第二章注射成型工藝與模具結(jié)構(gòu)
評(píng)論
0/150
提交評(píng)論