C++設(shè)計(jì)與實(shí)現(xiàn)ORM系統(tǒng)實(shí)例詳解_第1頁(yè)
C++設(shè)計(jì)與實(shí)現(xiàn)ORM系統(tǒng)實(shí)例詳解_第2頁(yè)
C++設(shè)計(jì)與實(shí)現(xiàn)ORM系統(tǒng)實(shí)例詳解_第3頁(yè)
C++設(shè)計(jì)與實(shí)現(xiàn)ORM系統(tǒng)實(shí)例詳解_第4頁(yè)
C++設(shè)計(jì)與實(shí)現(xiàn)ORM系統(tǒng)實(shí)例詳解_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論