Ứng dụng ODMG C++ là một vớ dụ đơn giản được nờu ra để xem xột. Hỡnh 23 thể hiện mụ hỡnh UML cho ứng dụng.
Hỡnh 23. Vớ dụ UML
Ứng dụng bao gồm hai lớp, lớp Employee và lớp Department. Lớp Department cú mối quan hệ một-nhiều với Employee (cú nghĩa là một phũng bao gồm nhiều nhõn viờn)
Đầu tiờn chỳng ta khai bỏo lớp Employee: class Employee : public d_Object
{ public:
// Constructors/Destructors
Employee ( const char* name ) : mName(name) {} virtual ~Employee () {}
// Accessor Methods
const char* getName ( ) const { return mName; }
// Mutator Methods
void setName ( const char* name ) { mark_modified(); mName = name; } private: // Attributes d_String mName; }}; // class Employee Hỡnh 24. Lớp Employee
Employee kế thừa từ lớp cơ sở bền vững ODMG, d_Object. Điều này cú nghĩa là hiện tại lớp cú khả năng bền vững (cỏc cỏ thể tạm thời hoặc bền vững của Employee cú thể được tạo). Lớp cú một thuộc tớnh đơn, mName, nú sử dụng lớp xõu ODMG d_String thay vỡ một hàm char* (vỡ cơ sở dữ liệu khụng cho phộp lưu cỏc con trỏ bộ nhớ). Phương thức biến đổi, được sử dụng để thiết lập tờn nhõn viờn, đầu tiờn gọi mark_modified() để cho Object Manager biết đối tượng dự định được thay đổi (tuỳ thuộc vào cơ sở dữ liệu, điều này cú thể dẫn đến việc cấp phỏt một khoỏ ghi để đảm bảo khụng cú người khỏc cố gắng sửa đổi cựng một đối tượng).
Bõy giờ chỳng ta xem xột lớp Department: class Department : public d_Object
{ public:
// Constructors/Destructors
Department ( const char* name ) : mName(name) {} virtual ~Department ( ) {}
// Accessor Methods
const char* getName ( ) { return mName; }
// Mutator Methods
void addEmployee ( Employee* employee ) {
mark_modified();
mEmployees.add(employee); }
// Static Methods
static d_Ref<Department> findDepartment ( const char* name); private:
// Attributes
d_String mName;
d_Set<d_Ref<Employee> > mEmployees; }; // class Department
Hỡnh 25. Lớp Department
Lớp Department thừa kế từ d_object và cú một thuộc tớnh name. Mỗi Department cú một tập cỏc Employee, mối quan hệ này được định nghĩa bằng việc
sử dụng một ODMG d_Set<> (d_Set<> là một lớp tập hợp khụng cú thứ tự) của cỏc tham chiếu ODMG, d_Ref<>, tới Employee. Phương thức biến đổi, thờm một nhõn viờn tới một phũng, gọi mark_modified() để biểu thị ý định tự cập nhật và thờm nhõn viờn đang xột vào một tập cỏc nhõn viờn của nú. Phương thức tĩnh findDepartment() trả về một tham chiếu tới một Department. Sử dụng lớp d_Ref<> thay cho việc sử dụng cỏc con trỏ C++ như thụng thường. Cỏc con trỏ C++ khụng an toàn khi thao tỏc với cỏc đối tượng bền vững, một con trỏ trỏ tới một đối tượng chỉ đỳng khi nú giữ nguyờn vị trớ trong bộ nhớ. Mặc dự cỏc con trỏ bị giới hạn bởi mụ hỡnh đỏnh địa chỉ của hệ điều hành. Sự thi hành của findDepartment() sẽ được xem xột ở phớa sau.
Một khi đó thu được lược đồ cơ sở dữ liệu từ cỏc định nghĩa lớp và tải nú vào trong cơ sở dữ liệu, cỏc đối tượng bền vững cú thể được tạo bằng việc sử dụng toỏn tử new:
Employee* emp1 =
new Employee("Mickey"); // Transient instance
Employee* emp2 =
new(db, "Employee") Employee("Donald"); // Persistent instance
Hỡnh 26. Tạo một đối tượng
ODMG nạp chồng toỏn tử new cú thờm hai tham số: cơ sở dữ liệu nơi đối tượng được tạo; và lớp đối tượng. Ngoài ra nú hoạt động như toỏn tử new chuẩn. Để tạo một cỏ thể tạm thời của một lớp cú khả năng bền vững chỉ cần gọi toỏn tử new chuẩn.
Hỡnh 27 thể hiện một ứng dụng đơn giản: mở một cơ sở dữ liệu, khởi động một giao tỏc, tạo một phũng và một số nhõn viờn và cam kết:
main() {
d_Database db; d_Transaction txn;
db.open("Staff.db"); // Open a database connection
txn.begin(); // Start a transaction
// Create a persistent Department and some Employees
Department* dep = new(db, "Department") Department("RD"); Employee* emp1 = new(db, "Employee") Employee("Mickey"); Employee* emp2 = new(db, "Employee") Employee("Donald");
// Add the Employees to the Department
dep->addEmployee(emp1); dep->addEmployee(emp2);
txn.commit(); // Commit the transaction
db.close(); // Close the database connection
}
Hỡnh 27. Một ứng dụng đơn giản
Cỏc lớp ODMG d_Database và d_Transaction giao tiếp với Object Manager và được sử dụng để điều khiển cỏc kết nối cơ sở dữ liệu và cỏc ranh giới giao tỏc. Phần cũn lại là mó trỡnh C++ chuẩn.
Cuối cựng hóy xem xột việc thi hành findDeparment() minh hoạ việc sử dụng cỏc truy vấn:
d_Ref<Department> Department::findDepartment ( const char *name ) {
d_Set<d_Ref<Department> > results; // Results of query d_VQL_Query query // Query object
("select SelfOID from Department where name like $1"); query << name; // Bind name to $1
d_oql_execute(query, results); // Execute the query
if (results.cardinality() > 1) {
// Opps, found more than one department
throw InvalidDepartmentException(name); }
else if (results.cardinality() == 1) {
// Found a single match, return the first element in set
return *results.begin(); }
else {
// No match found, return NULL
return NULL; }
}
Hỡnh 28. Thi hành một truy vấn
Đối tượng truy vấn được xõy dựng bằng việc sử dụng cỳ phỏp chọn tương tự SQL, SelfOID biểu thị rằng kết quả là một tập hợp cỏc tham chiếu đối tượng của cỏc đối tượng phự hợp (thay vỡ một phộp chiếu cỏc thuộc tớnh từ cỏc đối tượng phự hợp). d_oql_execute() thực thi truy vấn.
Như cú thể thấy, việc xõy dựng một ứng dụng C++ giao tiếp với một cơ sở dữ liệu đối tượng là tương đối dễ dàng. Kết gỏn ngụn ngữ ODMG ẩn đi tất cả những điều phức tạp của việc lưu và khụi phục cỏc đối tượng.
Việc loại bỏ ỏnh xạ phức tạp cần cú khi sử dụng cơ sở dữ liệu quan hệ làm giảm mó trỡnh khi thiết kế, lập trỡnh, gỡ lỗi, kiểm thử và bảo quản. Điều này cú thể làm
giảm đỏng kể thời gian phỏt triển, một trong những hứa hẹn được thờu dệt của hướng đối tượng.
Bằng việc sử dụng biểu diễn đối tượng trong cơ sở dữ liệu giống như khi nú được thao tỏc bởi ứng dụng, cung cấp sự hỗ trợ trực tiếp cho cỏc mối quan hệ phức tạp và sự điều hướng, một cơ sở dữ liệu đối tượng cú thể cung cấp sự thi hành hiệu quả vượt qua cơ sở dữ liệu quan hệ.
Việc sử dụng cơ sở dữ liệu đối tượng cú kiến trỳc client-server cõn bằng đảm bảo cực đại tớnh mềm dẻo trong thiết kế ứng dụng, cho phộp sự điều hướng phức tạp được thi hành bởi client và cỏc truy vấn phi thể thức bởi server, cung cấp sự thực thi tốt nhất trong cả hai trường hợp, và hỗ trợ giao tiếp vượt qua nền.