目录
5.2使用Template Query采用类似于printf的方式进行输入SQL语句
5.3使用SSQLS,通过类似于Hibernate的方式对Data Struct进行操作来操作底层数据库
1.mysql++库的简介
MySQL++是对 MySQL C API的封装,它建立在与标准c++库相同的原则之上,使处理数据库如同处理std容器(STL)一样简单
能够简单的封装进我们的实际项目中。比mysql c 这个库集成度更好,使用c++的面向对象方式对mysql c进行了一层封装。让我们能更好的集成和调用
2.编译和安装
首先要下载mysql c api 保存里面的lib 和 include ,
因为mysql++编译的时候需要用到他们,附上对应的下载地址
MySQL :: Download MySQL Connector/C (Archived Versions)
选择和你电脑一样的版本,
解压文件,在文件下找到这两个文件
2.然后下载mysql++3.3.0
对应的下载地址
3.解压mysql++3.3.0,然后选择vc2008这个目录,把第一步mysql c api 的lib 和 include拷贝进去
用vs打开mysql++.sln,笔者选择的是vs2022.
4.选择mysqlpp这个项目,选择属性,配置之前的lib 和include
5.然后选择release x64 进行编译。
最终生成对应的dll 和lib 表明生成成功
3.mysql++常用类概述
transaction类 :transaction类为数据库操作提供了事务机制,保证一系列操作的原子性
Connection类:对Mysql数据库操作的基础,连接数据库相关的类
Query类: 继承std::stringstream,因此,程序员可以像操作Stream 一样操作Queryle类,来生成正确的sql语句 Query query;
Query << “drop table test”;
Query.execute();
我们也可以使用模板和ssql来生成正确的Query来对mysql进行操作
Result类:主要存储数据库查询存储结果,一般不直接构建,而是做为 由Query类返回集的容器
Row类:该类对应数据库表中的一行查询结果
4.Mysql++用法详解
1.建立mysql连接
Mysql::Connection con(false);
Con.connect(“test”,”127.0.0.1”,”root”,”123456”);
2.使用Query类进行查询
Mysqlpp:: Query query = con.query(“select channel from pcs_channel”)
或者复制构造 Mysqlpp::Query query(cosnt Query q)
对于无返回值,或者只有一个自增返回值的,可以使用Query的execute方法
bool mysqlpp::Query::exec (new string(“delete from test where id = ‘1’”))
ResNSel mysqlpp::Query::execute(const char* str, size_t len) 返回的ResNSel主要包含以下字段 Info,执行结果的附加信息
Rows,本次执行影响的行数
Insert_in,取得新插入行的自增的id
Success,本次执行是否成功
3.对于有返回值的查询操作,需要分情况使用
StorequeryResutl()操作返回Result集,如果需要使用自定义的容器结构,比如vector,则可以使用storein()操作,对于大数据集,则需要使用use进行查询,此操作返回ResUse类,用fectch_row()取得每一行
mysqlpp::Query query = conn.query("select * from stock");
mysqlpp::StoreQueryResult res = query.store();
for (size_t i = 0; i < res.num_rows(); ++i) {
cout << setw(30) << res[i]["item"] << ' ' <<
setw(9) << res[i]["num"] << ' ' <<
setw(9) << res[i]["weight"] << ' ' <<
setw(9) << res[i]["price"] << ' ' <<
setw(9) << res[i]["sdate"] <<
endl;
}
mysqlpp::Query query = conn.query("select item, description from stock");
vector<stock> res;
query.storein(res);
for(auto i = res.begin(); i != res.end(); i++)
{
cout << i->item << '\t' ;
cout << i->description << endl;
}
mysqlpp::UseQueryResult res = query.use();
while (mysqlpp::Row row = res.fetch_row()) {
}
4.数据不大可以使用storein()方法,把数据全部放到内存,用操作容器的方式操作数据返回值,简单方便 数据量大的时候使用use()方法,一条,一条返回数据
5.Query支持的三种查询方式
1.直接使用Query stream输入SQL语句
2.使用Template Query采用类似于printf的方式进行输入SQL语句
3.使用SSQLS,通过类似于Hibernate的方式对Data Struct进行操作来操作底层数据库
5.1直接使用Query stream输入SQL语句
vector<stock> v;
query << "SELECT * FROM stock";
query.storein(v);
5.2使用Template Query采用类似于printf的方式进行输入SQL语句
mysqlpp::Query query = con.query("select * from stock where item = %0q");
query.parse();
mysqlpp::StoreQueryResult res1 = query.store("Nürnberger Brats");
Or
query << "select (%2:field1, %3:field2) from stock where %1:wheref = %0q:what";
query.parse();
query.template_defaults[1] = "item";
query.template_defaults["wheref"] = "item";
5.3使用SSQLS,通过类似于Hibernate的方式对Data Struct进行操作来操作底层数据库
比如有如下表
CREATE TABLE stock (
item CHAR(30) NOT NULL,
num BIGINT NOT NULL,
weight DOUBLE NOT NULL,
price DECIMAL(6,2) NOT NULL,
sdate DATE NOT NULL,
description MEDIUMTEXT NULL)
sql_create_#(NAME, COMPCOUNT, SETCOUNT, TYPE1, ITEM1, ... TYPE#, ITEM#)宏,“#”是变量的数量,“NAME”是你希望创建的结构名称
可以定义一个对应的C++结构如下
sql_create_6(stock, 1, 6,
mysqlpp::sql_char, item,
mysqlpp::sql_bigint, num,
mysqlpp::sql_double, weight,
mysqlpp::sql_decimal, price,
mysqlpp::sql_date, sdate,
mysqlpp::Null<mysqlpp::sql_mediumtext>, description)
增加数据操作
stock new_row(
"Hot dog", 100, 1.5, 130, mysqlpp::sql_date("2014-11-30"), mysqlpp::null
);
//execute a query
mysqlpp::Query query = conn.query();
query.insert(new_row);
批量插入
vector<stock> lots_of_stuff;
query.insert(lots_of_stuff.begin(), lots_of_stuff.end()).execute();
修改数据
query << “select * from user where name = ‘xl’”;
Result res = query.store();
If (res.empty())
{
}
User user = res.at(0);
User orgin_user = user;//建立一个copy,使得msyql++知道更到处所在
Use.name = ‘cx1’;
Query.update(orgin_user,user);
Query.execute();
6.在mysql++中使用事务
Mysqlpp::Connection con(mysqlpp::use_exceptions)
Mysqlpp::Transaction trans(con);
Try{
//……………………
Con.commit();
}
Catch(Exception &e)
{
con.rollback();
}
7.使用连接池
mysql++ 内部已经实现好连接池
virtual Connection* exchange(const Connection* pc); //将当前连接断开重新开启一个连接
virtual Connection* grab(); //从连接池获取一个连接,如果没有创建一个
Connection* safe_grab(); //从连接池获取一个可用的连接
virtual void release(const Connection* pc); //将一个连接置为未使用状态
void shrink() //从连接池删除未使用的连接
void remove(const Connection* pc) //从连接池中删除指定连接
继承连接池,根据业务编写自己的连接池
class MysqlConnectPool : public mysqlpp::ConnectionPool
{
public:
MysqlConnectPool(std::string dbname,
std::string serverip,
std::string user,
std::string passwd,
int port,
std::string charset,
int max_size)
:m_dbname(dbname)
,m_server_ip(serverip)
,m_user(user)
,m_password(passwd)
,m_charset(charset)
,m_port(port)
{
m_max_size = max_size;
conns_in_use_ = 0;
m_max_idle_time = 300; //最大空载时间
}
······
·····
}
8.总结,mysql++的特点
1,可以使用c++的特性操作数据库
2,支持Template query 和SSqls查询
3.自带连接池
4支持多种返回数据集的方式