日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

(原创)发布一个C++版本的ORM库SmartDB(一)

發布時間:2025/5/22 c/c++ 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (原创)发布一个C++版本的ORM库SmartDB(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

先簡單說說ORM的優點:

  • 提高開發效率,減少重復勞動,只和業務實體打交道,由業務實體自動生成sql語句,不用手寫sql語句。
  • 簡單易用, 可維護性好。
  • 隔離數據源,使得我們更換數據源時不用修改代碼。
  • SmartDB基礎庫

      java和c#中有很多ORM框架,如c#中的entity framework、Linq to Sql、NHibernate等,java中有Hibernate、Mybatis等等,其它各種開源的ORM庫多如牛毛。這應該得益于托管語言在這方面的優勢。然而,c++的世界中,卻鮮有ORM框架,c++中比較知名的ORM庫應該是ODB了,但是ODB的使用比較麻煩,需要三個庫,寫的ORM代碼還需要ODB專門編譯一下(不知道我說的是否確切),總之使用起來比較麻煩,讓人望而卻步。我的項目中本來只需要用sqlite,但是考慮到后期可能會更換數據庫,所以想搞一個ORM庫,但時間又比較緊,覺得短時間內搞不定ODB,于是放棄,選擇最簡單穩妥的作法,先只封裝sqlite,目標是封裝成簡潔,統一的接口,即使到后面更換數據庫時,我也不需要改應用層的代碼,只要替換底層數據庫封裝模塊就行了。在這個目標的指引下我很快完成了基礎庫SmartDB的封裝,如下是SmartDB的操作接口。

    bool Open(string dbName);//打開數據庫 bool Close();//關閉數據庫 bool Excecute(const std::string && query); //直接執行sql語句 bool ExcecuteBulk(const Args && ... args); //批量操作的sql語句 bool Prepare(const std::string && query); //批量操作之前的準備 bool Excecute(const std::string && query, const Args && ... args); //執行帶占位符的sql語句 R ExecuteScalar(const std::string &query, const Args &... args); //返回函數執行的一個值, 執行簡單的匯聚函數,如select count(*), select max(*)等 bool GetTable(const string &query, T &table, TableRange* tableRange, const Args &... args); //返回一個通用的表結構 int GetRowCount(const string &query, const TableRange* tableRange, const Args &... args);//獲取表的總行數

      這些接口是直接接受sql語句和參數列表的,所以理論上它可以完成所有的數據庫操作。目前內部只支持sqlite,我自測了一下基礎庫的性能。在我的雙核6G的臺式機下測試了一下插入速度和讀取速度,一個八字段的表(int和doble類型),批量插入速度大概為25W條/s,讀取速度大概為11W條/s。這些已經滿足了我的需求,但是我覺得可以在這個基礎上做得更多,即支持ORM,我期望我的ORM能達到類似于entity framework的調用方式,比ODB更好用(比如智能提示、鏈式調用等),而性能又不至于降低太多。

    EF中查詢方式 DemoDBEntities context = new DemoDBEntities(); ObjectQuery<BlogMaster> query = context.CreateObjectSet<BlogMaster>().Where("it.UserId > @UserId",new ObjectParameter("UserId", 6)) .OrderBy("it.UserId desc");List<BlogMaster> list = query.ToList();

    SmartDBEX ORM庫

      c++中ORM庫的實現思路: ORM的關鍵是如何將業務實體轉成sql語句以及表的原始數據如何轉成業務實體,它們橫在數據庫和實體之間的兩道鴻溝,因此,如何通過一個結構體去自動生成sql腳本是第一個需要解決的問題,如何將原始表轉成業務實體是第二個需要解決的問題。我覺得問題的關鍵在結構體,我需要結構體提供一些信息給我,比如,字段類型,字段名,字段值等信息,這在c#或者java中可以通過反射就可以得到,但c++沒有反射,是無法自動就得到這些信息的,不過C++雖然沒有托管語言的這些優勢,但卻有自己的優勢--模板元,可以通過模板元來獲取這些信息,通過這些信息我就可以自動生成sql腳本了;第二個問題則是通過boost的variant和結構體中的賦值函數來解決。

      總之,我通過在結構體上做文章,最終達到了我的目標,而且我會保證結構體不會復雜,盡可能少的讓用戶去寫代碼,只需要提供幾個簡單的函數就可以實現ORM了。我是在基礎庫SmartDB之上擴展了ORM功能,最終的ORM庫為SmartDBEX, 它內部是調用了SmartDB實現具體功能。這樣做的目的是即可使用操作sql的接口,又可使用ORM接口,用戶根據自己選擇即可。

      我在臺式機上測了一下SmartDBEX的性能:還是之前的表,批量插入速度為25W條/s,讀取并轉成實體列表的速度為2.3W條/s。比較滿意的是批量插入速度沒有降低,差強人意的是讀取實體列表的速度降低了不少,性能損耗在兩個地方:原始表的字段和實體的字段匹配和原始表字段賦值給實體。沒辦法,ORM這里必須要損耗一些性能。2.3W條/s的讀取速度對一般應用來說已經可以滿足要求了。

    如何使用SmartDB和SmartDBEX

    SmartDB的測試程序

    /*創建表*/ void TestCreateTable(SmartDB& db) { const string sqlcreat = "CREATE TABLE if not exists TestInfoTable(ID INTEGER NOT NULL, KPIID INTEGER, CODE INTEGER, V1 INTEGER, V2 INTEGER, V3 REAL);"; if (!db.Excecute(sqlcreat)) return; }/*單條插入*/ void TestInsert(SmartDB& db) { const string sqlinsert = "INSERT INTO TestInfoTable(ID, KPIID, CODE, V1, V2, V3) VALUES(1, 2, 3, 4, 5, 6.032);"; if (!db.Excecute(sqlinsert)) return;const string sqlinsert1 = "INSERT INTO TestInfoTable(ID, KPIID, CODE, V1, V2, V3) VALUES(?, ?, ?, ?, ?, ?);"; int n = 2; string str = "3.1423"; if (!db.Excecute(sqlinsert1, n, n, n, n, n, str)) return; }/*批量插入, 啟用事務*/ void TestBulkInsert(SmartDB& db) { const string sqlinsert = "INSERT INTO TestInfoTable(ID, KPIID, CODE, V1, V2, V3) VALUES(?, ?, ?, ?, ?, ?);"; timer t; Transaction transaction(&db); //開始事務 db.Prepare(sqlinsert); //準備sql,含占位符 bool ret = false; for (size_t i = 0; i < 1000000; i++) { ret = db.ExcecuteBulk(i, i, i, i, i, i); if (!ret) break; }if (ret) transaction.Commit(); //提交事務 else transaction.RollBack(); //回滾 cout << t.elapsed() << endl; }

    ?

    SmartDBEX的測試程序

    void TestORM(SmartDB& db) { SmartDBEx dbex(db); //創建表 auto r = dbex.Create<TestInfo>(); //查詢 auto& query = dbex.Query<TestInfo>().Where(Var(TestInfo::CODE < 10 and TestInfo::ID < 10)); vector<TestInfo> v; bool b = dbex.Get<TestInfo>(v);//獲取總行數 int count = dbex.Count<TestInfo>().Scalar(); cout << count << endl;//單條插入 r = dbex.Insert(t);//批量插入 TestInfo t = {1,2,3,4,5,6}; Transaction tans(&db); r = dbex.Prepare<TestInfo>(); for (size_t i = 0; i < 1000000; i++) { r = dbex.BulkInsert(t); } r = tans.Commit();//刪除 r = dbex.Delete<TestInfo>()(); }

      

      這里我們不妨對比一下ODB的調用方式,ODB的查詢方式:

    typedef odb::query<person> query; typedef odb::result<person> result;{ transaction t (db->begin ());result r (db->query<person> (query::age > 30));for (result::iterator i (r.begin ()); i != r.end (); ++i) { cout << "Hello, " << i->first () << "!" << endl; }t.commit (); }

    SmartDBEX的查詢方式:

    auto& query = dbex.Query<TestInfo>().Where(Var(TestInfo::CODE < 10 and TestInfo::ID < 10)); vector<TestInfo> v; bool b = dbex.Get<TestInfo>(v);

    呵呵,有點像吧,但哪個更直觀簡潔呢?

    有待完善的地方

      犧牲了好幾個周末的時間做這個ORM,主要是ORM的關鍵技術的思路和實現花了不少時間,今天終于做完了第一個版本,算是對前段時間的思考和研究做個總結和交代吧。不過由于是業余時間開發,時間和精力有限,ORM接口目前只有一些基本功能,還不太完善,而且目前內部只支持sqlite,至于其它數據庫的支持,等到后面再繼續完善了。另外,庫內部沒有采用緩存和延遲加載等技術,不是不能加,是暫時沒有時間和精力去繼續完善了,而且性能已經滿足我的要求了,優化完善的工作來日方長吧;后期還可以考慮支持結構體通過文件配置的方式生成,進一步增強靈活性。

    歡迎使用

      歡迎大家下載測試工程和源碼并試用,發現問題請報告給我,我好完善。也期待有人愿意在此基礎上和我一起完善它,使它成為一個優秀的c++ORM庫,讓c++開發人員的日子變得更美好,讓c++的世界更加絢麗多彩。

    源碼下載地址

    c++11 boost技術交流群:296561497,歡迎大家來交流技術。

    轉載于:https://www.cnblogs.com/qicosmos/p/3342037.html

    總結

    以上是生活随笔為你收集整理的(原创)发布一个C++版本的ORM库SmartDB(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 成人夜晚看av | 中文字幕在线视频一区 | www.天天操.com| 欧美亚洲国产成人 | 国产成人精品久久久 | 亚洲一区二区三区免费看 | 少妇特殊按摩高潮惨叫无码 | 人人看人人做 | 黄色片视频在线观看 | 大肉大捧一进一出好爽动态图 | 日日摸日日碰 | 麻豆影音先锋 | 亚洲第九十九页 | 日本视频中文字幕 | 日本作爱视频 | 泰国午夜理伦三级 | caobi视频 | 精品久久久久一区二区 | 精品国产aⅴ一区二区三区东京热 | 欧美最猛黑人xxxx黑人猛交 | 亚洲福利av | 一区二区三区免费看视频 | 久久av一区二区三区 | 日本中文字幕在线观看视频 | 亚洲欧美综合另类自拍 | 国产视频你懂得 | 欧美日韩在线视频观看 | 免费日b视频 | 午夜免费一区二区 | 美女露胸露尿口 | 亚洲精品国产suv | 久久999 | 日批黄色片 | 一区二区乱子伦在线播放 | 国产麻豆天美果冻无码视频 | 国模av| youjizz国产精品 | 欧美日韩一级片在线观看 | 亚洲精品大片 | 黄色字幕网 | 快射视频网 | 在线观看www视频 | 人人妻人人澡人人爽人人dvd | 中文字幕在线播放日韩 | 爱啪啪av | 久久作爱视频 | 搡老岳熟女国产熟妇 | 亚洲视频精品一区 | 可以直接看av的网址 | 日韩免费成人av | 黄色网页大全 | 国产又粗又猛又黄又爽无遮挡 | 调教女m荡骚贱淫故事 | 欧美黄页| 三级黄色免费片 | 打白嫩屁屁网站视频短裙 | 亚洲一区二区三区视频 | 欧美亚洲综合另类 | 免费无码毛片一区二区app | 亚洲国产成人va在线观看天堂 | 国产极品美女高潮无套在线观看 | 污视频在线 | 日本三不卡 | sao浪受的饥渴日常 91免费入口 | 秋霞黄色网 | 欧美图片一区二区三区 | 久草播放 | 香蕉视频在线网站 | 91精品网| 香蕉久久网站 | 女人的洗澡毛片毛多 | 欧美人体做爰大胆视频 | 涩涩的视频在线观看 | 久久精品久久精品久久精品 | 欧美成人精品二区三区99精品 | 中文字幕av在线播放 | 乱熟女高潮一区二区在线 | free欧美性69护士呻吟 | 国产一区二区不卡视频 | 97黄色网 | www.涩涩爱| 户外露出一区二区三区 | 激情女主播 | 国产做爰全过程免费视频 | 好吊视频在线观看 | 床戏高潮做进去大尺度视频网站 | www.4虎 | 超碰在线人人干 | 一区二区三区四区国产精品 | 中文字字幕在线中文乱码电影 | 国产伦精品一区二区三区视频女 | 午夜裸体性播放 | 污污视频在线播放 | 日韩av在线网 | 女优中文字幕 | 美女隐私无遮挡免费 | 波多野结衣久久精品 | 人妻精品一区二区在线 | 亚洲精品丝袜 |