仓库代码地址
项目地址:DatabaseLayer
概述
在开发需要使用 MySQL 数据库的业务时,为了避免多人共享数据库时可能出现的冲突,可以先使用临时的 SQLite 数据库进行快速开发,然后在业务稳定后切换到 MySQL 数据库。DatabaseLayer 是一个支持 SQLite3 和 MySQL 的数据库封装工具,同时支持跨平台(Windows 和 Linux)。该工具的设计灵感来源于 CppSQLite 和 POCO 中的数据库实现。
特点
- 提供统一的 SQLite3 和 MySQL 操作接口。
- 简单易懂的代码封装,方便集成和使用。
- SQLite3 部分不依赖 STL,适用于嵌入式平台;MySQL 部分使用少量 STL,并支持跨平台。
- 不支持 Unicode。
- 更多细节和示例请查看示例文件夹中的例子。
对外头文件(DatabaseLayer.h)
// DatabaseLayer.h
#pragma once
#ifndef _CppDBLayer_H_
#define _CppDBLayer_H_
// 根据宏定义选择性地包含 SQLite3 或 MySQL 的头文件
#ifdef _SQLITE3_DB
#include "CppSQLite3.h"
#endif
#ifdef _MySQL_DB
#include "CppMySQL.h"
#endif
// 其他头文件和类的定义
...
#endif
使用示例及注意事项
#include <iostream>
#include "DatabaseLayer.h"
using namespace std;
#ifdef _SQLITE3_DB
const char* gszSQLiteDB = "CppSQLite3Demo.db";
#endif
#ifdef _MySQL_DB
const char* gszMySQLHost = "127.0.0.1";
const char* gszMySQLUser = "root";
const char* gszMySQLPassword = "root";
const char* gszMySQLDB = "CppMySQLDemo";
#endif
int main()
{
try
{
CppDB db;
#ifdef _SQLITE3_DB
// 使用 SQLite 数据库进行开发
db.open(gszSQLiteDB);
cout << "SQLite3 database connected." << endl;
#endif
#ifdef _MySQL_DB
// 使用 MySQL 数据库进行开发
db.connect(gszMySQLHost, gszMySQLUser, gszMySQLPassword);
db.dropDB(gszMySQLDB);
db.createDB(gszMySQLDB);
cout << "MySQL database connected." << endl;
#endif
// 示例:创建表格和插入数据
db.execDML("create table emp(empno int, empname char(20));");
db.execDML("insert into emp values (1, 'Alice');");
db.execDML("insert into emp values (2, 'Bob');");
// 示例:查询数据
CppDBQuery q = db.execQuery("select * from emp;");
while (!q.eof())
{
cout << "empno: " << q.getIntField("empno") << ", empname: " << q.getStringField("empname") << endl;
q.nextRow();
}
// 示例:事务操作
db.startTransaction();
db.execDML("insert into emp values (3, 'Charlie');");
db.execDML("delete from emp where empno = 1;");
db.commitTransaction();
cout << "Transaction committed." << endl;
// 示例:使用 CppDBResultSet
CppDBResultSet rs = db.getResultSet("select * from emp;");
while (!rs.eof())
{
cout << "empno: " << rs.getIntField("empno") << ", empname: " << rs.getStringField("empname") << endl;
rs.nextRow();
}
}
catch (CppDBException& e)
{
cerr << "Exception: " << e.errorCode() << " - " << e.errorMessage() << endl;
}
cout << "Press 'q' then enter to quit." << endl;
char c(' ');
cin >> c;
return 0;
}
注意事项
- 在切换数据库时,确保先关闭当前连接并清理资源,再打开新的连接。
- 每次操作数据库前,建议检查数据库是否已经连接。
- 使用事务操作时,务必确保在操作完成后提交事务,以避免数据不一致的情况发生。