您的位置:首页 > 编程语言 > Qt开发

Qt数据库之数据库访问工具 DBUtil

2015-04-20 16:15 141 查看

数据库访问的思考

以查询数据库中 id 为 1 的 user 为例,思考访问数据库的问题以及优化。

常用的访问数据库为以下几步:

设置数据库类型和连接名字
设置数据库所在电脑的 IP,数据库名,访问的用户名和密码
和数据库建立连接(打开数据库)
创建 prepare 的 query
绑定参数
执行 query 访问数据库表
处理 query 的执行结果
关闭数据库连接

void findUser() {
{
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "Connection_Name");
db.setHostName("127.0.0.1");
db.setDatabaseName("qt");
db.setUserName("root");
db.setPassword("root");

if (!db.open()) {
qDebug() << "Connect to MySql error: " << db.lastError().text();
return;
}

QSqlQuery query(db);
query.prepare("SELECT * FROM user where id=:id");
query.bindValue(":id", 1);
query.exec();

while (query.next()) {
qDebug() << query.value("username").toString();
}
}

QSqlDatabase::removeDatabase("Connection_Name");
}

如果还要查询名字为 Alice 的 user 呢?写一个函数 findUserByUsername(),在里面又重复几乎和上面一样的代码。如果数据库,用户名密码等变了呢?是不是需要修改好多地方?在大一点的程序里,用到几十上百个访问数据库的函数很正常,如果都这么修改,想死的心都有了。

使用前面我们实现的数据库连接池,可以简化一些:

获取数据库连接
创建 prepare 的 query
绑定参数
执行 query 访问数据库表
处理 query 的执行结果
释放数据库连接

void findUser() {
QSqlDatabase db = ConnectionPool::openConnection();
QSqlQuery query(db);
query.prepare("SELECT * FROM user where id=:id");
query.bindValue(":id", 1);
query.exec();

while (query.next()) {
qDebug() << query.value("username").toString();
}

ConnectionPool::closeConnection(db);
}

嗯,这里没有了建立数据库连接的信息,好像进步了不少,很好地避免了前面我们提出的问题。

但是,仍然需要花费很多精力在:

参数绑定(
query.bindValue()
有可能要调用很多次,忘了
:
等)
然后还要执行
query.exec()
query.next()
,少一个都不行
最后才能得到查询结果,调用
query.value(fieldName).toXXX()

释放数据库连接(如果忘了这一步,可用连接就越来越少)

上面仍然还有很多代码都是模版式的,能不能把它们提取出来,进一步优化,就像下面这样:

void findUser() {
QMap<QString, QVariant> params;
params["id"] = 1;

QMap<QString, QVariant> result = DBUtil::selectMap("select * from user where id=:id", params);
qDebug() << result["username"].toString();
}

只要
SQL 语句
查询的参数
,调用
DBUtil::selectMap()
就能得到了查询的结果。再如,查询 Alice 的 id:

int id = DBUtil::selectInt("select id from user where username='Alice'");

这里,看不到
数据库连接
,看不到
QSqlQuery
,看不到
bindValues()
等等,甚至于怎么访问数据库的我们都不知道,但得到了查询结果。

SQL 语言的特点就是:用户只需提出
做什么
,而不必指明
怎么做
。对于我们也是一样的,访问数据库的中间过程我们都不关心,数据才是我们关心的,给定 SQL 语句,就能得到查询结果,这是最理想的。但是在代码里有太多访问数据库的细节都是不得已而为之,那并不是我们的本意。能不能实现像上面这样简单的访问数据库,把焦点放在
SQL 语句
结果
上,而忽略数据库访问的细节?答案当然是
可以
,这正是我们的使命。

接下来介绍
DBUtil
,使用它来简化数据库的访问,但是也许你只关心怎么使用,而不关心怎么实现,所以先介绍
DBUtil
的使用,如果有兴趣的话可以继续阅读后面的实现过程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: