今回は、POCOでのデータベース利用の実装例を詳解します。
まず、参考情報のポインタを示します。
http://pocoproject.org/docs/00200-DataUserManual.html
英語サイトですが、データベースフレームワークの使い方を丁寧に説明しています。
英語を苦にしない人は、上記サイトを見てもらえればOKです。
でも、これだけだとこの記事が寂しすぎるので、MySQLでのCRUDのサンプルプログラムを紹介しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
#include "Poco/Tuple.h"
#include "Poco/Data/Common.h"
#include "Poco/Data/Session.h"
#include "Poco/Data/MySQL/Connector.h"
#include "Poco/Util/Application.h"
#include "Poco/Util/Option.h"
#include "Poco/Util/OptionSet.h"
#include "Poco/Util/HelpFormatter.h"
#include "Poco/Util/AbstractConfiguration.h"
#include <vector>
#include <iostream>
using namespace Poco::Data;
using Poco::Util::Application;
using Poco::Util::Option;
using Poco::Util::OptionSet;
using Poco::Util::HelpFormatter;
using Poco::Util::AbstractConfiguration;
using Poco::Util::OptionCallback;
typedef Poco::Tuple<std::string, std::string, int> Person;
typedef std::vector<Person> People;
class MysqlSample: public Application
/// This sample demonstrates some of the features of the Poco::Data::MySQL class.
{
public:
MysqlSample(): _helpRequested(false), _dbConnString("host=localhost;port=3306;user=test;password=test;db=test;compress=true;auto-reconnect=true")
{
}
protected:
void initialize(Application& self)
{
loadConfiguration(); // load default configuration files, if present
Application::initialize(self);
// add your own initialization code here
}
void uninitialize()
{
// add your own uninitialization code here
Application::uninitialize();
}
void reinitialize(Application& self)
{
Application::reinitialize(self);
// add your own reinitialization code here
}
void defineOptions(OptionSet& options)
{
Application::defineOptions(options);
options.addOption(
Option("help", "h", "display help information on command line arguments")
.required(false)
.repeatable(false)
.callback(OptionCallback<MysqlSample>(this, &MysqlSample::handleHelp)));
}
void handleHelp(const std::string& name, const std::string& value)
{
_helpRequested = true;
displayHelp();
stopOptionsProcessing();
}
void handleConfig(const std::string& name, const std::string& value)
{
loadConfiguration(value);
}
void displayHelp()
{
HelpFormatter helpFormatter(options());
helpFormatter.setCommand(commandName());
helpFormatter.setUsage("OPTIONS");
helpFormatter.setHeader("A MysqlSample application that demonstrates how to use Poco::Data.");
helpFormatter.format(std::cout);
}
int main(const std::vector<std::string>& args)
{
if (!_helpRequested)
{
// MySQLコネクタを登録します
MySQL::Connector::registerConnector();
// MySQLセッションを作成します。
Session session(SessionFactory::instance().create(MySQL::Connector::KEY, _dbConnString));
// もし存在していたら、サンプルテーブルを削除します。
session << "DROP TABLE IF EXISTS Person", now;
// サンプルテーブルを作成します。
session << "CREATE TABLE Person (Name VARCHAR(30), Address VARCHAR(30), Age INTEGER)", now;
// レコードを追加します。[C]
Statement insert(session);
Person person("Bart Simpson", "Springfield", 35);
insert << "INSERT INTO Person VALUES(?, ?, ?)", use(person);
insert.execute();
person.set<0>("Lisa Obama");
person.set<1>("Washington");
person.set<2>(10);
insert.execute();
// レコードを照会します。[R]
Statement select(session);
People people;
select << "SELECT Name, Address, Age FROM Person", into(people), now;
for (unsigned int i = 0; i < people.size(); ++i)
{
std::cout << people.at(i).get<0>() << "," << people.at(i).get<1>() << "," << people.at(i).get<2>() << std::endl;
}
// レコードを更新します。[U]
Statement update(session);
person.set<2>(12);
update << "UPDATE Person set Age = ? where Name = ?", use(person.get<2>()), use(person.get<0>()), now;
// レコードを削除します。[D]
Statement del(session);
person.set<0>("Bart Simpson");
del << "DELETE from Person where Name = ?", use(person.get<0>()), now;
}
return Application::EXIT_OK;
}
private:
bool _helpRequested;
std::string _dbConnString;
};
POCO_APP_MAIN(MysqlSample) |