【菜鸟玩Linux开发】在C++里操作MySQL
MySQL是一个的开源关系型数据库,对于服务端开发来说是一个优秀的选择。本篇内容将介绍如何在C++程序里操作MySQL数据库。
—————————————————————————————————————————————————————————————
阅读本篇内容之前你需要先了解以下知识:
C++编译链接基本原理
make相关知识
SQL基础知识和CRUD基础操作能力
—————————————————————————————————————————————————————————————
一. MySQL在CentOS下的安装
这部分内容相当简单,也有不少资料,请参考本篇文章。
二. MySQL CRUD基本操作和SQL语法
数据库的增删改查没什么好说的,请参考这里。
三. 在C++中使用MySQL
本节内容是我们的重点。学好了MySQL对CRUD的基础操作,那么如何跟C++代码结合起来呢?
MySQL其实提供了C实现的接口,而MySQL++则是一个C++实现的封装MySQL C接口的一个Wrapper,遵循了标准C++的规则,是个跨平台的开源工具。我们主要用MySQL++来开发C++程序。
1. 安装和配置
还是万年不变的新手主题——安装和配置
安装MySQL++之前需要先安装MySQL:
[root@localhost zhxilin]# yum install mysql-devel
[root@localhost zhxilin]#
紧接着下载MySQL++源码并解压,我们把压缩包解压到/usr/mysql++下:
[root@localhost zhxilin]# cd 下载
[root@localhost 下载]# wget http://www.tangentsoft.net/mysql++/releases/mysql++-3.2.2.tar.gz
[root@localhost 下载]# tar -zxvf mysql++-3.2..tar.gz -C /usr/
[root@localhost usr]# mv mysql++-3.2. mysql++
进入mysql++目录下,开始编译,先执行./configure生成makefile文件,之后再make,编译出libmysqlpp.so库文件:
[root@localhost mysql++]# ./configure --enable-thread-check
[root@localhost mysql++]# make
[root@localhost mysql++]# make install
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@localhost mysql++]# ldconfig
建议多做一步,创建so的连接:
[root@localhost mysql++]# ln -s /usr/local/lib/libmysqlpp.so /usr/lib/libmysqlpp.so
到这里就配置完成了。
2. C++调用mysql++
我先用MySQL创建了一个test数据库,并添加了一张Student表,结构如下:
并且插入了如下一些测试数据:
在C++代码里,我们连接这个test数据库之后,进行一个查询,并将结果打印出来:
#include <mysql++.h>
#include <iostream> using namespace std;
int main()
{
const char* db = , *server = , *user = , *password = "";
db = "test";
server = "localhost";
user = "zhxilin";
password = ""; 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);
cout << setw() << "Sid" <<
setw() << "Sname" <<
setw() << "Sage" <<
setw() << "Sgender" <<
setw() << "SDepartment" << endl; mysqlpp::StoreQueryResult::const_iterator it;
for (it = res.begin(); it != res.end(); ++it) {
mysqlpp::Row row = *it;
cout << setw() << row[] << ' ' <<
setw() << row[] << ' ' <<
setw() << row[] << ' ' <<
setw() << row[] << ' ' <<
setw() << row[] << ' ' <<
endl;
}
}
} else {
cout << "connect db fail. " << endl;
}
return ;
}
编译命令如下,编译时需要链接mysql和mysql++:
g++ -o main hello.cpp -lmysqlpp -I/usr/include/mysql -I/usr/local/include/mysql++
解释一下后面这段参数:
-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表里的数据。
MySQL++的更多用法,请参考官方文档http://www.tangentsoft.net/mysql++/doc/html/userman/
【菜鸟玩Linux开发】在C++里操作MySQL的更多相关文章
- 【菜鸟玩Linux开发】在Linux中使用VS Code编译调试C++项目
最近项目需求,需要在Linux下开发C++相关项目,经过一番摸索,简单总结了一下如何通过VS Code进行编译调试的一些注意事项. 关于VS Code在Linux下的安装这里就不提了,不管是CentO ...
- 【菜鸟玩Linux开发】通过MySQL自动同步刷新Redis
在服务端开发过程中,一般会使用MySQL等关系型数据库作为最终的存储引擎,Redis其实也可以作为一种键值对型的数据库,但在一些实际场景中,特别是关系型结构并不适合使用Redis直接作为数据库.这俩家 ...
- 【菜鸟玩Linux开发】Redis安装和自启动配置
Redis是一个C实现的基于内存.可持久化的键值对数据库,在分布式服务中常作为缓存服务.本篇将介绍在CentOS下如何从零开始安装到配置启动服务. 一. 安装Redis Redis的安装其实相当简单, ...
- 转载:【菜鸟玩Linux开发】通过MySQL自动同步刷新Redis
转载: http://www.cnblogs.com/zhxilin/archive/2016/09/30/5923671.html
- openresty开发系列28--openresty中操作mysql
openresty开发系列28--openresty中操作mysql Mysql客户端 应用中最常使用的就是数据库了,尤其mysql数据库,那openresty lua如何操作mysql呢? ...
- linux系统下phpstudy里的mysql使用方法
linux作为一个优秀的服务器端管理系统,其实linux的桌面系统也用起来十分的nice.好吧,如何你在做开发的时候在linux下安装了lmap或者phpstudy,那么在第一次使用其自带的mysql ...
- linux开发各种I/O操作简析,以及select、poll、epoll机制的对比
作者:良知犹存 转载授权以及围观:欢迎添加微信公众号:羽林君 IO 概念区分 四个相关概念: 同步(Synchronous) 异步( Asynchronous) 阻塞( Blocking ) 非阻塞( ...
- linux环境下写C++操作mysql(二)
main.cpp #include<stdio.h> #include<stdlib.h> #include"mysqlInterface.h" int m ...
- [c/c++]linux下使用c/c++操作mysql
首先需要安装相应的库文件,直接apt-get就可以. sudo apt-get install libmysqlclient-dev 编译的时候,需要额外链接到这个库.如果是apt-get安装的话,那 ...
随机推荐
- 分享一个快速测试ios软件的工具
简易IPA安装地址生成器 地址: https://www.neicexia.com/IPADistribute/Resources/index.html?fromsite#IPADistribute- ...
- VS2012开发工具BUG
发现VS2012开发工具 新建立项目名称长度限制的一个bug, 向导方式名称长度限制56个,但建立好的项目名称长度是可以改的很长很长. 也有想是不是生成程序集的名称会有限制,同样这里生成程序集名称,及 ...
- ExtJs 获取Dom对象
对象指页面上的某一部分,如:Input等.我觉得在EXT JS中会有三类基本对象,htmlelement , EXT.Element和CompositeElement .分别解释一下: htmlele ...
- C#发送邮件
以下代码已用 .yeah .qq 以及本人公司邮箱测试通过,可多发,可挂附件 本次测试邮件发送类,是用的winform 页面如下 窗口的后台代码如下: using System; using Syst ...
- Android 图片添加水印图片或者文字
给图片添加水印的基本思路都是载入原图,添加文字或者载入水印图片,保存图片这三个部分 添加水印图片: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...
- css3的transition过渡
从*开始样式*,经过指定*时间*后,缓慢过渡到*结束样式* 语法:transition:要变化的属性名 持续时间 速度变化类型 延迟 强调:写在开始样式中 如何实现多个属性同时过渡:2种办法: 1. ...
- Scatterplots 散点图
Simple Scatterplot # Simple Scatterplot attach(mtcars)plot(wt, mpg, main="Scatterplot Example&q ...
- Ajax Step By Step3
第三[.$.getScript()和$.getJSON()] jQuery 提供了一组用于特定异步加载的方法:$.getScript(),用于加载特定的 JS 文件: $.getJSON(),用于专门 ...
- Codeforces Round #200 (Div. 1) D. Water Tree(dfs序加线段树)
思路: dfs序其实是很水的东西. 和树链剖分一样, 都是对树链的hash. 该题做法是:每次对子树全部赋值为1,对一个点赋值为0,查询子树最小值. 该题需要注意的是:当我们对一棵子树全都赋值为1的 ...
- .net配置文件读取
public static string LogPath { get { return AppSettingValue(); } } public static string AppSettingVa ...