当前位置: 首页 > news >正文

【mySQL++】C++ 操作mySQL

目录

简介

安装和配置

linux环境

WIN32环境

C++调用mysql++


mysql开发中文博客:https://imysql.cn/

简介

MySQL其实提供了C实现的接口,而MySQL++则是一个C++实现的封装MySQL C接口的一个Wrapper,遵循了标准C++的规则,是个跨平台的开源工具。我们主要用MySQL++来开发C++程序。

安装和配置

linux环境

还是万年不变的新手主题——安装和配置

安装MySQL++之前需要先安装MySQL:

[root@ollen mysql++]# yum install mysql-devel

紧接着下载MySQL++源码并解压,我们把压缩包解压到/usr/mysql++下:

[root@ollen mysql++]# wget http://www.tangentsoft.net/mysql++/releases/mysql++-3.2.2.tar.gz
[root@ollen mysql++]# tar -zxvf mysql++-3.2.2.tar.gz
[root@ollen mysql++]# mv mysql++-3.2.2 mysql++

进入mysql++目录下,开始编译,先执行./configure生成makefile文件,之后再make,编译出libmysqlpp.so库文件:

[root@ollen mysql++]# ./configure --enable-thread-check --enable-disasm LDFLAGS='-pthread'
[root@ollen mysql++]# make
[root@ollen mysql++]# make install

(注意:configure 不加--enable-disasm LDFLAGS='-pthread'参数make会报错undefined reference to symbol 'pthread_create@@GLIBC_2.2.5' )

install成功后会将.so文件拷贝到/usr/local/lib下,并把.h头文件拷贝到/usr/local/include下。

到这里MySQL++已经安装到本机了,然而如果直接在C++代码里引用如下头文件是无法编译通过的!

#include <mysql++.h>

原因是C++在编译时需要加载这个动态库,默认情况下,g++编译器只会使用/lib和/usr/lib这两个目录下的库文件。回头看一下make之前的./configure步骤,我们并没有指定--prefix=/some/path,所以库会默认安装到/usr/local目录下。既然libmysqlpp.so是在/usr/local/lib下,编译器当然就无法找到它的定义了。

那么编译器如何正确找到/usr/local/lib目录呢?

/etc/ld.so.conf文件记录了编译器编译时使用的动态库路径!那我们把/usr/local/lib路径加入到文件末尾就可以了!

配置文件修改保存后,通过ldconfig程序(在usr/sbin/下),将/etc/ld.so.conf文件列举的路径下的库文件缓存到/etc/ld.so.cache以供开发使用:

[root@ollen mysql++]# ldconfig

建议多做一步,创建so的连接:

[root@localhost mysql++]# ln -s /usr/local/lib/libmysqlpp.so /usr/lib/libmysqlpp.so

到这里就配置完成了。

WIN32环境

1、下载源码,解压,用VS打开工程

2、mysql++是对mysqlconnect的封装,所以依赖下载:mysqlconnect 

3、mysqlconnect  下下来后是MYSQL,解压,将其中的MySQL Connector C 6.1.5 放到C盘,查看VS工程的配置

按教程 【VS】VS工程设置,  将include和lib目录设置到MySQL Connector C 6.1.5\include和MySQL Connector C 6.1.5\lib

然后右键VS工程的mysqlpp项目--》设置生成的库类型未lib---》右键项目---》生成--》生产的mysqlpp.lib在工程配置的输出目录下。

把mysql++-3.2.5\lib下的头文件取出,放到一个文件夹 这些头文件就是mysqlpp.lib的头文件

C++调用mysql++

我先用MySQL创建了一个test数据库,并添加了一张Student表,结构如下:

DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `Sid` char(8) NOT NULL DEFAULT '',
  `Sname` char(20) NOT NULL DEFAULT '',
  `Sage` int(11) NOT NULL DEFAULT '0',
  `Sgen` char(1) NOT NULL DEFAULT '',
  `Sdept` char(10) NOT NULL DEFAULT '',
  PRIMARY KEY (`Sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO `student` VALUES ('09388308','zhsuiy',19,'F','MD8-208'),('09388321','David',20,'M','ZS4-731'),('09388334','zhxilin',20,'M','ZS4-722');

并且插入了如下一些测试数据:

在C++代码里,我们连接这个test数据库之后,进行一个查询,并将结果打印出来:

#include <mysql++.h>
#include <iostream>
  
using namespace std;
int main()
{
  const char* db = 0, *server = 0, *user = 0, *password = "";
  db = "test";
  server = "localhost";
  user = "root";
  password = "1234567";
     
  mysqlpp::Connection conn(false);
  if (conn.connect(db, server, user, password)) 
  {
    cout << "connect db succeed. " << endl;
    mysqlpp::Query query = conn.query("SELECT * FROM student");
    if (mysqlpp::StoreQueryResult res = query.store()) 
    {
      cout.setf(ios::left); //left    输出调整为左对齐.
      cout << setw(31) << "Sid" <<
      setw(10) << "Sname" <<         //setw(10)设置输出的域宽,不足补齐
      setw(10) << "Sage" <<
      setw(10) << "Sgender" <<                 
      setw(10) << "SDepartment" << endl;
 
      mysqlpp::StoreQueryResult::const_iterator it;
      for (it = res.begin(); it != res.end(); ++it) 
      {
        mysqlpp::Row row = *it;
        cout << setw(30) << row[0] << ' ' <<
        setw(9) << row[1] << ' ' <<
        setw(9) << row[2] << ' ' <<
        setw(9) << row[3] << ' ' <<
        setw(9) << row[4] << ' ' <<
        endl;
      }
    }
  } 
  else 
  {
      cout << "connect db fail. " << endl;
  }
  return 0;
}

编译命令如下,编译时需要链接mysql和mysql++:

g++ -o main hello.cpp -lmysqlpp -I/usr/include/mysql -I/usr/local/include/mysql++

g++ -o main hello.cpp -L /usr/local/lib/ -Wl,-rpath="/usr/local/lib"  -lmysqlpp -I/usr/include/mysql -I/usr/local/include/mysql++

(安装的mysql++的库libmysqlpp.so在/usr/local/lib下,所以编译项加-Wl,-rpath="/usr/local/lib",让程序运行时去"/usr/local/lib"找库)

解释一下后面这段参数:

-Ldir(大写/eL/):编译时查找路径dir,这里分别是/usr/lib/mysql和/usr/local/lib,分别指mysql和mysql++所在目录(<---修改:这里不需要写了,因为ld.so.conf已经加上/usr/local/lib,/usr/lib和/usr/local/lib都能默认找到)

-llib(小写/eL/):编译时链接的库lib,这里是mysqlpp,即libmysqlpp.o;(<---修改:编译器在查找的时候有隐式规则,即在指定的名字前加lib,后加.so来查找对应的库文件)

-Idir(大写/ai/):编译时包含库头文件路径,这里分别是/usr/include/mysql和/usr/local/include/mysql++;(<---修改:这里还需要是因为.h文件分别放在include目录下的mysql文件夹和mysql++文件夹下,如果.h直接在include目录中就不必写了)

写成makefile就是如下:

main : hello.cpp
        @g++ -o main hello.cpp -lmysqlpp -I/usr/include/mysql -I/usr/local/include/mysql++
clean:
        @rm main

执行结果如下:


数据库链接成功并成功查询了Student表里的数据。

selinux 开启的原因.
查看SELinux状态:

  1. /usr/sbin/sestatus -v ##如果SELinux status参数为enabled即为开启状态

  2. 修改配置文件需要重启机器:
    修改/etc/selinux/config 文件
    将SELINUX=enforcing改为SELINUX=disabled


链接:https://www.jianshu.com/p/efdafe4322b9

mysql++ 自带的一些精巧演示例子

//mysql++ API 的几个典型例子:
//使用 in 删除 记录:
ostringstream strbuf;
unsigned int i = 0;
con.real_connect(MY_DATABASE, MY_HOST, MY_USER, MY_PASSWORD, 3306, (int) 0, 60, NULL);
Query query = con.query();
query << MY_QUERY;       // 使用这样的方法进行查询,真是很简练呀!tcf
ResUse res = query.use();
Row row;
// 开始拼 sql
strbuf << "delete from " << MY_TABLE << " where " << MY_FIELD << " in (";
for (; row = res.fetch_row(); i++)
    strbuf << row[0] << ",";
if (!i)
    return 0;
string output(strbuf.str());
output.erase(output.size() - 1, 1); // 去掉最后一个,
output += ")";
query.exec((const string &) output);
//打印结果
cout << output << endl;
return 0;
//------------------------------------------------------------------------------------------------------ -
query.reset();
query << "select * from cpptest";
// 打印 query 语句
cout << "Query: " << query.preview() << endl;
// 执行query 并保存到 Result
mysqlpp::Result res = query.store();
cout << "记录条数: " << res.size() << endl << endl;
// 打印表中的数据
cout.setf(ios::left);
cout << setw(20) << "Item" <<
     setw(9) << "Num" <<
     setw(9) << "Weight" <<
     setw(9) << "Price" << "Date" << endl << endl;
// Result 类提供的 iterator是只读随机 显示读取记录的
mysqlpp::Row row;
mysqlpp::Result::iterator i;

for (i = res.begin(); i != res.end(); ++i)
{
    row = *i;
    // 可以使用 列的位置或者 名称来 显示
    cout << setw(20) << row[0].c_str() <<
         setw(9) << row[1].c_str() <<
         setw(9) << row.lookup_by_name("weight").c_str() <<
         setw(9) << row[3].c_str() <<
         row[4] << endl;
}
//---------------------------------------------------------------------------------------------------- -
//一个简单的查询
Query query = con.query();
stock row;
row.set("Hot Dogs", 100, 1.5, 1.75, "1998-09-25");
query.insert(row);
cout << "Query : " << query.preview() << endl;
query.execute();
print_stock_table(query);
//--------------------------------------------------------------------------------------------------------

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【压缩】数据压缩算法---编辑中
  • 【MySQL】Linux学习之CentOS7安装Mysql5.7直接覆盖Mariadb
  • 【libevent】libevent快速入门
  • 【Libevent】Libevent使用例子,从简单到复杂
  • 【导航】自己的导航网站
  • 【OSI】TCP网络协议四层/五层/七层协议
  • 【进程间通信】Unix domain socket (进程间通信)
  • 【Redis】Redis数据类型List的安全队列和不安全队列
  • 【多线程】C++11多线程(简约但不简单)
  • 【C++】C++ 不错的学习网站
  • 【C++11】std::async 学习 --- 学习中
  • 【系统】《写给大忙人看的操作系统》--研读
  • 【C++】C++ 4种强制类型转换---编辑中
  • 【Django】Django 的员工信息系统
  • [Django ]Django 的数据库操作
  • Angular 4.x 动态创建组件
  • ESLint简单操作
  • HTTP请求重发
  • iOS 系统授权开发
  • JavaScript 奇技淫巧
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Python学习之路13-记分
  • RxJS: 简单入门
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 第十八天-企业应用架构模式-基本模式
  • 关于Java中分层中遇到的一些问题
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 前嗅ForeSpider中数据浏览界面介绍
  • 区块链共识机制优缺点对比都是什么
  • 无服务器化是企业 IT 架构的未来吗?
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 一个JAVA程序员成长之路分享
  •  一套莫尔斯电报听写、翻译系统
  • 数据可视化之下发图实践
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #Spring-boot高级
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (四)软件性能测试
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (转)socket Aio demo
  • (转)平衡树
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • *** 2003
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .net 受管制代码