用到的QT库: 1. QList 2. QHash 3. QString 4. QDebug 5. QSqlDatabase 6. QSqlQuery 7. QVariant 8. QUuid
QSqlDatabase QSqlDatabasePrivate::database(const QString& name, bool open) { const QConnectionDict *dict = dbDict(); Q_ASSERT(dict); dict->lock.lockForRead(); QSqlDatabase db = dict->value(name); dict->lock.unlock(); if (!db.isValid()) return db; if (db.driver()->thread() != QThread::currentThread()) { qWarning("QSqlDatabasePrivate::database: requested database does not belong to the calling thread."); return QSqlDatabase(); } if (open && !db.isOpen()) { if (!db.open()) qWarning() << "QSqlDatabasePrivate::database: unable to open database:" << db.lastError().text(); } return db; }QT的数据库是单线程版本的,加了线程控制,看了源码,各种宏,也没细看,就没办法做多线程了
首先是建表
User user;//建表需要先实例化一个对象 user.CREATE_TABLE();//这两个函数功能一样 user.YSqlCreateTable();实例化一个对象,《select》
/*我希望能写成 User user(uid="001") 但是C++不支持指定参数名传值,只能折中了, 这是采用了可变参数,所以可以任意传 */ User user(YSQLMETA,YSqlMeta(uid)=QString("001")); User user(YSQLMETA,YSqlMeta(uid)=QString("001"),YSqlMeta(pwd)=QString("100")); User user(YSQLMETA,YSqlMeta(uid)=QString("001"),YSqlMeta(pwd)=QString("100"),YSqlMeta(count)=10); //这里不能直接写“001”,必须用QString包一下,因为我是根据传入变量的类型来保存数据的,大概和QVarint有点像, //可惜功力不太够,写的不是太好,也是写了才想起来QT有个QVarint,不过以后要彻底做成一个框架,我也不能用QT的类了呀 isNull()//判断是否查询到了并实例化了一个对象,如果没有查询到, User user(YSQLMETA,YSqlMeta(uid)=QString("001")); //就等于 User user;Insert
User user; user.uid = "001"; user.pwd = "100"; user.count = 10; user.save();Update
User user(YSQLMETA,YSqlMeta(uid)=QString("001")); user.uid = "001"; user.pwd = "100"; user.count = 10; //修改了值之后是立即更新的,但user必须是查询到并实例化的Delete
//这两句话效果一样 user.remove(); user.delete_();get_or_create
User user; user.get_or_create(YSqlMeta(uid)=QString("001"),YSqlMeta(pwd)=QString("100"),YSqlMeta(count)=10); //只有在数据不合格的情况下会返回false //这个也是可变参数insert_many
User user; user.insert_many({{"001","100","10"},{"002","200","20"},{"003","300","30"}}); //总觉得这样写很方便,也很直观,有数据没插进去,就返回false还有很多函数有了想法,但是还没写,不过框架搭的差不多,那些方法写起来就很简单了
链接: YSqlTest测试工程压缩文件 提取码: r8aj