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的使用,如果有兴趣的话可以继续阅读后面的实现过程。
相关文章推荐
- ASP.NET 数据库访问通用工具
- qt访问 mysql 数据库的简单教程[
- 数据库访问工具 DBUtl
- 通过Qt5.4.2访问MySQL5.5与Access 2013数据库
- DBUtil数据库工具封装
- .NET通用数据库访问组件,日志组件,C#相关工具
- DBUtil数据库工具封装
- Qt数据库之访问 SQLite
- qt 多线程访问数据库问题
- 用Qt访问数据库写一个 表格
- Qt 4 访问 mysql 数据库的简单教程
- 在asp.net2.0中提供了新一代的数据访问工具--DataSource。它为简单的数据库开发提供了便捷的方式
- Qt 4 访问 mysql 数据库的简单教程 收藏
- Qt 数据库 0x00bf56f7 处未处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
- Delphi开发工具中如何访问数据库结构
- Qt 4 访问 mysql 数据库的简单教程
- Python 边做边学 8.3 工具类--数据库工具(DbUtil)
- 数据库访问工具 DBUtl(公孙二狗)
- (1)解决:QT多线程访问数据库报QMYSQLResult::cleanUp :unable to free statement handle
- QT访问QSqlite数据库的实例