內容提要

介紹資料庫相關內容,瞭解連線資料庫方法,掌握資料庫的4種基本操作

主要內容

如何連線資料庫

資料庫的4大基本操作

1。如何連線資料庫

1。1 先了解資料庫驅動的作用

Qt SQL模組是Qt提供的一個訪問資料庫的介面,支援多種平臺下使用不同型別的資料庫,在這個過程中,

資料庫驅動

起到了很大的作用,它負責與不同的資料庫進行通訊,有了資料庫驅動,我們才能使用不同型別的資料庫。

以下是Qt支援的資料庫驅動

Qt零基礎系列10:使用Qt如何操作資料庫

如何檢視當前版本Qt支援的資料庫驅動

step1 新建一個專案Qt widgets專案,名稱為myDataBaseDrivers,基類為QWidget

Qt零基礎系列10:使用Qt如何操作資料庫

step2 在專案的。pro檔案中,增加一條語句

QT

+=

sql

Qt零基礎系列10:使用Qt如何操作資料庫

step3 在 widget。h 中,新增以下程式碼

#include

#include

step4 在 widget。cpp 中,新增以下程式碼

qDebug

()

<<

QSqlDatabase

::

drivers

();

此時程式應該是這樣的

Qt零基礎系列10:使用Qt如何操作資料庫

Qt零基礎系列10:使用Qt如何操作資料庫

step5 Ctrl+r 執行程式,觀察執行結果

Qt零基礎系列10:使用Qt如何操作資料庫

從結果可以看出,沒有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”

}

此時程式應該是這樣的

Qt零基礎系列10:使用Qt如何操作資料庫

Ctrl+r的執行結果是這樣的

Qt零基礎系列10:使用Qt如何操作資料庫

另外需要注意的是,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”

);

修改後程式碼應該是這樣的

Qt零基礎系列10:使用Qt如何操作資料庫

Qt零基礎系列10:使用Qt如何操作資料庫

2。資料庫的4大基本操作

Qt裡要執行SQL語句和瀏覽查詢結果,通常使用QSqlQuery這個類來實現。

QSqlQuery常用函式整理

Qt零基礎系列10:使用Qt如何操作資料庫

資料庫SQL的幾個常用的基本語法

Qt零基礎系列10:使用Qt如何操作資料庫

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語句的方式,當需要插入多條資料時,可以考慮用名稱繫結的方式,這樣不需要每次都寫非常長的資料庫指令,相對來說方便一些。

此是程式碼應該是這樣的

Qt零基礎系列10:使用Qt如何操作資料庫

Qt零基礎系列10:使用Qt如何操作資料庫

Qt零基礎系列10:使用Qt如何操作資料庫

step6 ctrl+r 執行程式 使用後面查操作,可以看到增加到資料庫的新資料記錄

Qt零基礎系列10:使用Qt如何操作資料庫

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語句的方式

此時程式碼應該是這樣的

Qt零基礎系列10:使用Qt如何操作資料庫

Qt零基礎系列10:使用Qt如何操作資料庫

step4 ctrl+r 執行程式

使用後面查操作,可以看到刪操作後,資料庫的記錄變化

Qt零基礎系列10:使用Qt如何操作資料庫

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

此時程式碼應該是這樣的

Qt零基礎系列10:使用Qt如何操作資料庫

Qt零基礎系列10:使用Qt如何操作資料庫

step4 ctrl+r 執行程式,檢視結果

Qt零基礎系列10:使用Qt如何操作資料庫

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語句方式

此時程式碼應該是這樣的

Qt零基礎系列10:使用Qt如何操作資料庫

Qt零基礎系列10:使用Qt如何操作資料庫

Qt零基礎系列10:使用Qt如何操作資料庫

step4 ctrl+r 執行程式

Qt零基礎系列10:使用Qt如何操作資料庫

以上只是簡單的實現增刪改查操作,實際開發應用的時候,會比這個複雜,但是基本的實現過程是一樣的,想了解資料庫的其他操作,可以找找資料庫相關的文件看一下。

添附

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

}