mysql++库的分享和介绍

目录

1.mysql++库的简介

2.编译和安装

3.mysql++常用类概述

4.Mysql++用法详解

5.Query支持的三种查询方式

5.1直接使用Query stream输入SQL语句

5.2使用Template Query采用类似于printf的方式进行输入SQL语句

5.3使用SSQLS,通过类似于Hibernate的方式对Data Struct进行操作来操作底层数据库

6.在mysql++中使用事务

7.使用连接池

8.总结,mysql++的特点


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)

mysql++库的分享和介绍_第1张图片

选择和你电脑一样的版本,

解压文件,在文件下找到这两个文件

mysql++库的分享和介绍_第2张图片

2.然后下载mysql++3.3.0

对应的下载地址

MySQL++: MySQL++

mysql++库的分享和介绍_第3张图片

3.解压mysql++3.3.0,然后选择vc2008这个目录,把第一步mysql c api 的lib 和 include拷贝进去

mysql++库的分享和介绍_第4张图片

用vs打开mysql++.sln,笔者选择的是vs2022.

4.选择mysqlpp这个项目,选择属性,配置之前的lib 和include

mysql++库的分享和介绍_第5张图片

5.然后选择release x64 进行编译。

最终生成对应的dll 和lib 表明生成成功

mysql++库的分享和介绍_第6张图片

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 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 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, 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 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支持多种返回数据集的方式

你可能感兴趣的:(C++,mysql,项目实战,mysql,数据库)