日韩性视频-久久久蜜桃-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有码在线观看 | 高h文在线 | 精品人妻无码一区二区性色 | 国产日韩二区 | 免费日皮视频 | 欧美精品一区二区三区四区 | 黄色一级片av | 黄色av国产 | 成人午夜视频一区二区播放 | 蜜桃av导航 | 97中文在线| 丝袜美腿亚洲综合 | 澳门免费av| 国产免费不卡视频 | 亚洲午夜毛片 | 久久久久久国产精品三级玉女聊斋 | 成熟人妻av无码专区 | 日韩欧美自拍 | 99精品久久精品一区二区 | 女人喷潮完整视频 | 日本免费网站 | 亚洲精品久久久久久国产精华液 | 波多野结衣亚洲一区二区 | 91九色pron| 在线看国产精品 | 国产精品suv一区二区88 | 人妻奶水人妻系列 | 国产地址| 在线综合av | 四虎黄色影视 | 国产精品色悠悠 | 亚洲自拍偷拍区 | 婷婷亚洲综合五月天小说 | 久久免费小视频 | 国产成年人免费视频 | 日韩精品1区2区3区 欧美一本 | 五月婷婷综合在线 | 久久亚洲AV成人无码国产人妖 | 亚洲伊人精品 | 久久久久色 | 亚洲欧美国产毛片在线 | 原神淫辱系列同人h | 69免费| 青青草免费在线视频 | 一级做a爰片久久毛片 | 就是色| 一线毛片 | 麻豆传谋在线观看免费mv | 色综合天天综合网天天看片 | 四季av中文字幕一区 | 人人干人人做 | 欧美一级免费黄色片 | 一级黄色a | 天天躁狠狠躁狠狠躁夜夜躁68 | 亚洲av无码乱码在线观看性色 | www三级免费 | 国产色综合天天综合网 | 在线观看www| 美日韩成人av | 在线观看波多野结衣 | 爱情岛论坛永久入址测速 | 久久伊人成人网 | 日韩精品在线看 | 日韩精品在线观看一区二区三区 | 深夜福利一区 | 黄色在线a| 丝袜 亚洲 另类 欧美 重口 | 日本免费不卡一区二区 | 久久国产精品久久精品国产 | 久久人人爽人人人人片 | 麻豆视频网址 | 成人激情av| 亚洲成人一区在线观看 | 中文字幕 日韩有码 | 成年人在线观看视频免费 | 日本va视频 | 国产成人免费 | 香蕉国产999| 国产字幕av | 免费操人视频 | 精品人伦一区二区三区蜜桃免费 | 成人国产精品免费 | 欧美久久成人 | 欧美视频三区 | xxsm.com| 91小视频在线观看 | 亚洲看 | 婷婷色五| 少妇做爰xxxⅹ性视频 | 初高中福利视频网站 | 一级黄色片在线免费观看 | 国产精品视频在线观看 | 一级视频免费观看 | www.99av| 成a人v | 污污网站免费在线观看 | 日本一二区视频 | 波多野结衣在线观看一区二区 |