內容提要
介紹資料庫相關內容,瞭解連線資料庫方法,掌握資料庫的4種基本操作
主要內容
如何連線資料庫
資料庫的4大基本操作
增
刪
改
查
1。如何連線資料庫
1。1 先了解資料庫驅動的作用
Qt SQL模組是Qt提供的一個訪問資料庫的介面,支援多種平臺下使用不同型別的資料庫,在這個過程中,
資料庫驅動
起到了很大的作用,它負責與不同的資料庫進行通訊,有了資料庫驅動,我們才能使用不同型別的資料庫。
以下是Qt支援的資料庫驅動
如何檢視當前版本Qt支援的資料庫驅動
step1 新建一個專案Qt widgets專案,名稱為myDataBaseDrivers,基類為QWidget
step2 在專案的。pro檔案中,增加一條語句
QT
+=
sql
step3 在 widget。h 中,新增以下程式碼
#include
#include
step4 在 widget。cpp 中,新增以下程式碼
qDebug
()
<<
QSqlDatabase
::
drivers
();
此時程式應該是這樣的
step5 Ctrl+r 執行程式,觀察執行結果
從結果可以看出,沒有MYSQL資料庫的驅動,那我現在想使用這個資料庫是不行的,需要新增這個驅動,詳細的新增方法請看下面這個文章。
1。2 連線資料庫
要想連線資料庫,我們可以透過QSqlDatabase類實現。連線的方法也很簡單,參考下面的程式碼
// 建立一個數據庫連線,指定資料庫驅動
QSqlDatabase
db
=
QSqlDatabase
::
addDatabase
(
“QMYSQL”
);
設定資料庫資訊
// 資料庫連線需要設定的資訊
db
。
setHostName
(
“127。0。0。1”
);
// 資料庫伺服器IP,我用的是本地電腦
db
。
setDatabaseName
(
“ceshi”
);
// 資料庫名
db
。
setUserName
(
“root”
);
// 使用者名稱
db
。
setPassword
(
“123456”
);
// 密碼
db
。
setPort
(
3306
);
// 埠號
連線資料庫
// 連線資料庫
bool
ok
=
db
。
open
();
if
(
ok
)
{
qDebug
()
<<
“database connect is ok”
;
}
else
{
qDebug
()
<<
“database connect is fail”
;
}
此時程式應該是這樣的
Ctrl+r的執行結果是這樣的
另外需要注意的是,QSqlDatabase::addDatabase()函式的第一個引數,是指定資料庫的型別,如“QPSQL”,“QMYSQL”,第二個引數是 connectionName。如果在多執行緒裡訪問資料庫,每個執行緒都需要使用不同的 connectionName,否則可能會出現錯誤。
為了便於使用,將上面的資料庫連線封裝成一個函式
widget。h檔案修改,增加兩個函式宣告
private
:
void
createConnectionByName
(
const
QString
&
connectionName
);
//使用自定義 connectionName 建立連線
QSqlDatabase
getConnectionByName
(
const
QString
&
connectionName
);
// 使用自定義 connectionName 獲取連線
widget。cpp檔案修改,實現上述兩個函式
//使用自定義 connectionName 建立連線
void
Widget
::
createConnectionByName
(
const
QString
&
connectionName
){
QSqlDatabase
db
=
QSqlDatabase
::
addDatabase
(
“QMYSQL”
,
connectionName
);
// 資料庫連線需要設定的資訊
db
。
setHostName
(
“127。0。0。1”
);
// 資料庫伺服器IP,我用的是本地電腦
db
。
setDatabaseName
(
“ceshi”
);
// 資料庫名
db
。
setUserName
(
“root”
);
// 使用者名稱
db
。
setPassword
(
“123456”
);
// 密碼
db
。
setPort
(
3306
);
// 埠號
// 連線資料庫判斷
bool
ok
=
db
。
open
();
if
(
ok
){
qDebug
()
<<
“database connect is ok”
;
}
else
{
qDebug
()
<<
“database connect is fail”
;
}
}
// 使用自定義 connectionName 獲取連線
QSqlDatabase
Widget
::
getConnectionByName
(
const
QString
&
connectionName
)
{
// 獲取資料庫連線
return
QSqlDatabase
::
database
(
connectionName
);
}
函式呼叫
// 建立名為 firstConnect 的資料庫連線
createConnectionByName
(
“firstConnect”
);
修改後程式碼應該是這樣的
2。資料庫的4大基本操作
Qt裡要執行SQL語句和瀏覽查詢結果,通常使用QSqlQuery這個類來實現。
QSqlQuery常用函式整理
資料庫SQL的幾個常用的基本語法
2。1 增
增
操作就是想資料庫中插入輸入,在做增操作前,我們需要先建立一個數據庫表,用於做增刪改查操作測試。核心SQL語句是
insert into 表名 (欄位名1,欄位名2,。。。欄位名N) value (值1,值2,。。。值N)
step1 在前面程式碼的基礎上,向 widget。h 檔案中,增加一個頭檔案
#include
step2 在 widget。cpp 中,增加建立資料庫表的語句
// 例項化QSqlQuery,用於執行sql語句
QSqlQuery
query
(
db
);
// 建立一個表
query
。
exec
(
“create table newUser (id int primary key,username varchar(20))”
);
建立的這個表很簡單,只有id和uername兩項資訊
step3 在 widget。h 增加函式宣告
private
:
void
insertUserName
(
QSqlDatabase
db
,
const
int
&
userid
,
const
QString
&
name
);
// 增操作
step4 在 widget。cpp 實現增函式,用名稱繫結的方式實現
/*
* 功能描述:資料增操作
* 向資料庫中插入一條資料記錄,名稱繫結的方式實現
* @param QSqlDatabase:資料庫連線
* @param id:使用者id
* @param username:使用者名稱
*/
void
Widget
::
insertUserName
(
QSqlDatabase
db
,
const
int
&
userid
,
const
QString
&
name
)
{
QSqlQuery
query
(
db
);
query
。
prepare
(
“INSERT INTO newUser (id, username) VALUES (:id, :username)”
);
query
。
bindValue
(
“:id”
,
userid
);
query
。
bindValue
(
“:username”
,
name
);
query
。
exec
();
}
step5 向資料庫表中增加資料,實現增操作
// [2]增操作
qDebug
()
<<
“—— insert operation start——”
;
insertUserName
(
db
,
1
,
“xiaoqiao”
);
insertUserName
(
db
,
2
,
“wang”
);
query
。
exec
(
“INSERT INTO newUser (id, username) VALUES (3, ‘alex’)”
);
insertUserName
(
db
,
4
,
“lili”
);
queryAllUser
(
db
);
// 查詢增操作結果
qDebug
()
<<
“—— insert operation end——- ”
<<
“
\n
”
;
插入一條資料記錄可以使用名稱繫結的方式,也是可以直接使用一條SQL語句的方式,當需要插入多條資料時,可以考慮用名稱繫結的方式,這樣不需要每次都寫非常長的資料庫指令,相對來說方便一些。
此是程式碼應該是這樣的
step6 ctrl+r 執行程式 使用後面查操作,可以看到增加到資料庫的新資料記錄
2。2 刪
刪操作就是從資料庫中刪除資料記錄,核心SQL語句是
delete from 表名 where 刪除條件
step1 在 widget。h 增加函式宣告
private
:
void
deleteUser
(
QSqlDatabase
db
,
const
QString
&
username
);
// 刪操作
step2 在 widget。cpp 實現刪函式,用名稱繫結的方式實現
/*
* 功能描述:資料刪操作
* 從資料庫中刪除一條資料,名稱繫結的方式實現
* @param QSqlDatabase:資料庫連線
* @param username:使用者名稱
*/
void
Widget
::
deleteUser
(
QSqlDatabase
db
,
const
QString
&
username
)
{
QSqlQuery
query
(
db
);
query
。
prepare
(
“DELETE FROM newUser WHERE username=:username”
);
query
。
bindValue
(
“:username”
,
username
);
query
。
exec
();
}
step3 呼叫剛才寫的程式碼,實現刪除記錄操作
// [4]刪操作
qDebug
()
<<
“—— delete operation start——”
;
deleteUser
(
db
,
“alex”
);
query
。
exec
(
“ DELETE FROM newUser WHERE username=‘wang’ ”
);
queryAllUser
(
db
);
qDebug
()
<<
“—— query operation end——”
<<
“
\n
”
;
兩種方式刪除記錄,名稱繫結的方式和直接使用SQL語句的方式
此時程式碼應該是這樣的
step4 ctrl+r 執行程式
使用後面查操作,可以看到刪操作後,資料庫的記錄變化
2。3 改
改操作就是修改資料庫記錄,核心SQL語句是
update 表名 set 欄位名1=新值1,欄位名2=新值2 where 條件語句
step1 在 widget。h 增加函式宣告
private
:
void
updateUser
(
QSqlDatabase
db
,
const
int
&
id
,
const
QString
&
username
);
// 更操作,修改資料
step2 在 widget。cpp 實現該操作函式
/*
* 功能描述:更新資料
* 修改傳入的 id 的 username
* @param QSqlDatabase:資料庫連線
* @param id:使用者id
* @param username:使用者名稱
*/
void
Widget
::
updateUser
(
QSqlDatabase
db
,
const
int
&
id
,
const
QString
&
username
)
{
QSqlQuery
query
(
db
);
query
。
prepare
(
“update newUser set username=:username WHERE id=:id”
);
query
。
bindValue
(
“:id”
,
id
);
query
。
bindValue
(
“:username”
,
username
);
query
。
exec
();
}
step3 呼叫剛才寫的程式碼,實現查詢記錄操作
// [5]改操作,根據id修改資料
qDebug
()
<<
“—— update operation start——”
;
qDebug
()
<<
“—— before update id 1: ——”
;
queryAllUser
(
db
);
updateUser
(
db
,
1
,
“yase”
);
// ID為1,資料修改為 yase
query
。
exec
(
“ update newUser set username=‘newname’ WHERE id=4”
);
qDebug
()
<<
“—— after update id 1: ——”
;
queryAllUser
(
db
);
qDebug
()
<<
“—— update operation end——”
<<
“
\n
”
;
此時程式碼應該是這樣的
step4 ctrl+r 執行程式,檢視結果
2。4 查
查操作就是查詢資料庫記錄,核心SQL語句是
select * from 表名
select 欄位名1,欄位名2 from 表名 where 查詢條件
step1 在 widget。h 增加函式宣告
private
:
void
queryAllUser
(
QSqlDatabase
db
);
// 查操作,查詢所有資料記錄
void
selectQueryUser
(
QSqlDatabase
db
,
const
QString
&
username
);
// 查操作,直接執行SQL語句方式
void
preparedQueryUser
(
QSqlDatabase
db
,
const
QString
&
username
);
// 查操作,名稱繫結方式
step2 在 widget。cpp 實現查詢函式
查詢所有資料
/*
* 功能描述:資料查操作,查詢所有資料
* 執行SQL語句的方式,查詢所有的使用者資料記錄
* @param QSqlDatabase:資料庫連線
*/
void
Widget
::
queryAllUser
(
QSqlDatabase
db
)
{
QString
sql
=
“SELECT id, username FROM newUser”
;
// 組裝sql語句
QSqlQuery
query
(
db
);
// [1] 傳入資料庫連線
query
。
exec
(
sql
);
// [2] 執行sql語句
while
(
query
。
next
())
{
// [3] 遍歷查詢結果
qDebug
()
<<
QString
(
“Id: %1, Username: %2”
)
。
arg
(
query
。
value
(
“id”
)。
toInt
())
。
arg
(
query
。
value
(
“username”
)。
toString
());
}
}
查詢一條資料,直接用sql的方式
/*
* 功能描述:查詢一條資料記錄
* 資料查操作,SQL語句的方式實現
* @param QSqlDatabase:資料庫連線
* @param username:使用者名稱
*/
void
Widget
::
selectQueryUser
(
QSqlDatabase
db
,
const
QString
&
username
)
{
QString
sql
=
“SELECT * FROM newUser WHERE username=‘”
+
username
+
“’”
;
QSqlQuery
query
(
db
);
// [1] 傳入資料庫連線
query
。
exec
(
sql
);
// [2] 執行sql語句
while
(
query
。
next
())
{
// [3] 遍歷查詢結果
qDebug
()
<<
QString
(
“Id: %1, Username: %2”
)
。
arg
(
query
。
value
(
“id”
)。
toInt
())
。
arg
(
query
。
value
(
“username”
)。
toString
());
}
}
查詢一條資料,名稱繫結的方式
/*
* 功能描述:查詢一條資料記錄
* 資料查操作,名稱繫結的方式實現
* @param QSqlDatabase:資料庫連線
* @param username:使用者名稱
*/
void
Widget
::
preparedQueryUser
(
QSqlDatabase
db
,
const
QString
&
username
)
{
QString
sql
=
“SELECT * FROM newUser WHERE username=:username”
;
QSqlQuery
query
(
db
);
// [1] 傳入資料庫連線
query
。
prepare
(
sql
);
// [2] 使用名稱繫結的方式解析 SQL 語句
query
。
bindValue
(
“:username”
,
username
);
// [3] 把佔位符替換為傳入的引數
query
。
exec
();
// [4] 執行資料庫操作
while
(
query
。
next
())
{
// [5] 遍歷查詢結果
qDebug
()
<<
QString
(
“Id: %1, Username: %2”
)
。
arg
(
query
。
value
(
“id”
)。
toInt
())
。
arg
(
query
。
value
(
“username”
)。
toString
());
}
}
step3 呼叫剛才寫的程式碼,實現查詢記錄操作
查詢所有資料
qDebug
()
<<
“—— query all data start——- ”
;
queryAllUser
(
db
);
// 查詢所有資料
qDebug
()
<<
“—— query all data end——- ”
<<
“
\n
”
;
名稱繫結的方式查詢一條資料記錄
preparedQueryUser
(
db
,
“wang”
);
直接用SQL語句的方式查詢一條資料記錄
selectQueryUser
(
db
,
“lili”
);
// 直接執行sql語句方式
此時程式碼應該是這樣的
step4 ctrl+r 執行程式
以上只是簡單的實現增刪改查操作,實際開發應用的時候,會比這個複雜,但是基本的實現過程是一樣的,想了解資料庫的其他操作,可以找找資料庫相關的文件看一下。
添附
myDataBaseDrivers 專案 widget。h 原始碼
#ifndef WIDGET_H
#define WIDGET_H
#include
#include
#include
#include
QT_BEGIN_NAMESPACE
namespace
Ui
{
class
Widget
;
}
QT_END_NAMESPACE
class
Widget
:
public
QWidget
{
Q_OBJECT
public
:
Widget
(
QWidget
*
parent
=
nullptr
);
~
Widget
();
private
:
void
updateUser
(
QSqlDatabase
db
,
const
int
&
id
,
const
QString
&
username
);
// 更操作,修改資料
void
queryAllUser
(
QSqlDatabase
db
);
// 查操作,查詢所有資料記錄
void
selectQueryUser
(
QSqlDatabase
db
,
const
QString
&
username
);
// 查操作,直接執行SQL語句方式
void
preparedQueryUser
(
QSqlDatabase
db
,
const
QString
&
username
);
// 查操作,名稱繫結方式
void
deleteUser
(
QSqlDatabase
db
,
const
QString
&
username
);
// 刪操作
void
insertUserName
(
QSqlDatabase
db
,
const
int
&
userid
,
const
QString
&
name
);
// 增操作
void
createConnectionByName
(
const
QString
&
connectionName
);
//使用自定義 connectionName 建立連線
QSqlDatabase
getConnectionByName
(
const
QString
&
connectionName
);
// 使用自定義 connectionName 獲取連線
Ui
::
Widget
*
ui
;
};
#endif
// WIDGET_H
myDataBaseDrivers 專案 widget。cpp 原始碼
#include
“widget。h”
#include
“ui_widget。h”
Widget
::
Widget
(
QWidget
*
parent
)
:
QWidget
(
parent
)
,
ui
(
new
Ui
::
Widget
)
{
ui
->
setupUi
(
this
);
// 獲取資料庫驅動列表
qDebug
()
<<
QSqlDatabase
::
drivers
();
// [1]建立名為 firstConnect 的資料庫連線
createConnectionByName
(
“firstConnect”
);
// 獲取資料庫
QSqlDatabase
db
=
getConnectionByName
(
“firstConnect”
);
// 例項化QSqlQuery,用於執行sql語句
QSqlQuery
query
(
db
);
// 建立一個表
query
。
exec
(
“create table newUser (id int primary key,username varchar(20))”
);
// [2]增操作
qDebug
()
<<
“—— insert operation start——”
;
insertUserName
(
db
,
1
,
“xiaoqiao”
);
insertUserName
(
db
,
2
,
“wang”
);
query
。
exec
(
“INSERT INTO newUser (id, username) VALUES (3, ‘alex’)”
);
insertUserName
(
db
,
4
,
“lili”
);
queryAllUser
(
db
);
// 查詢增操作結果
qDebug
()
<<
“—— insert operation end——- ”
<<
“
\n
”
;
// [3]查詢操作
qDebug
()
<<
“—— query operation start——- ”
;
selectQueryUser
(
db
,
“lili”
);
// 直接執行sql語句方式
preparedQueryUser
(
db
,
“wang”
);
qDebug
()
<<
“—— query operation end——- ”
<<
“
\n
”
;
qDebug
()
<<
“—— query all data start——- ”
;
queryAllUser
(
db
);
// 查詢所有資料
qDebug
()
<<
“—— query all data end——- ”
<<
“
\n
”
;
// [4]刪操作
qDebug
()
<<
“—— delete operation start——”
;
deleteUser
(
db
,
“alex”
);
query
。
exec
(
“ DELETE FROM newUser WHERE username=‘wang’ ”
);
queryAllUser
(
db
);
qDebug
()
<<
“—— query operation end——”
<<
“
\n
”
;
// [5]改操作,根據id修改資料
qDebug
()
<<
“—— update operation start——”
;
qDebug
()
<<
“—— before update id 1: ——”
;
queryAllUser
(
db
);
updateUser
(
db
,
1
,
“yase”
);
// ID為1,資料修改為 yase
query
。
exec
(
“ update newUser set username=‘newname’ WHERE id=4”
);
qDebug
()
<<
“—— after update id 1: ——”
;
queryAllUser
(
db
);
qDebug
()
<<
“—— update operation end——”
<<
“
\n
”
;
// 僅僅是測試需要,刪除資料表中的所有資料,為了不影響下次執行程式觀察結果
query
。
exec
(
“ DELETE FROM newUser”
);
}
/*
* 功能描述:更新資料
* 修改傳入的 id 的 username
* @param QSqlDatabase:資料庫連線
* @param id:使用者id
* @param username:使用者名稱
*/
void
Widget
::
updateUser
(
QSqlDatabase
db
,
const
int
&
id
,
const
QString
&
username
)
{
QSqlQuery
query
(
db
);
query
。
prepare
(
“update newUser set username=:username WHERE id=:id”
);
query
。
bindValue
(
“:id”
,
id
);
query
。
bindValue
(
“:username”
,
username
);
query
。
exec
();
}
/*
* 功能描述:資料查操作,查詢所有資料
* 執行SQL語句的方式,查詢所有的使用者資料記錄
* @param QSqlDatabase:資料庫連線
*/
void
Widget
::
queryAllUser
(
QSqlDatabase
db
)
{
QString
sql
=
“SELECT id, username FROM newUser”
;
// 組裝sql語句
QSqlQuery
query
(
db
);
// [1] 傳入資料庫連線
query
。
exec
(
sql
);
// [2] 執行sql語句
while
(
query
。
next
())
{
// [3] 遍歷查詢結果
qDebug
()
<<
QString
(
“Id: %1, Username: %2”
)
。
arg
(
query
。
value
(
“id”
)。
toInt
())
。
arg
(
query
。
value
(
“username”
)。
toString
());
}
}
/*
* 功能描述:查詢一條資料記錄
* 資料查操作,SQL語句的方式實現
* @param QSqlDatabase:資料庫連線
* @param username:使用者名稱
*/
void
Widget
::
selectQueryUser
(
QSqlDatabase
db
,
const
QString
&
username
)
{
QString
sql
=
“SELECT * FROM newUser WHERE username=‘”
+
username
+
“’”
;
QSqlQuery
query
(
db
);
// [1] 傳入資料庫連線
query
。
exec
(
sql
);
// [2] 執行sql語句
while
(
query
。
next
())
{
// [3] 遍歷查詢結果
qDebug
()
<<
QString
(
“Id: %1, Username: %2”
)
。
arg
(
query
。
value
(
“id”
)。
toInt
())
。
arg
(
query
。
value
(
“username”
)。
toString
());
}
}
/*
* 功能描述:查詢一條資料記錄
* 資料查操作,名稱繫結的方式實現
* @param QSqlDatabase:資料庫連線
* @param username:使用者名稱
*/
void
Widget
::
preparedQueryUser
(
QSqlDatabase
db
,
const
QString
&
username
)
{
QString
sql
=
“SELECT * FROM newUser WHERE username=:username”
;
QSqlQuery
query
(
db
);
// [1] 傳入資料庫連線
query
。
prepare
(
sql
);
// [2] 使用名稱繫結的方式解析 SQL 語句
query
。
bindValue
(
“:username”
,
username
);
// [3] 把佔位符替換為傳入的引數
query
。
exec
();
// [4] 執行資料庫操作
while
(
query
。
next
())
{
// [5] 遍歷查詢結果
qDebug
()
<<
QString
(
“Id: %1, Username: %2”
)
。
arg
(
query
。
value
(
“id”
)。
toInt
())
。
arg
(
query
。
value
(
“username”
)。
toString
());
}
}
/*
* 功能描述:資料刪操作
* 從資料庫中刪除一條資料,名稱繫結的方式實現
* @param QSqlDatabase:資料庫連線
* @param username:使用者名稱
*/
void
Widget
::
deleteUser
(
QSqlDatabase
db
,
const
QString
&
username
)
{
QSqlQuery
query
(
db
);
query
。
prepare
(
“DELETE FROM newUser WHERE username=:username”
);
query
。
bindValue
(
“:username”
,
username
);
query
。
exec
();
}
/*
* 功能描述:資料增操作
* 向資料庫中插入一條資料記錄,名稱繫結的方式實現
* @param QSqlDatabase:資料庫連線
* @param id:使用者id
* @param username:使用者名稱
*/
void
Widget
::
insertUserName
(
QSqlDatabase
db
,
const
int
&
userid
,
const
QString
&
name
)
{
QSqlQuery
query
(
db
);
query
。
prepare
(
“INSERT INTO newUser (id, username) VALUES (:id, :username)”
);
query
。
bindValue
(
“:id”
,
userid
);
query
。
bindValue
(
“:username”
,
name
);
query
。
exec
();
}
/*
* 功能描述:建立資料庫連線
* 使用自定義 connectionName 建立連線
* @param connectionName:連線的名稱
*/
void
Widget
::
createConnectionByName
(
const
QString
&
connectionName
){
QSqlDatabase
db
=
QSqlDatabase
::
addDatabase
(
“QMYSQL”
,
connectionName
);
// 資料庫連線需要設定的資訊
db
。
setHostName
(
“127。0。0。1”
);
// 資料庫伺服器IP,我用的是本地電腦
db
。
setDatabaseName
(
“ceshi”
);
// 資料庫名
db
。
setUserName
(
“root”
);
// 使用者名稱
db
。
setPassword
(
“123456”
);
// 密碼
db
。
setPort
(
3306
);
// 埠號
// 連線資料庫判斷
bool
ok
=
db
。
open
();
if
(
ok
){
qDebug
()
<<
“database connect is ok”
;
}
else
{
qDebug
()
<<
“database connect is fail”
;
}
}
/*
* 功能描述:獲取資料庫連線
* 使用自定義 connectionName 獲取連線
* @param connectionName:連線的名稱
* @return 返回一個數據庫連線
*/
QSqlDatabase
Widget
::
getConnectionByName
(
const
QString
&
connectionName
)
{
// 獲取資料庫連線
return
QSqlDatabase
::
database
(
connectionName
);
}
Widget
::~
Widget
()
{
delete
ui
;
}