Dzisiaj ogłosiliśmy ogólną dostępność MariaDB Connector/C++. Język C++ znany jest ze swojej wydajności, wszechstronności i rozszerzalności. W rzeczywistości jest często używany w branżach takich jak fintech i gry, gdzie aplikacje wymagają przewidywalnej współbieżności i opóźnień. Dzięki MariaDB Connector/C++ programiści mogą używać nowego łącznika w swoich aplikacjach do natywnego łączenia się z MariaDB Server lokalnie i w chmurze na MariaDB SkySQL.
W tym artykule przedstawię Ci MariaDB Connector/C++ za pomocą prostych przykładów, które demonstrują interakcje tworzenia, odczytu, aktualizacji i usuwania (CRUD) z danymi przechowywanymi w MariaDB. Dokładniej, zamierzam przejść przez proces tworzenia aplikacji konsolowej w C++, która pozwoli na wykonywanie prostych operacji do zarządzania zadaniami. Ale dość gadania, zacznijmy!
Pobieranie i instalowanie
Aby korzystać z MariaDB Connector/C++, musisz mieć dostęp do instancji MariaDB Server. Istnieje wiele sposobów rozpoczęcia korzystania z MariaDB na komputerze lokalnym, lokalnym, a nawet w chmurze.
- Pobierz i zainstaluj serwer społeczności MariaDB
- Bezpośrednio
- Korzystanie z obrazu Dockera
- Pobierz i zainstaluj MariaDB Enterprise Server
- Wdróż za pomocą MariaDB SkySQL, najlepszej bazy danych MariaDB w chmurze
Po skonfigurowaniu instancji MariaDB Server możesz wykonać czynności opisane w dokumentacji MariaDB Enterprise, aby uzyskać instrukcje dotyczące pobierania i instalowania MariaDB Connector/C++.
Przygotowywanie serwera MariaDB
W tym przykładzie, zanim będziesz mógł użyć nowego łącznika MariaDB C++, będziesz potrzebować bazy danych i tabeli. Korzystając z wybranego klienta, połącz się z instancją bazy danych MariaDB i:
1. Utwórz nową bazę danych i pojedynczą tabelę, która będzie odpowiedzialna za przechowywanie rekordów zadań.
CREATE DATABASE IF NOT EXISTS todo; CREATE TABLE todo.tasks ( id INT(11) unsigned NOT NULL AUTO_INCREMENT, description VARCHAR(500) NOT NULL, completed BOOLEAN NOT NULL DEFAULT 0, PRIMARY KEY (id) );
2. Utwórz nowego użytkownika bazy danych, którego Connector/C++ będzie używać do łączenia się z MariaDB.
CREATE USER IF NOT EXISTS app_user@localhost IDENTIFIED BY 'Password123!'; GRANT ALL PRIVILEGES ON todo.* TO app_user@localhost;
Łączenie z serwerem MariaDB
Teraz, gdy masz już skonfigurowaną instancję bazy danych, schemat i użytkownika, nadszedł czas, aby przejść do C++. Wszystko zaczyna się od nawiązania połączenia z MariaDB. Oczywiście, aby to zrobić, musisz dołączyć pliki nagłówkowe łącznika MariaDB, w szczególności conncpp.hpp, na górze pliku, do którego dodajesz kod C++.
#include <mariadb/conncpp.hpp>
Aby nawiązać połączenie, zacznij od pobrania Driver
obiekt, którego można następnie użyć, w połączeniu z informacjami konfiguracyjnymi Java Database Connectivity (JDBC), w celu uzyskania Connection
obiekt.
// Instantiate Driver sql::Driver* driver = sql::mariadb::get_driver_instance(); // Configure Connection sql::SQLString url("jdbc:mariadb://localhost:3306/todo"); sql::Properties properties({{"user", "app_user"}, {"password", "Password123!"}}); // Establish Connection std::unique_ptr<sql::Connection> conn(driver->connect(url, properties));
Aby uzyskać więcej informacji na temat funkcji połączenia MariaDB Connector/C++, zapoznaj się z naszą oficjalną dokumentacją korporacyjną.
Dodawanie zadań
Po uzyskaniu Connection
obiekt, ruszasz na wyścigi! Używając conn, z poprzedniej sekcji, możesz teraz wykonać SQL za pomocą przygotowanej instrukcji do wstawienia danych do MariaDB.
// Create a new PreparedStatement std::unique_ptr<sql::PreparedStatement> stmnt(conn->prepareStatement("insert into tasks (description) values (?)")); // Bind values to SQL statement stmnt->setString(1, description); // Execute query stmnt->executeQuery();
Pobieranie zadań
Używając bardzo podobnego podejścia, jak w poprzedniej sekcji, możesz również utworzyć Statement
obiekt do pobrania i wydrukowania wszystkich rekordów zadań w tabeli zadań.
// Create a new Statement std::unique_ptr stmnt(conn->createStatement()); // Execute query sql::ResultSet *res = stmnt->executeQuery("select * from tasks"); // Loop through and print results while (res->next()) { std::cout << "id = " << res->getInt(1); std::cout << ", description = " << res->getString(2); std::cout << ", completed = " << res->getBoolean(3) << "\n"; }
Aktualizacja zadań
Możesz także użyć PreparedStatement
oraz określanie parametrów (i wartości) w celu zlokalizowania i zmodyfikowania istniejącego rekordu zadania.
// Create a new PreparedStatement std::unique_ptr stmnt(conn->prepareStatement("update tasks set completed = ? where id = ?")); // Bind values to SQL statement stmnt->setBoolean(1, completed); stmnt->setInt(2, id); // Execute query stmnt->executeQuery();
Usuwanie zadań
I oczywiście masz również możliwość usuwania danych z MariaDB za pomocą DELETE SQL
oświadczenie z PreparedStatement
, aby kierować reklamy na konkretny rekord.
// Create a new PreparedStatement std::unique_ptr stmnt(conn->prepareStatement("delete from tasks where id = ?")); // Bind values to SQL statement stmnt->setInt(1, id); // Execute query stmnt->executeQuery();
Łączenie wszystkiego w całość
Na koniec możesz złożyć wszystko w jeden, samodzielny przykład, kopiując i wklejając poniższy kod do nowego pliku o nazwie tasks.cpp . Poniższy przykład łączy wszystkie operacje CRUD, przez które przeszedłem, w zbiór funkcji, które można wykonać z głównego metoda.
#include <iostream> #include <cstring> #include <mariadb/conncpp.hpp> // Delete a task record (indicated by id) void deleteTask(std::unique_ptr &conn, int id) { try { // Create a new PreparedStatement std::unique_ptr stmnt(conn->prepareStatement("delete from tasks where id = ?")); // Bind values to SQL statement stmnt->setInt(1, id); // Execute query stmnt->executeQuery(); } catch(sql::SQLException& e){ std::cerr << "Error deleting task: " << e.what() << std::endl; } } // Update the completed value of a task record (indicated by id) void updateTaskStatus(std::unique_ptr &conn, int id, bool completed) { try { // Create a new PreparedStatement std::unique_ptr stmnt(conn->prepareStatement("update tasks set completed = ? where id = ?")); // Bind values to SQL statement stmnt->setBoolean(1, completed); stmnt->setInt(2, id); // Execute query stmnt->executeQuery(); } catch(sql::SQLException& e){ std::cerr << "Error updating task status: " << e.what() << std::endl; } } // Create a new task record void addTask(std::unique_ptr &conn, std::string description) { try { // Create a new PreparedStatement std::unique_ptr stmnt(conn->prepareStatement("insert into tasks (description) values (?)")); // Bind values to SQL statement stmnt->setString(1, description); // Execute query stmnt->executeQuery(); } catch(sql::SQLException& e){ std::cerr << "Error inserting new task: " << e.what() << std::endl; } } // Print all records in tasks table void showTasks(std::unique_ptr &conn) { try { // Create a new Statement std::unique_ptr stmnt(conn->createStatement()); // Execute query sql::ResultSet *res = stmnt->executeQuery("select * from tasks"); // Loop through and print results while (res->next()) { std::cout << "id = " << res->getInt(1); std::cout << ", description = " << res->getString(2); std::cout << ", completed = " << res->getBoolean(3) << "\n"; } } catch(sql::SQLException& e){ std::cerr << "Error selecting tasks: " << e.what() << std::endl; } } // Main Process int main(int argc, char **argv){ if (argc==1){ std::cout << "Please provide an argument.\n"; } else { try { // Instantiate Driver sql::Driver* driver = sql::mariadb::get_driver_instance(); // Configure Connection sql::SQLString url("jdbc:mariadb://localhost:3306/todo"); sql::Properties properties({{"user", "app_user"}, {"password", "Password123!"}}); // Establish Connection std::unique_ptr conn(driver->connect(url, properties)); // Use arguments to determine execution next steps if (!strcmp(argv[1],"showTasks")) { showTasks(conn); } else if (!strcmp(argv[1],"addTask")) { if (argc != 3) { std::cout << "Invalid arguments"; return 1; } addTask(conn, argv[2]); } else if (!strcmp(argv[1],"updateTaskStatus")) { if (argc != 4) { std::cout << "Invalid arguments"; return 1; } updateTaskStatus(conn, atoi(argv[2]), argv[3]); } else if (!strcmp(argv[1],"deleteTask")) { if (argc != 3) { std::cout << "Invalid arguments"; return 1; } deleteTask(conn, atoi(argv[2])); } // Close Connection conn->close(); } catch(sql::SQLException& e){ std::cerr << "Error Connecting to MariaDB Platform: " << e.what() << std::endl; // Exit (Failed) return 1; } } // Exit (Success) return 0; }
Pełne źródło tej przykładowej aplikacji można również znaleźć tutaj. Źródło tego przykładu C++ znajduje się w repozytorium aplikacji o nazwie „TODO”, które zawiera również interfejs sieciowy i kilka innych przykładowych aplikacji integrujących konektor MariaDB obejmujących wiele języków.
Uruchamianie aplikacji
W środowisku Linux, po utworzeniu pliku tasks.cpp , możesz zbudować plik wykonywalny, zwany zadaniami, używając kompilatora C++.
$ g++ -o tasks tasks.cpp -std=c++11 -lmariadbcpp
Używając pliku wykonywalnego, możesz podać różne wartości argumentów, aby przetestować operacje CRUD.
- Wstawianie nowego rekordu zadania poprzez podanie wartości opisu.
./tasks addTask ‘A New Task’
- Drukowanie wszystkich rekordów zadań.
./tasks showTasks
- Aktualizowanie wartości ukończonego rekordu zadania. Po prostu podaj wartości dla identyfikatora i uzupełnij.
./tasks updateTaskStatus 1 1
- Usuń rekord zadania, podając wartość identyfikatora.
./tasks deleteTask 1
Tylko początek
Mamy nadzieję, że podobało Ci się, jak łatwo jest zacząć używać C++ z MariaDB. Chociaż jest to świetne wprowadzenie do programowania w C++ za pomocą MariaDB, dopiero zaczęliśmy zarys tego, co jest możliwe!
Chcesz zagłębić się w MariaDB Connector/C++? Pamiętaj, aby sprawdzić centrum programistów MariaDB, aby uzyskać jeszcze więcej treści na temat nowego łącznika C++, a także wielu innych funkcji i możliwości MariaDB.
Znajdź dokumentację korporacyjną MariaDB Connector/C++.