C++:数据库的通用接口设计
C++ : Generic interface design for Database
我有一个类,用于创建与数据库的连接:
class DBHandler
{
public:
DBHandler();
~DBHandler();
int connect();
int execQuery( string query);
string getField( int row, int col);
};
现在有另一个类用于从数据库中获取一些信息,
class DBManager
{
public:
DBManager();
~DBManager();
//Approach 1
string getUsername()
{
//create a query here and use object of DBHandler class to execute it.
}
//Approach 2
string getUsername (struct QueryDetails& qDetails)
{
//create query using fields of structure and execute the query using DBHandler class.
}
};
现在问题来了:
1)我应该遵循哪种方法:
- A)如果我使用方法1,那么我需要硬编码查询
- B) 如果我使用方法2,那么每次调用函数getUsername之前都需要填充结构
2)除了这两个通用的解决方案之外,还有更好的解决方案吗?
PS:结构的定义
struct QueryDetails
{
string tableName;
vector<string> colList;
...
};
您的问题非常宽泛,您给出的元素不允许为您提供客观的最佳答案。
您的方法1具有以下优点:
- 这是一种稳健而安全的方法:查询是在了解相关对象的情况下编写的
- 如果数据库不断发展,则很容易找到(文本搜索)表的特定查询位置,并更新对象的查询代码
- 不用说,如果您的对象发生了变化,您将立即意识到您必须在数据库方面进行哪些更改
主要的不便之处在于,您与数据库的链接非常紧密。如果明天您从PostGres更改为其他内容,则必须重写每个查询。
您的方法2具有以下优点:
- 它非常灵活
- 如果数据库发生更改,则只需更改通用函数
不便之处在于,这种灵活性为维护带来了很多风险:您无法确定客户端是否发送了正确的查询,而且很难评估数据库布局更改的影响评估。
最后,由你来决定哪一个更适合你的需求。
我个人倾向于支持1。但这是主观的,无论如何,我都会引入一个额外的层,使应用程序代码更加独立于实现数据库访问的数据库系统。
然而,根据您的需要,更大的灵活性可能是有利的。例如,如果你的类实际上是其他caless获取自己数据的中间层,那么方法2可能是最好的选择。
相关文章:
- 查询SQLite数据库中的日期
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在ArangoDb AQL查询中指定数据库
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- Visual C++GC接口如何启用它以及要包含哪个库
- 从数据库实时显示QT c++中的数据
- Windows.h与GLFW.h的接口
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 提供与TMP和SFINAE的通用接口
- 无法在C++中建立与MySQL数据库的连接
- 为重写std::exception的库生成swig接口时出错
- 内联如何影响模块接口中的成员函数
- 将类实现到数据库程序中
- 连接 dockerized 模型和 dockerized 数据库时出现"无法 SQLConnect"错误
- COM 接口 c# 封送数组数组
- 使用继承和模板的数据库接口
- C++:数据库的通用接口设计
- 最容易使用的连接器/接口,将MySQL /其他数据库与C++一起使用
- 加速Oracle数据库在Qt (QOCI)中的接口