1. Qt数据库简介
Qt本身并不具备数据库,需要配合市面上的数据库产品才能使用。为了规范不同厂商数据库的操作方式,Qt为它们指定了一套统一的操作接口。

与Qt数据库操作相关的类有,
● QSqlDatabase
数据库操作连接类
● QSqlError
数据库错误信息类。
Qt调用数据库,当数据库本身产生错误时,会把错误信息传递给Qt,Qt会把错误信息封装为QSqlError类对象,以便于程序员获取。
● QSqlQuery
数据库操作类,用于执行SQL语句。
Qt的数据库相关的类使用前需要先在.pro项目配置文件中,添加sql模块。

2. 连接数据库
需要使用的函数如下所示。
● QSqlDatabase QSqlDatabase::addDatabase(const QString & type) [static]
获得一个数据库连接对象。
参数为数据库的类型,Qt支持以下数据库的连接。

QSQLite3作为比较小巧的关系型数据库产品,是Qt唯一内置的数据库,并且也内置了连接的驱动程序,可以直接使用上表左列的驱动名称连接。
● void QSqlDatabase::setDatabaseName(const QString & name)
设置数据库名称,此函数会因为连接的数据库类型而有不同的含义,对于SQLite数据库而言,此函数的参数表示数据库文件的名称,这是因为SQLite数据库通过单文件存储。
● bool QSqlDatabase::open()
打开数据库连接,返回值是打开的结果。如果打开失败,会通过lastError函数返回错误信息;如果打开成功可以通过close函数关闭连接。
数据库连接打开成功后,进入构建目录,可以看见数据库文件已生成。


● QSqlError QSqlDatabase::lastError() const
返回上一次数据库操作的错误信息对象,QSqlError类的text函数可以拿到错误信息的字符串。
3. 建表
参考建表语句:
CREATE TABLE teacher( id INTEGER PRIMARY KEY, name TEXT, sex TEXT, age INTEGER, mclass TEXT);
使用函数:
● bool QSqlQuery::exec(const QString & query)
执行SQL语句,参数是要执行的SQL语句,返回值是执行的结果。
如果执行错误,错误信息可通过QSqlError QSqlQuery::lastError() const函数获得。
建表操作后,可以使用SQLiteSpy软件打开数据库文件。

4. 增删改查
增删改查的过程中,对于一些数据需要从UI上获取,这些获取后,按照以往的方式需要与SQL语句进行拼接,在交给Qt去执行。这样的做法可以实现功能,但是存在一些缺点:
● 拼接时容易出错
● 容易出现安全问题
Qt中使用预处理+数据绑定的方式解决上述问题。
需要先编写预处理的SQL语句,与普通SQL语句的区别在于,先使用占位符对需要传入的数据进行替换,占位符有两种写法:
● Oracle风格
使用英文冒号与列名结合的方式,例如:name
优点是后续数据绑定时可以乱序
● ODBC风格
使用?
优点是写法更简单
相关函数如下。
● bool QSqlQuery::prepare(const QString & query)
预处理SQL语句,参数是符合格式的预处理语句,返回值是预处理结果。
●

Oracle风格的绑定函数,可以把参数绑定到预处理语句中。
参数1:占位符
参数2:占位符对应的值,QVariant兼容所有Qt常见类型
● bool QSqlQuery::exec()
执行预处理的SQL语句,返回值是执行的结果
● void QSqlQuery::addBindValue(const QVariant & val)
ODBC风格的绑定函数
参数:占位符对应的值
● bool QSqlQuery::next()
取出下一条记录,如果取出成功,则后移。
● QVariant QSqlQuery::value(int index) const
● QVariant QSqlQuery::value(const QString & name) const
取出当前记录的某列数据,参数是列序号,从0开始;参数是列名。
模糊查询可以做到只输入查询关键字的一部分就查询出符合格式的数据。
模糊查询使用关键字LIKE,配合两个通配符。
● %
匹配任意个数的字符
● _
匹配任意一个字符
【例子】查询姓张的老师信息。
SELECT * FROM teacher WHERE name LIKE '张%';
【例子】查询兴字辈儿的老师信息。
SELECT * FROM teacher WHERE name LIKE '_兴%';
【例子】查询名称中包含晓的老师信息。
SELECT * FROM teacher WHERE name LIKE '%晓%';