MySQL的详细介绍与C++调用

1. MySQL介绍

此章节部分内容参考oracle官网文档:MySQL:了解这是什么以及如何使用

1.1 MySQL概述

MySQL是一个全球流行的关系型开源数据库管理系统(RDBMS,Relational Database Management System),MySQL已有约三十年的发展历史了,虽然与Oracle、DB2等大型数据库相比有诸多不足,但是应对中小型企业的项目开发已绰绰有余。

SQL 是结构化查询语言 (Structured Query Language) 的缩写,这是一种编程语言,适用于检索、更新、删除和以其他方式处理关系型数据库中的数据。而MySQL 则是一个基于 SQL 的关系数据库,旨在存储和管理结构化数据。

关系型数据库和非关系型数据库详细对比:

对比维度 关系型数据库 (RDBMS) 非关系型数据库 (NoSQL)
代表产品 SQLite、MySQL、PostgreSQL、Oracle、SQL Server MongoDB(文档型)、Redis(键值型)、HBase(列存储)、Neo4j(图数据库)
数据模型 基于关系模型,数据以二维表(行和列)形式存储,表与表之间通过外键关联 无固定模式,支持多种数据存储方式:
键值对(Key-Value):如 Redis
文档型(Document):如 MongoDB(JSON/BSON 格式)
列存储(Column-Family):如 HBase
图数据库(Graph):如 Neo4j
查询语言 使用SQL(结构化查询语言),支持复杂查询(JOIN、子查询、聚合函数等)。 无统一查询语言,不同数据库有各自的查询方式。如:MongoDB 使用类 JSON 查询语法;Redis 使用命令式 API;HBase 使用 Scan 和 Filter。
事务支持 强 ACID 特性(原子性、一致性、隔离性、持久性),适合金融、ERP 等需要严格事务的场景 大多数不支持完整 ACID,通常采用最终一致性(BASE)
– MongoDB 4.0+ 支持多文档事务
– Redis 支持部分事务(WATCH/MULTI/EXEC)
扩展性 垂直扩展(Scale Up)为主,单机性能强,但水平扩展(Scale Out)较复杂(如 MySQL 分库分表) 天生支持分布式架构,易于水平扩展,适合大数据、高并发场景:
– MongoDB 支持分片(Sharding)
– Redis 支持集群模式
性能 复杂查询性能高(如多表 JOIN),但高并发写入可能成为瓶颈 读写性能极高(如 Redis 可达 10万+ QPS),但复杂查询能力弱
适用场景 结构化数据,需要强一致性、复杂查询的应用,如:财务系统;ERP/CRM;传统业务系统。 半结构化/非结构化数据,需要高并发、低延迟、灵活 schema的应用,如:社交网络(用户动态);实时分析(日志、IoT);缓存(Redis)。
优点 数据一致性高(ACID)
标准化 SQL,学习成本低
成熟稳定,生态完善(ORM、BI 工具支持)
高性能(内存计算、分布式)
灵活 schema,适合快速迭代
水平扩展容易,适合大数据场景
缺点 schema 固定,修改表结构成本高
高并发写入性能差
水平扩展困难(分库分表复杂)
无统一标准,不同 NoSQL 数据库差异大
事务支持弱(多数仅支持单文档/单键事务)
复杂查询能力差(如多表关联)

1.2 MySQL核心特性与组件

MySQL具有以下核心特性:

  1. 高性能设计:采用多线程架构,支持高并发访问,优化了查询处理引擎,能够快速执行复杂查询。

  2. 可靠性保障:提供完整的ACID事务支持(原子性、一致性、隔离性、持久性),确保数据操作的可靠性。

  3. 跨平台支持:可在Windows、Linux、macOS等多种操作系统上运行,兼容性极佳。

  4. 存储引擎灵活:支持InnoDB、MyISAM等多种存储引擎,可根据应用场景选择最适合的引擎。

  5. 安全机制完善:提供用户权限管理、SSL加密连接、数据加密等安全功能。

  6. 可扩展性强:从嵌入式应用到TB级企业应用都能良好支持,支持主从复制、集群等扩展方案。

  7. 开源免费:社区版完全免费,拥有活跃的开源社区支持。

MySQL系统由以下几个核心组件构成:

  1. 连接管理器:负责处理客户端连接请求,管理线程池。

  2. 查询解析器:将SQL语句解析为内部表示形式,进行语法检查。

  3. 查询优化器:分析查询执行计划,选择最优执行路径。

  4. 存储引擎接口:提供统一的API供不同存储引擎实现。

  5. InnoDB存储引擎:默认的事务型引擎,支持行级锁定和外键。

  6. MyISAM存储引擎:非事务型引擎,适用于读密集型应用。

  7. 缓冲池:缓存表数据和索引,减少磁盘I/O。

  8. 日志系统:包括二进制日志、错误日志、慢查询日志等。

1.3 MySQL工作原理

像MySQL这样的关系型数据库将数据存储在许多单独的表中,而不是将所有数据存储在一个大仓库中。该数据库的结构由经过优化的文件组成,因此可以快速访问数据。这个逻辑数据模型,再加上数据表、视图、行以及列等对象,能够为开发人员和数据库管理员提供一个灵活的编程环境。

MySQL Database 是一个客户端/服务器系统,它由一个支持多种后端的多线程 SQL 服务器、多个客户端程序和库、一系列的管理工具以及广泛的应用编程接口 (API) 组成。同时,MySQL 可作为一个嵌入式多线程库,让开发人员可以链接到应用中,有助于构建开发规模更小、速度更快、更易于管理的独立产品。

MySQL的工作流程可分为以下几个阶段:

  1. 连接阶段(连接器-权限认证)客户端通过TCP/IP或套接字方式连接到MySQL服务器,并进行权限认证。

  2. 查询处理

    • (分析器-语法解析)SQL语句被解析为语法树
    • (优化器-执行计划)查询优化器生成执行计划
    • (执行器-调用存储引擎)执行引擎根据计划访问存储引擎
  3. 结果返回:存储引擎读写数据后,将执行结果通过连接返回给客户端

  4. 事务处理

    • 对于事务型操作,会记录undo/redo日志
    • 提交时确保日志持久化
  5. 并发控制:通过锁机制和MVCC(多版本并发控制)实现并发访问


2. MySQL安装

因本人项目都是WIN端的,故这里详细介绍WIN端的官网下载与安装。

2.1 Windows安装

  1. MySQL官网下载Windows安装包,自行选择需求的版本

  2. 运行安装向导,选择"Custom"安装类型自定义安装必要的组件即可

  3. 选择组件“Server”(服务)与“WorkBench”(工作台)

  4. 后续保持默认配置,运行安装,一直“Next”即可

  5. 直到配置root用户的密码

  6. 继续保持默认,一直“Next”即可,直至安装完成

  7. 可通过安装后的“MySQL Command Line Client”和“MySQL Workbench”访问数据库

    打开后输入root用户密码访问,能连接上说明服务已启动,正常运行中

  8. 注意:这个时候如果直接用系统的CMD中访问MySQL会发现找不到服务,是因为还需要在系统环境变量中配置一下环境变量以便全局访问

  9. 随后便可利用管理员启动CMD操控MySQL服务了

    注意:安装的服务名是“MySQL80”,若不是,可自行在系统服务中查看。

2.2 其他安装

2.2.1 Linux安装

对于Ubuntu/Debian系统:

sudo apt update
sudo apt install mysql-server
sudo mysql_secure_installation

对于CentOS/RHEL系统:

sudo yum install mysql-server
sudo systemctl start mysqld
sudo mysql_secure_installation

2.2.2 Docker安装

docker pull mysql:8.0
docker run --name mysql8 -e MYSQL_ROOT_PASSWORD=yourpassword -p 3306:3306 -d mysql:8.0


3. MySQL 命令

MySQL 提供了两种类型的命令:客户端命令SQL 语句

注意所有SQL语句实在MySQL控制台中使用的,SQL关键字虽然不区分大小写,但是建议保持大写,语句结尾要加分号(;)标识语句结束。

3.1 MySQL 命令

  1. MySQL服务管理

    注意使用正确的服务名,不确定的可自行在“系统服务”中查看

    # 启动 MySQL 服务
    net start MySQL80
    
    # 停止 MySQL 服务
    net stop MySQL80
  2. 连接数据库

    mysql -u 用户名 -p
    • -u 指定用户名,通常是 root;
    • -p 表示密码登录,执行命令后会提示输入密码。
    mysql -h 主机IP -u 用户名 -p -P 3306
    • -h 指定主机地址,例如:-h 192.168.1.100
    • -P(大写 P)指定端口,默认为 3306。
  3. 修改用户密码

    mysqladmin -u root -p 旧密码 password 新密码
    • -u 指定用户名,通常是 root;
    • -p 表示密码登录,执行命令后会提示输入密码。
  4. 查看当前用户及数据库信息(MySQL中SQL语法)

    -- 查看当前用户
    SELECT USER();
    
    -- 查看当前时间和日期
    SELECT NOW();
    
    -- 查看MySQL版本
    SELECT VERSION();
  5. 执行(导入)外部SQL文件(MySQL中SQL语法)

    SOURCE /path/to/file.sql
    \. /path/to/file.sql
  6. 其他客户端命令(MySQL中SQL语法)

    更多的可使用help命令查看。

    -- 显示服务器状态和版本信息(两种)
    STATUS;
    \s
    
    -- 显示帮助信息(两种)
    HELP;
    \h
    
    -- 取消当前正在输入的命令(两种)
    CLEAR;
    \c
    
    -- 退出MySQL客户端(三种)
    EXIT;
    \q
    QUIT;
    
    -- 改变命令结束符(常用于存储过程)
    DELIMITER //
  7. 其他对MySQL中数据库、表、数据、权限、事务等的控制见SQL语句

3.2 SQL 语言

详细操作指令和函数参照另一篇文章《SQL语言大全》

SQL(Structured Query Language)是用于与关系型数据库交互的标准语言。常见的 SQL 操作可以分为以下几类:

注意所有SQL语句实在MySQL控制台中使用的,SQL关键字虽然不区分大小写,但是建议保持大写,语句结尾要加分号(;)标识语句结束。

3.2.1 系统命令

命令 说明 示例
SHOW VARIABLES 显示系统变量 SHOW VARIABLES LIKE '%version%';
SHOW STATUS 显示服务器状态 SHOW STATUS LIKE 'Threads%';
EXPLAIN 分析SQL执行计划 EXPLAIN SELECT * FROM users WHERE age>18;
SHOW PROCESSLIST 查看当前连接进程 SHOW PROCESSLIST;

3.2.2 DDL(数据定义语言)

用于创建、修改和删除数据库对象(如表、索引等)。

命令 说明 示例
SHOW DATABASE 显示数据库 SHOW DATABASE;
CREATE DATABASE 创建数据库 CREATE DATABASE mydb;
USE 使用该数据库 USE mydb;
SHOW TABLES 显示当前数据库中的所有表 SHOW TABLES;
CREATE TABLE 创建表 CREATE TABLE users(id INT PRIMARY KEY, name VARCHAR(50));
ALTER TABLE 修改表结构 ALTER TABLE users ADD COLUMN email VARCHAR(100);
DROP TABLE 删除表 DROP TABLE users;
DESCRIBEDESC 查看表结构(字段名、类型、是否允许为空等) DESC users;
TRUNCATE TABLE 清空表数据(不可回滚) TRUNCATE TABLE users;
SHOW INDEX 显示表索引 SHOW INDEX FROM users;

3.2.3 DML(数据操作语言)

用于操作数据库中的数据记录。

命令 说明 示例
INSERT INTO 插入数据 INSERT INTO users(id,name) VALUES(1,'张三');
UPDATE 更新数据 UPDATE users SET name='李四' WHERE id=1;
DELETE 删除数据 DELETE FROM users WHERE id=1;
REPLACE INTO 替换数据(不存在则插入) REPLACE INTO users(id,name) VALUES(1,'王五');

3.2.4 DQL(数据查询语言)

用于查询数据库中的数据。

命令 说明 示例
SELECT 查询数据 SELECT * FROM users;
FROM 指定查询表 SELECT name FROM users;
WHERE 查询条件 SELECT * FROM users WHERE age>18;
GROUP BY 分组查询 SELECT age,COUNT(*) FROM users GROUP BY age;
HAVING 分组后筛选 SELECT age,COUNT(*) FROM users GROUP BY age HAVING COUNT(*)>1;
ORDER BY 排序 SELECT * FROM users ORDER BY age DESC;
LIMIT 限制返回记录数 SELECT * FROM users LIMIT 10;
JOIN...ON 表连接 SELECT u.name,o.order_no FROM users u JOIN orders o ON u.id=o.user_id;

3.2.5 DCL(数据控制语言)

用于控制数据库访问权限。

命令 说明 示例
GRANT 授予权限 GRANT SELECT ON mydb.* TO 'user1'@'localhost';
REVOKE 撤销权限 REVOKE SELECT ON mydb.* FROM 'user1'@'localhost';
CREATE USER 创建用户 CREATE USER 'user1'@'localhost' IDENTIFIED BY 'password';
ALTER USER 修改用户 ALTER USER 'user1'@'localhost' IDENTIFIED BY 'newpass';
DROP USER 删除用户 DROP USER 'user1'@'localhost';

3.2.6 TCL(事务控制语言)

用于管理数据库事务。

命令 说明 示例
START TRANSACTION 开始事务 START TRANSACTION;
COMMIT 提交事务 COMMIT;
ROLLBACK 回滚事务 ROLLBACK;
SAVEPOINT 设置保存点 SAVEPOINT sp1;
SET TRANSACTION 设置事务隔离级别 SET TRANSACTION ISOLATION LEVEL READ COMMITTED;


4. MySQL Workbench简述

workbench涉及的操作还是蛮多的,想要详细介绍workbench得需要不少篇幅。更惭愧的是对于我的项目,我用的也少,这里就简单介绍一下界面使用。

  1. 导航窗口,包含管理员信息与数据库信息,可在此窗口下方切换
  2. 信息窗口,图中显示当前选中的数据库
  3. 操作窗口,图中默认是SQL语句的脚本代码编写窗口
  4. 附着在SQL语句编写窗口,显示代码运行结果网格,以及电子编辑、字段类型、查询状态、执行计划几个窗口
  5. 代码运行日志

数据库信息,双击选中数据库再对齐进行操作。

工具栏介绍如下

  1. 新增SQL脚本
  2. 打开SQL脚本
  3. 显示当前数据库信息
  4. 新增数据库
  5. 新增表
  6. 新增视图
  7. 新增程序
  8. 新增函数

如下对SQL语句的脚本代码编辑窗口,依次为:

  1. 打开本地脚本文件
  2. 保存脚本文件
  3. 执行脚本
  4. 执行光标语句
  5. 对游标下的语句执行EXPLAIN
  6. 停止执行
  7. 选择是否再切换语句失败后继续执行SQL语句
  8. 提交事务
  9. 回滚事务
  10. 切换自动提交模式


5. MySQL Connector/C++库

此节部分内容参考官方文档

MySQL Connector/C++官方文档

MySQL Connector/C++官方手册

MySQL Connector/C++ 9.3.0 API

5.1 概述

MySQL Connector/C++ 是一个官方供 C 或 C++应用程序与 MySQL 数据库服务器通信的库,封装了底层细节,支持面向对象的编程范式,更适合现代C++的高效开发,同时,此库可以很方便的使用CMake链接调用。

当然,其不仅为C++程序提供了API,总的包括三种不同的API,这里就不详细介绍了,有需要的自行查看官方文档,如下:

5.2 环境配置

两种方式安装库:

  1. 安装并运行依赖库

    • 下载 MySQL Connector/C++
    • 解压后添加包含路径 include 和库路径 lib64/vsXXX 到 Visual Studio 项目的属性页中
    • 添加链接器依赖项:mysqlcppconn8.lib
    • 运行时依赖,将 mysqlcppconn8.dll 放置在可执行文件目录或系统路径中
  2. 使用 VCPKG 进行安装与维护(推荐)

    .\vcpkg install mysql-connector-cpp:x64-windows
    
    # 如果安装不了可能需要先克隆最新仓库
    git clone https://github.com/microsoft/vcpkg
    # 再运行引导脚本
    .\vcpkg\bootstrap-vcpkg.bat

项目调用时,CMake 配置示例:

find_package(mysqlcppconn REQUIRED)
include_directories(${MYSQLCPPCONN_INCLUDE_DIRS})
target_link_libraries(your_target PRIVATE mysqlcppconn)

5.3 基本使用

5.3.1 连接MySQL
  • 类:mysqlx::Session

  • 作用:管理与 MySQL 服务器的连接,是所有后续操作的入口。

  • 关键方法

    • Session(const string &host, int port, const string &user, const string &password):构造函数,用于建立连接。
    • getSchema(const string &name):获取指定名称的数据库模式。
    • startTransaction() / commit() / rollback():事务控制。
    • sql(const string &query):创建一个 SQL 执行语句对象。
    • close():关闭连接。
  • 典型示例

    // 建立连接并选择数据库
    #include 
    #include 
    
    int main() {
      try {
          // 创建会话并连接数据库
          mysqlx::Session session("localhost", 33060, "root", "your_password");
    
          // 使用某个数据库(例如 test_db)
          mysqlx::Schema schema = session.getSchema("test_db");
    
          std::cout << "Connected successfully to database: " << schema.getName() << std::endl;
    
          // 关闭连接
          session.close();
      } catch (const mysqlx::Error &err) {
          std::cerr << "Connection error: " << err.what() << std::endl;
          return 1;
      }
    
      return 0;
    }
5.3.2 操作数据库
  • 类:mysqlx::Schema

  • 作用:操作数据库(创建/删除表),可用于创建集合、查询集合或表格等。

  • 关键方法

    • createCollection(const string &name):创建一个 JSON 格式的集合(NoSQL 方式)。
    • getTable(const string &name):获取一个已存在的关系型表对象。
    • createTable(const string &name, bool replace):创建一个新表(不推荐,建议用原生 SQL)。
    • existsInDatabase():判断该 Schema 是否存在于数据库中。
  • 典型示例

    // 检查数据库是否存在并创建集合
    try {
      mysqlx::Session session("localhost", 33060, "root", "your_password");
      mysqlx::Schema schema = session.getSchema("test_db");
    
      if (!schema.existsInDatabase()) {
          std::cout << "Schema does not exist." << std::endl;
          return 1;
      }
    
      // 创建 NoSQL 风格集合
      mysqlx::Collection collection = schema.createCollection("users_collection", true);
    
      std::cout << "Collection created: " << collection.getName() << std::endl;
    
    } catch (const mysqlx::Error &e) {
      std::cerr << "Error handling schema: " << e.what() << std::endl;
    }
5.3.3 操作数据表
  • 类:mysqlx::Table

  • 作用:表示一个关系型数据表,支持插入、查询、更新、删除等标准 CRUD 操作。

  • 关键方法

    • insert().values(...).execute():插入数据。
    • select().where(...).execute():查询数据。
    • update().set(...).where(...).execute():更新数据。
    • remove().where(...).execute():删除数据。
  • 典型示例

    // CRUD 操作
    try {
      mysqlx::Session session("localhost", 33060, "root", "your_password");
      mysqlx::Schema schema = session.getSchema("test_db");
      mysqlx::Table table = schema.getTable("users");
    
      // 插入一条记录
      table.insert("id", "name", "age")
           .values(1, "张三", 28)
           .execute();
    
      // 查询数据
      mysqlx::RowResult rows = table.select("id", "name", "age")
                                     .where("age > 25")
                                     .execute();
    
      std::cout << "Query results:" << std::endl;
      for (const auto& row : rows) {
          std::cout << "ID: " << row[0].get() 
                    << ", Name: " << row[1].get()
                    << ", Age: " << row[2].get() << std::endl;
      }
    
      // 更新记录
      table.update()
           .set("age", 30)
           .where("name = '张三'")
           .execute();
    
      // 删除记录
      table.remove()
           .where("age < 20")
           .execute();
    
    } catch (const mysqlx::Error &e) {
      std::cerr << "Table operation error: " << e.what() << std::endl;
    }
5.3.4 执行SQL语句
  • 类:mysqlx::SqlStatement

  • 作用:允许开发者直接编写并执行原始 SQL 语句,适合复杂或特定逻辑的操作。

  • 关键方法

    • execute():执行 SQL 语句。
    • bind(...):绑定参数,防止 SQL 注入。
    • getResult():获取返回结果集。
  • 典型示例

    // 执行带参数的 SQL 查询
    try {
      mysqlx::Session session("localhost", 33060, "root", "your_password");
      mysqlx::Schema schema = session.getSchema("test_db");
    
      mysqlx::SqlStatement stmt = session.sql("SELECT id, name FROM users WHERE age > ?");
      stmt.bind(25); // 绑定参数
      mysqlx::SqlResult result = stmt.execute();
    
      std::cout << "Results of SQL query:" << std::endl;
      while (result.hasNext()) {
          mysqlx::Row row = result.fetchOne();
          std::cout << "ID: " << row[0] << ", Name: " << row[1] << std::endl;
      }
    
    } catch (const mysqlx::Error &e) {
      std::cerr << "SQL execution error: " << e.what() << std::endl;
    }
5.3.5 处理SQL执行结果
  • 类:mysqlx::SqlResult / mysqlx::RowResult

  • 作用:处理执行 SQL 或者 Table 操作后的结果集。

  • 关键方法

    • hasNext():是否有下一行结果。
    • fetchOne():获取下一行(返回 Row 对象)。
    • getAffectedItemsCount():获取受影响的行数。
    • getAutoIncrementValue():获取自增主键值。
    • getColumnCount():返回列数。
    • getColumnNames():返回列名列表。
  • 典型示例

    // 获取结果信息和列信息
    try {
      mysqlx::Session session("localhost", 33060, "root", "your_password");
      mysqlx::Schema schema = session.getSchema("test_db");
    
      mysqlx::SqlStatement stmt = session.sql("SELECT * FROM users");
      mysqlx::SqlResult result = stmt.execute();
    
      std::cout << "Number of columns: " << result.getColumnCount() << std::endl;
      std::cout << "Column names: ";
      for (const auto& name : result.getColumnNames()) {
          std::cout << name << " ";
      }
      std::cout << std::endl;
    
      std::cout << "Rows:" << std::endl;
      while (result.hasNext()) {
          mysqlx::Row row = result.fetchOne();
          for (size_t i = 0; i < row.getColumnCount(); ++i) {
              std::cout << row[i].get() << "\t";
          }
          std::cout << std::endl;
      }
    
    } catch (const mysqlx::Error &e) {
      std::cerr << "Result processing error: " << e.what() << std::endl;
    }


6. Qt SQL 库访问 MySQL

此节部分内容参考Qt SQL 官方文档

6.1 概述

Qt SQL 是 Qt 提供的一个用于与数据库进行交互的模块,其中包含了对多种数据库的支持,包括 MySQL。它封装了底层数据库操作,提供了统一的 C++ 接口,方便开发者在 Qt 应用中实现数据库连接、查询和更新等功能。

Qt SQL 并不直接提供 MySQL 驱动的实现,而是通过 QSqlDatabase 接口调用系统安装的 MySQL 客户端库(通常是 libmysql.dlllibmysqlclient.so)来完成实际通信。因此,使用 Qt SQL 访问 MySQL 前需确保系统已安装相应的 MySQL 客户端库。

Qt SQL 支持多种操作方式:

  • 使用 QSqlQuery 执行原始 SQL 语句
  • 使用 QSqlTableModel 进行表格数据绑定,适合 GUI 应用
  • 使用 QSqlRelationalTableModel 实现关系表映射
  • 可配合 QTableViewQListView 等控件实现数据库视图展示

6.2 环境配置

Qt 中 CMake 链接

find_package(Qt5 COMPONENTS Sql REQUIRED)
target_link_libraries(your_target PRIVATE Qt5::Sql)

6.3 基本使用

注意:可以直接使用总类#include <QtSql> ,也可以单独使用所需的类如下各小节所示。

6.3.1 连接MySQL

  • 类:QSqlDatabase

  • 作用:用于创建并管理数据库连接。

  • 关键方法:

    • addDatabase("QMYSQL"):添加 MySQL 类型数据库连接
    • setHostName():设置主机地址
    • setPort():设置端口号(默认 3306)
    • setDatabaseName():指定使用的数据库名
    • setUserName() / setPassword():登录凭据
    • open():尝试建立连接
    • close():关闭连接
  • 典型示例

    #include 
    #include 
    #include 
    
    int main() {
      QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
      db.setHostName("localhost");
      db.setPort(3306);
      db.setDatabaseName("test_db");
      db.setUserName("root");
      db.setPassword("your_password");
    
      if (!db.open()) {
          qDebug() << "Connection failed:" << db.lastError().text();
          return -1;
      }
    
      qDebug() << "Connected successfully to database: " << db.databaseName();
    
      db.close();
      return 0;
    }

6.3.2 操作数据库

  • 类:QSqlQuery

  • 作用:用于执行 SQL 查询、插入、更新、删除等操作。

  • 关键方法:

    • exec():执行 SQL 语句
    • next():遍历结果集
    • value(int index):获取当前行某列的值
    • prepare() + bindValue():预处理防止 SQL 注入
    • isActive():检查是否执行成功
    • lastInsertId():获取最后插入的自增 ID
  • 典型示例

    #include 
    #include 
    
    // 插入数据
    QSqlQuery query;
    query.prepare("INSERT INTO users (name, age) VALUES (?, ?)");
    query.addBindValue("张三");
    query.addBindValue(28);
    if (!query.exec()) {
      qDebug() << "Insert error:" << query.lastError().text();
    }
    
    // 查询数据
    query.exec("SELECT id, name FROM users WHERE age > 25");
    while (query.next()) {
      int id = query.value(0).toInt();
      QString name = query.value(1).toString();
      qDebug() << "ID:" << id << ", Name:" << name;
    }
    
    // 更新数据
    query.exec("UPDATE users SET age = 30 WHERE name = '张三'");
    
    // 删除数据
    query.exec("DELETE FROM users WHERE age < 20");

6.3.3 使用模型类(推荐用于 GUI 项目)

  • 类:QSqlTableModel

  • 作用:用于将数据库表以模型形式加载,方便与 Qt 视图组件绑定。

  • 关键方法:

    • setTable():绑定到一个表
    • select():刷新数据
    • setData():修改数据
    • submitAll():提交所有更改
    • revertAll():撤销未提交的更改
  • 典型示例(绑定到 QTableView)

    #include 
    #include 
    #include 
    
    int main(int argc, char *argv[]) {
      QApplication app(argc, argv);
    
      // 已经建立好的数据库连接
      QSqlDatabase db = QSqlDatabase::database();
    
      QSqlTableModel *model = new QSqlTableModel(db);
      model->setTable("users");
      model->select();
    
      QTableView view;
      view.setModel(model);
      view.show();
    
      return app.exec();
    }

6.3.4 执行带参数的 SQL 查询

  • 使用 prepare()bindValue() 方法可以安全地执行带参数的 SQL 语句,防止 SQL 注入攻击。

  • 典型示例

    QSqlQuery query;
    query.prepare("SELECT id, name FROM users WHERE age > ?");
    query.bindValue(0, 25); // 第一个 ? 参数值是 25
    
    if (!query.exec()) {
      qDebug() << "Query error:" << query.lastError().text();
    }
    
    while (query.next()) {
      qDebug() << "ID:" << query.value(0).toInt()
               << "Name:" << query.value(1).toString();
    }

6.3.5 错误处理与调试

  • 类:QSqlError

  • 获取错误信息的方法:

    • lastError():获取上一次操作的错误对象
    • text():获取错误描述文本
    • type():获取错误类型(NoError / ConnectionError / StatementError / TransactionError)
  • 典型示例

    if (!db.open()) {
      qDebug() << "Open database failed:" << db.lastError().text();
      return -1;
    }
    
    QSqlQuery query("SELECT * FROM invalid_table", db);
    if (!query.isActive()) {
      qDebug() << "Query failed:" << query.lastError().text();
    }


7. 各类MySQL接入库简述

库名 开发者 / 组织 支持语言 说明 优点 缺点
MySQL C API (libmysqlclient) Oracle 官方 C Oracle 提供的用于连接和操作 MySQL 的 C 语言库,它是所有 MySQL 库的基础。 原生性能高、底层控制强 非面向对象、C风格难用、容易出错
MySQL Connector/C++ Oracle 官方 C++ Oracle 封装的C++连接库,支持 X DevAPI 和经典 API。 官方支持、接口现代、X DevAPI丰富 配置稍复杂、依赖较多
Qt SQL (QtMySQL) Qt Project C++ Qt 框架中集成的数据库模块,支持通过 QSqlDatabase 访问 MySQL。 集成在 Qt 生态中,易上手 必须使用 Qt 框架
MySQL++ 原始 MySQL 团队 C++ 基于 MySQL C API 的轻量级封装,提供部分面向对象接口。 封装简单、历史项目兼容性好 不活跃维护、不支持现代 C++ 特性
libodb-mysql Code Synthesis C++ 基于代码生成的持久化框架,支持 MySQL,可自动映射数据库表结构。 类型安全、自动生成 ORM 层 学习曲线陡峭、需预编译
SOCI 社区驱动 C++ 轻量级的数据库访问库,提供统一接口用于多种数据库(包括 MySQL)。 跨数据库、语法简洁统一 ORM 功能较弱、文档不完整
Drogon ORM drogon.org 社区 C++17/20 构建于 Drogon Web 框架之上的异步 ORM 工具,支持 MySQL。 异步非阻塞、高性能、现代语法 依赖 Drogon 框架
cppdb 社区驱动 C++ 轻量级数据库封装库,支持多种后端(包括 MySQL)。 轻量级、跨平台 文档匮乏、社区小
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇