YB.ORM的核心特性

YB.ORM的設(shè)計(jì)目標(biāo)是為C++開(kāi)發(fā)者提供一個(gè)方便的API,保持C++的高性能,同時(shí)確保代碼在不同平臺(tái)和編譯器之間的移植性。它支持大多數(shù)主要的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS),包括但不限于SQLite、MySQL、PostgreSQL等。

YB.ORM與現(xiàn)有框架的比較

在眾多C++ ORM框架中,YB.ORM以其獨(dú)特的特性脫穎而出。相比于QxOrm和LiteSQL,YB.ORM不僅支持多種數(shù)據(jù)庫(kù),還提供了更為豐富和靈活的映射選項(xiàng)。

YB.ORM的使用細(xì)節(jié)

定義模型

使用YB.ORM首先從定義模型開(kāi)始,這可以是XML文件、類聲明中的內(nèi)聯(lián)宏,或者是模板函數(shù)。這些定義了如何在數(shù)據(jù)庫(kù)表和C++類之間建立映射關(guān)系。

代碼示例:映射Client和Order

以下是一個(gè)簡(jiǎn)單的代碼示例,展示了如何使用YB.ORM來(lái)定義兩個(gè)實(shí)體:Client和Order,并建立它們之間的一對(duì)多關(guān)系。

#include "orm/domain_object.h"
#include "orm/domain_factory.h"
#include "orm/schema_decl.h"

class Order;
class Client: public Yb::DomainObject {
    YB_DECLARE(Client, "client_tbl", "client_seq", "client",
        YB_COL_PK(id, "id")
        YB_COL_DATA(dt, "dt", DATETIME)
        YB_COL_STR(name, "name", 100)
        YB_COL_STR(email, "email", 100)
        YB_COL_DATA(budget, "budget", DECIMAL)
        YB_REL_ONE(Client, owner, Order, orders, Yb::Relation::Restrict, "client_id", 1, 1)
        YB_COL_END)
public:
    int get_info() const { return 42; }
};

class Order: public Yb::DomainObject {
    YB_DECLARE(Order, "order_tbl", "order_seq", "order",
        YB_COL_PK(id, "id")
        YB_COL_FK(client_id, "client_id", "client_tbl", "id")
        YB_COL(dt, "dt", DATETIME, 0, 0, Yb::Value("sysdate"), "", "", "", "")
        YB_COL_STR(memo, "memo", 100)
        YB_COL_DATA(total_sum, "total_sum", DECIMAL)
        YB_COL_DATA(paid_sum, "paid_sum", DECIMAL)
        YB_COL_DATA(paid_dt, "paid_dt", DATETIME)
        YB_REL_MANY(Client, owner, Order, orders, Yb::Relation::Restrict, "client_id", 1, 1)
        YB_COL_END)
public:
    const Yb::Decimal to_be_paid() {
        return total_sum - paid_sum.value(0);
    }
};

會(huì)話管理

YB.ORM通過(guò)Yb::Session類來(lái)管理數(shù)據(jù)庫(kù)會(huì)話,負(fù)責(zé)加載/保存對(duì)象、跟蹤更改和控制關(guān)系。

int main() {
    Yb::init_schema();  // gather all declarations in one schema
    Yb::Session session(Yb::theSchema(), "sqlite+sqlite://./tut1.db");
    session.create_schema(true);  // create schema if necessary

    Order order;
    order.total_sum = Yb::Decimal("3.14");
    order.paid_sum = Yb::Decimal(0);
    order.save(session);
    Client client;
    client.name = "Some Name");
    client.email = "some@email");
    client.dt = Yb::now();
    client.save(session);
    order.owner = Client::Holder(client);
    session.commit();
    return 0;
}

日志記錄

YB.ORM支持詳細(xì)的日志記錄功能,可以幫助開(kāi)發(fā)者了解底層的數(shù)據(jù)庫(kù)操作細(xì)節(jié)。

#include "util/nlogger.h"
#include 

Yb::LogAppender appender(std::cerr);
Yb::init_schema();  // gather all declarations in one schema
Yb::Session session(Yb::theSchema(), "sqlite+sqlite://./tut1.db");
session.set_logger(Yb::ILogger::Ptr(new Yb::Logger(&appender)));

YB.ORM的高級(jí)應(yīng)用

動(dòng)態(tài)查詢構(gòu)建

YB.ORM的強(qiáng)大之處在于其動(dòng)態(tài)查詢構(gòu)建能力,可以輕松構(gòu)建復(fù)雜的SQL查詢。

代碼示例:構(gòu)建動(dòng)態(tài)查詢

Yb::DomainResultSet rs = Yb::query(session) 
    .filter_by(Order::c.client_id == 32738) 
    .order_by(Order::c.dt) 
    .range(30, 40).all(); 
BOOST_FOREACH(Order order, rs) { 
    std::cout << order.id << ","; 
}

FAQ

問(wèn):YB.ORM支持哪些數(shù)據(jù)庫(kù)?

問(wèn):YB.ORM如何管理數(shù)據(jù)庫(kù)會(huì)話?

問(wèn):YB.ORM是否支持日志記錄?

問(wèn):YB.ORM能否構(gòu)建復(fù)雜的查詢?

結(jié)論

YB.ORM作為一個(gè)功能強(qiáng)大且靈活的C++ ORM庫(kù),為開(kāi)發(fā)者提供了一種高效管理數(shù)據(jù)庫(kù)操作的方式。它不僅簡(jiǎn)化了數(shù)據(jù)庫(kù)交互,還通過(guò)豐富的特性和靈活的配置,使得開(kāi)發(fā)復(fù)雜的數(shù)據(jù)庫(kù)應(yīng)用程序變得更加容易。通過(guò)本文的深入解析和示例應(yīng)用,我們可以看到Y(jié)B.ORM在現(xiàn)代C++開(kāi)發(fā)中的重要價(jià)值和應(yīng)用潛力。

上一篇:

Multi是什么詞:探究前綴multi及其在計(jì)算機(jī)科學(xué)中的應(yīng)用

下一篇:

AI搜索工具評(píng)測(cè)與應(yīng)用指南
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)