|
Объектно-ориентированный доступ к базам данных на C++
С API прекрасно работают в процедурном программировании на С. Однако они не
очень хорошо вписываются в объектно-ориентированную среду C++. Чтобы показать,
как реально использовать в программе эти два API, в оставшейся части главы мы
создадим с их помощью C++ API для объектно-ориентированного программирования
баз данных.
Рис. 13-1. Библиотека объектно-ориенитрованного доступа к базе данных
Поскольку мы занимаемся освещением доступа к базам данных MySQL и mSQL, то
сосредоточимся на специфичных для MySQL и mSQL темах и не будем пытаться
создать совершенный общий C++ API. Работу с MySQL и mSQL описывают три главных
понятия: соединение, результирующий набор и строки результирующего набора. Мы
будем использовать эти понятия как ядро объектной модели, на которой будет
основываться наша библиотека. Рис. 13-1 показывает эти объекты на UML-диаграмме.
*
Соединение с базой данных
В любой среде доступ к базе данных начинается с соединения. Как вы видели в
первых двух примерах, MySQL и mSQL по-разному представляют одно и то же понятие
- соединение с базой данных. Создание нашей объектно-ориентированной библиотеки
мы начнем с абстрагирования от этого понятия и создания объекта Connection .
Объект Connection должен уметь устанавливать соединение с сервером, выбирать
нужную базу данных, посылать запросы и возвращать результаты. Пример 13-3
показывает заголовочный файл, в котором объявлен интерфейс к объекту Connection.
UML - это новый Унифицированный язык моделирования, созданный Гради Бучем,
Айваром Якобсоном и Джеймсом Рамбо (Grady Booch, Ivar Jacobson, James Rumbaugh)
в качестве нового стандарта для документирования объектно-ориентированного
проектирования и анализа.
Пример 13-3. Заголовок класса Connection
#ifndef l_connection_h
#define l_connection_h
#include
#if defined(HAS_MSQL)
#include
#lelif defined(HAS_MYSQL)
#include
#endif
#include "result.h"
class Connection { private:
int affected_rows;
#if defined(HAS_MSQL)
int connection;
#elif defined(HAS_MYSQL)
MYSQL mysql;
MYSQL 'connection; tfelse
#error База данных не определена,
#endif
public:
Connection(char *, char *);
Connection(char *, char *, char *, char *);
~Connection();
void Close();
void Connect(char 'host, char *db, char *uid, char *pw);
int GetAffectedRows();
char. *GetError();
int IsConnected();
Result *Query(char *);
};
#endif // l_connection_h
Методы, которые предоставляет класс Connection, одинаковы вне зависимости от
используемой СУБД. Однако спрятанными в глубине класса окажутся закрытые члены,
специфичные для той библиотеки, с которой он будет компилироваться. При
установлении соединения единственными различными данными-членами станут те,
которые представляют соединение с базой данных. Как отмечалось, mSQL для
представления соединения использует величину типа int, a MySQL использует
указатель на MYSQL и дополнительную величину типа MYSQL для установления
соединения.
Установление соединения с базой данных
Всем приложениям, которые мы будем создавать с использованием этого API, для
соединения с базой данных потребуется только создать новый экземпляр класса
Connection с помощью одного из его конструкторов. Аналогично, приложение может
отсоединиться, уничтожив экземпляр Connection . Оно может даже повторно
использовать экземпляр Connection с помощью прямых обращений к методам Close()
и Соnnect(). Пример 13-4 показывает реализацию конструкторов и метода Connect().
Пример 13-4. Соединение с MySQL и mSQL в классе Connection
#include "connection.h"
Connection::Connection(char *host, char *db) {
#if defined(HAS_MSQL)
connection = -1;
|
|