DBConnector 数据库连接
C++ 后端服务器框架DBConnector 数据库连接
CHAPTER 06

DBConnector 数据库连接

2 分钟阅读 · 446 字

对应文件:

  • 接口:include/DBConnector.h
  • 实现:src/DBConnector.cpp

1. 模块定位

DBConnector 是 MySQL 访问封装,主要能力:

  • 单例管理
  • 建连
  • 查询(SELECT)
  • 执行(INSERT/UPDATE/DELETE)
  • 错误信息获取
  • SQL 字面量转义

2. 单例模型

关键静态成员:

  • DBConnector* instance_
  • std::mutex mutex_

初始化与获取:

  • initInstance(host, user, passwd, dbname, port)
  • getInstance()
  • destroyInstance()

行为说明:

  • initInstance 内部加锁,重复初始化不会覆盖现有实例
  • getInstance 在未初始化时抛异常

3. 核心函数实现

3.1 构造与析构

  • 构造时调用 mysql_init 初始化句柄
  • 若失败抛 runtime_error
  • 析构时 mysql_close(db_)

3.2 connect()

  • 设置字符集:MYSQL_SET_CHARSET_NAME = utf8mb4
  • 调用 mysql_real_connect
  • 失败时写入 last_error_

3.3 query(sql)

流程:

  1. mysql_query
  2. mysql_store_result
  3. 获取字段元数据 mysql_num_fields/mysql_fetch_fields
  4. 遍历每行 mysql_fetch_row
  5. 组装 vector<map<string,string>>
  6. 释放结果集

特点:

  • NULL 列值转为空字符串
  • 便于上层快速使用,但丢失类型信息(都变成字符串)

3.4 execute(sql)

  • 执行 mysql_query
  • 返回 mysql_affected_rows
  • 失败返回 -1

3.5 escapeSqlLiteral(value)

  • 手工转义 \0 \n \r \t \b \x1A、反斜杠、单引号
  • 用于减少拼接 SQL 时注入风险

4. 错误模型

  • 模块内部以 last_error_ 保存最近错误
  • 调用方可通过 getError() 获取

5. 优点与限制

优点:

  • API 简单,容易接入
  • 覆盖连接、查询、执行最小闭环

限制:

  • 当前是单连接句柄模型,不是连接池
  • 查询结果全字符串化,不保留原始列类型
  • 缺少事务辅助接口(begin/commit/rollback)
  • 缺少 prepared statement 封装

6. 改进建议

  • 引入连接池(最小空闲、最大连接、健康检查)
  • 增加参数化查询接口,替代字符串拼接
  • 增加事务与批处理 API
  • 增加超时、重连和慢 SQL 统计
全部章节