Qt中C++泛型实现ORM操作数据库SQLite实战

完整代码与课程:

https://edu.csdn.net/course/detail/40048

ORM(Object - Relational Mapping)对象 - 关系映射是一种编程技术思想,核心是在面向对象编程语言和关系型数据库之间建立一种映射关系。它允许开发者使用面向对象的方式来操作数据库,而不需要直接编写 SQL 语句。

在Qt中通过C++泛型编程技术实现ORM来操作SQLite数据库,通过低代码少SQL语句的ORM在各种QT项目中对数据库SQLite实现增删查改。

ORM操作接口:

cpp 复制代码
template<class T>
class Dao
{
public:

    bool saveModel(T &m,const QString& guid="")
    {
        return DatabaseEngine<T>(this->mDatabase).saveModel(m,guid);
    }

    T getModel(const QString& guid)
    {
        return  DatabaseEngine<T>(this->mDatabase).getModel(guid);
    }

    bool deleteModel(const QString& guid)
    {
        return DatabaseEngine<T>(this->mDatabase).deleteModel(guid);
    }

    bool deleteModel(T& model)
    {
        return deleteModel(model.getGuid());
    }

    bool saveModelList(const QList<T> models)
    {
        return DatabaseEngine<T>(this->mDatabase).saveModelList(models);
    }

    bool clearModels()
    {
        return DatabaseEngine<T>(this->mDatabase).clearModels();
    }

    template <typename ... Args>
    QList<T> getModelList(const QString& sql="",const Args &... args)
    {
        return DatabaseEngine<T>(this->mDatabase).getModelList(sql,args...);
    }

    template<typename ...Args>
    bool execSQL(const QString& sql,const Args & ...args)
    {
        return DatabaseEngine<T>(this->mDatabase).execSQL(sql,args...);
    }

    template<typename ... Args>
    ModelPage<T> getModelPage(int page_size=20,int page_index=1,const QString sql="",const Args &... args)
    {
        return DatabaseEngine<T>(this->mDatabase).getModelPage(sql,page_size,page_index,args...);
    }

};

实践操作范例:

cpp 复制代码
void saveUser()
{
    User u;
    u.setGuid("123");
    u.setName("wension");
    u.setGender("male");
    u.setEnable(true);

    UserDao().saveModel(u);
}

void getUser()
{
    User u = UserDao().getModel("123");

    qDebug() << u.display();
}

void deleteUser()
{
    UserDao().deleteModel("123");
}

void addUserList()
{
    QElapsedTimer Timer;
    Timer.start();

    QList<User> userList;
    for(int i=0;i<100;i++)
    {
        User user;
        user.setGuid(QString("%1").arg(i));
        user.setName(QString("wension_%1").arg(i));
        userList<<user;
    }
    UserDao().saveModelList(userList);

    qint64 elapsedTime = Timer.elapsed();
    qDebug() << "批处理 插入 经过的时间(毫秒):" << elapsedTime;
}
相关推荐
王老师青少年编程6 小时前
信奥赛C++提高组csp-s之搜索进阶(搜索剪枝案例实践1)
c++·csp·高频考点·信奥赛·提高组·搜索剪枝·小木棍
weelinking6 小时前
【产品】12_接入数据库——让数据永久保存
jvm·数据库·python·react.js·数据挖掘·前端框架·产品经理
稳联技术老娜6 小时前
DeviceNet主站怎么连接西门子PLC,Profinet网关配置手册(那智机器人)
服务器·网络·数据库
这个DBA有点耶7 小时前
云上运维新挑战:当数据库不再“看得见摸得着”
数据库·sql·程序人生·云原生·运维开发·学习方法·dba
jingshaoqi_ccc7 小时前
windows 10系统下QT的安装及在Visual studio中的扩展安装
windows·qt·visual studio
AskHarries8 小时前
系统提示词、开发者指令和用户输入的优先级
java·前端·数据库
消失在人海中8 小时前
oracle 数据库多表关联查询
服务器·数据库·oracle
九皇叔叔8 小时前
PostgreSQL/openGauss pg_stats 视图从入门到精通:统计信息、执行计划与慢 SQL 优化实战
数据库·sql·postgresql
南极企鹅9 小时前
MySQL间隙锁&临键锁
数据库·sql·mysql
王老师青少年编程9 小时前
信奥赛C++提高组csp-s之搜索进阶(搜索剪枝核心思想 )
c++·dfs·csp·信奥赛·搜索剪枝·搜索优化