CHAPTER 06
DBConnector 数据库连接
对应文件:
- 接口:
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)
流程:
mysql_querymysql_store_result- 获取字段元数据
mysql_num_fields/mysql_fetch_fields - 遍历每行
mysql_fetch_row - 组装
vector<map<string,string>> - 释放结果集
特点:
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 统计