zoukankan      html  css  js  c++  java
  • 【菜鸟玩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.2.tar.gz -C /usr/
    [root@localhost usr]# mv mysql++-3.2.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数据库之后,进行一个查询,并将结果打印出来:

     1 #include <mysql++.h>
     2 #include <iostream>
     3 
     4 using namespace std;
     5 int main()
     6 {
     7     const char* db = 0, *server = 0, *user = 0, *password = "";
     8     db = "test";
     9     server = "localhost";
    10     user = "zhxilin";
    11     password = "";
    12     
    13     mysqlpp::Connection conn(false);
    14     if (conn.connect(db, server, user, password)) {
    15         cout << "connect db succeed. " << endl;
    16         mysqlpp::Query query = conn.query("SELECT * FROM Student");
    17         if (mysqlpp::StoreQueryResult res = query.store()) {
    18             cout.setf(ios::left);
    19             cout << setw(31) << "Sid" <<
    20                 setw(10) << "Sname" <<
    21                 setw(10) << "Sage" <<
    22                 setw(10) << "Sgender" <<                 
    23                 setw(10) << "SDepartment" << endl;
    24 
    25             mysqlpp::StoreQueryResult::const_iterator it;
    26             for (it = res.begin(); it != res.end(); ++it) {
    27                 mysqlpp::Row row = *it;
    28                 cout << setw(30) << row[0] << ' ' <<
    29                         setw(9) << row[1] << ' ' <<
    30                         setw(9) << row[2] << ' ' <<
    31                         setw(9) << row[3] << ' ' <<
    32                         setw(9) << row[4] << ' ' <<
    33                         endl;
    34             }
    35         }
    36     } else {
    37         cout << "connect db fail. " << endl;
    38     }
    39     return 0;
    40 }

     编译命令如下,编译时需要链接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/

  • 相关阅读:
    coding++:SpringBoot-事务注解详解
    coding++:java-自定义签名+拦截器
    linux++:Linux
    coding++:java-全局异常处理
    POJ 2823 双端队列
    POJ 3250 栈
    10进制数字向0~3999的罗马数字的转换
    POJ 1986 LCA
    POJ 1236 强联通分量
    河南工业大学2017校赛题解
  • 原文地址:https://www.cnblogs.com/zhxilin/p/5897211.html
Copyright © 2011-2022 走看看