这篇笔记主要参考这篇文章: http://zetcode.com/db/mysqlc/

基础配置

安装必要的文件:

sudo apt-get install libmysqlclient-dev

之后终端进入MqSQL, 建立新的数据库和用户, 然后给用户赋予有关的权限:

CREATE database testdb;
CREATE USER user12@localhost IDENTIFIED BY '34klq*';
GRANT ALL ON testdb.* to user12@localhost;

之后在testdb上创建一个表:

USE testdb;CREATE TABLE userinfo(username VARCHAR(30) PRIMARY KEY,password VARCHAR(30) NOT NULL,wintimes INT,failtines INT
);

主要的API

数据库的主要操作就是增删改查, 那么分别说明这几个API.

首先, 需要获取数据库的实例:

MYSQL *con = mysql_init(NULL);

那么, 所有的操作都必须围绕con进行执行. 这相当于一个连接对象.

之后, 需要建立一个链接, 指明数据库和用户:

mysql_real_connect(m_SQLCON, "localhost", "user12", "34klq*","testdb", 0, NULL, CLIENT_MULTI_STATEMENTS);

指明用户和密码. 如果返回NULL, 则说明失败.

其余的增删改查的语句, 都通过mysql_query执行. 具体直接参考下面的最终代码.

注意一个地方, 每次执行完成语句后, mysql不是立刻提交, 这里面有事物的概念, 不在这里进行讨论. 需要说明的是, 如果一次进行多次操作, 需要单独进行语句提交操作, 代码格式如下:

MYSQL_RES* pRes;
do {pRes = mysql_use_result(m_SQLCON);mysql_free_result(pRes);
} while(!mysql_next_result(m_SQLCON));

最终的代码

#include <mutex>
#include <atomic>
#include <string>
#include <memory>
#include <mysql/mysql.h>
#include <vector>
#include <iostream>/** 数据库的链接单例* */
class DBServer {public:static std::shared_ptr<DBServer> getDBServer() {if (DBServer::m_pDBServer != nullptr) {return m_pDBServer;} else {std::mutex mtx;std::lock_guard<std::mutex> lock(mtx);if (!m_OK) {// 注意这里无法使用make_sharedm_pDBServer = std::shared_ptr<DBServer>(new DBServer());m_OK = true;}return m_pDBServer;}}~DBServer() {mysql_close(m_SQLCON);}// 注册用户信息bool registerUserInfo(const std::string &username, const std::string &password, std::string &result);// 登录信息验证, 成功返回truebool signInQuery(const std::string &username, const std::string &password, std::string &result);// 更新用户密码bool updateUserPassword(const std::string &username, std::string &result);// 更新作战的局数, delta正数获胜, 负数失败bool updateUserCombatNum(const std::string &username, int delta, std::string &result);private:explicit DBServer();void finishQuery() {MYSQL_RES* pRes;do {pRes = mysql_use_result(m_SQLCON);mysql_free_result(pRes);} while(!mysql_next_result(m_SQLCON));}MYSQL *m_SQLCON;static std::shared_ptr<DBServer> m_pDBServer;static std::mutex m_mtx;static bool m_OK;
};bool DBServer::m_OK = false;
std::shared_ptr<DBServer> DBServer::m_pDBServer = nullptr;void finish_with_error(MYSQL *con) {fprintf(stderr, "%s\n", mysql_error(con));mysql_close(con);exit(1);
}DBServer::DBServer() {m_SQLCON = mysql_init(NULL);if (m_SQLCON == NULL) {std::cerr << "can not connect to mysql server\n";exit(1);}if ((mysql_real_connect(m_SQLCON, "localhost", "user12", "34klq*","testdb", 0, NULL, CLIENT_MULTI_STATEMENTS)) == NULL) {finish_with_error(m_SQLCON);}
}bool DBServer::registerUserInfo(const std::string &username, const std::string &password, std::string &result) {std::string sql("INSERT INTO userinfo(username, password, wintimes, failtimes) " + std::string("VALUES (\"") + username + "\", \"" + password +"\", 0, 0);");if (mysql_query(m_SQLCON, sql.c_str())) {result = std::string(mysql_error(m_SQLCON));return false;}finishQuery();return true;
}bool DBServer::signInQuery(const std::string &username, const std::string &password, std::string &result) {std::string sql("SELECT username, password FROM userinfo WHERE username = \"" + username + "\" AND password = \"" +password + "\";");if (mysql_query(m_SQLCON, sql.c_str())) {result.clear();result += std::string(mysql_error(m_SQLCON));return false;}auto res = mysql_store_result(m_SQLCON);int num_fields = mysql_num_fields(res);if (num_fields <= 0) {result = std::string("Query error\n");return false;}MYSQL_ROW row = mysql_fetch_row(res);if (!row) {result = std::string("username: " + username + " does not exist!");return false;}auto username_ = std::string(row[0]);auto password_ = std::string(row[1]);if (username != username_) {result = std::string("username: " + username + " does not exist!");return false;}if (password_ != password) {result = std::string("password error!");return false;}finishQuery();return true;
}bool DBServer::updateUserPassword(const std::string &username, std::string &result) {return false;
}bool DBServer::updateUserCombatNum(const std::string &username, int delta, std::string& result) {std::string sql("SELECT username FROM userinfo WHERE username = \"" + username + "\";");if (mysql_query(m_SQLCON, sql.c_str())) {  // 确认用户确实存在result.clear();result += std::string(mysql_error(m_SQLCON));return false;}finishQuery();sql.clear();std::string num;num.clear();if (delta > 0) {  // 胜利的次数sql = std::string("UPDATE userinfo SET wintimes = wintimes + " + std::to_string(delta) + " where username = \"" + username + "\"");} else {  // 失败了sql = std::string("UPDATE userinfo SET failtimes = failtimes + " + std::to_string(-delta) + " where username = \"" + username + "\"");}if (mysql_query(m_SQLCON, sql.c_str())) {result.clear();result = std::string("update failed, ") + std::string(mysql_error(m_SQLCON));return false;}finishQuery();return true;
}int main() {auto it = DBServer::getDBServer();std::string res;std::cout << it->signInQuery("tiger", "123", res) << std::endl;std::cout << res << std::endl;res.clear();std::cout << it->updateUserCombatNum("tiger", 1, res);std::cout << res << std::endl;res.clear();std::cout << it->registerUserInfo("lion", "345", res) << std::endl;std::cout << res << std::endl;return 0;
}

Linux C++使用MySQL数据库相关推荐

  1. 如何在linux系统下修改mysql密码_如何在linux下修改mysql数据库密码?linux修改数据库密码的方法...

    本篇文章给大家带来的内容是介绍如何在linux下修改mysql数据库密码?linux修改数据库密码的方法.有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. Linux下修改Mysql的 ...

  2. Linux下修改Mysql数据库存放路径

    Linux下修改Mysql数据库存放路径 原路径:/var/lib/mysql 目标路径:/home/data/mysql 1.home目录下建立data目录 cd /home mkdir data ...

  3. Linux中的MySql数据库远程连接

    Linux中的MySql数据库远程连接 rpm–qa |grep mysql安装了以下的包: mysql-libs-5.1.71-1.el6.x86_64 mysql-connector-java-5 ...

  4. linux mysql 数据文件,Linux下修改MySQL数据库数据文件路径的步骤

    使用rpm安装方式安装完MySQL数据库后,数据文件的默认路径为/var/lib/mysql,然而根目录并不适合用于存储数据文件. 原路径:/var/lib/mysql 目标路径:/home/mysq ...

  5. linux php 安装mysql数据库_linux php安装mysql数据库有哪些方法

    linux php安装mysql数据库有哪些方法 发布时间:2020-07-15 15:25:56 来源:亿速云 阅读:74 作者:Leah 本篇文章给大家分享的是有关linux php安装mysql ...

  6. linux jsp mysql数据库,Linux JSP连接MySQL数据库.pdf

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspJava Linux JSP连接MySQL数据库.pdf2页 本 ...

  7. Linux自动备份MySQL数据库脚本代码

    Linux自动备份MySQL数据库脚本代码 下面这段Linux的Shell脚本用于每日自动备份MySQL数据库,可通过Linux的crontab每天定时执行 在脚本中可设置需要备份的数据库表清单,并且 ...

  8. 卸载linux下的mysql数据库实例_Linux下卸载MySQL数据库实例教程

    本文主要介绍了Linux下卸载MySQL数据库的方法,不知道Linux下卸载MySQL数据库的小伙伴们可以学习一下,本文具有一定的参考价值,希望能帮助到大家. 如何在Linux下卸载MySQL数据库呢 ...

  9. Linux下开启mysql数据库的远程访问权限

    摘要:今天在Linux服务器上安装了msyql数据库,在本地访问的时候可以访问,但是我想通过远程的方式访问的时候就不能访问了,查询资料后发现,Linux下mysql默认安装完成后只有本地访问的权限,没 ...

  10. mysql中文问号 linux,解决Linux系统下Mysql数据库中文显示成问号的问题

    Linux系统下 MYSQL数据库中的数据库文件在本机内迁移 (需暂停服务的方式) Linux系统下 MYSQL数据库中的数据库文件在本机内迁移 本机采用Ubuntu16.04系统,tar方式安装My ...

最新文章

  1. 雷博招聘|机器人(SLAM)、深度学习、机器视觉算法工程师等岗位
  2. 开发者,只有被裁,没有退休
  3. 从weblogic的一个教训
  4. html5开发app的缺点,全解HTML 5在移动Web应用的优劣势
  5. Linux /proc/pid目录下相应文件的信息说明和含义
  6. ltp-ddt realtime_cpu_load涉及的cyclictest 交叉编译
  7. 难道你不好奇?Thread.sleep(0):线程休眠0秒有什么意义!
  8. Kafka从上手到实践 - Kafka CLI:Reseting Offset Config CLI | 凌云时刻
  9. 4G模块UICC逻辑通道入口+CGLA
  10. ios 企业签 plist 安装 通用模板
  11. CentOS上如何顺利地安装MySQL?
  12. spark大数据的学习
  13. python算法 之 猜词游戏
  14. Django学习笔记-settings.py详解
  15. CIELab和LCH的色彩空间图
  16. mysql 伪表_伪表和伪列
  17. 企业微信应用开发(JS-SDK网页式开发)第一集:创建应用以及配置可信域名
  18. 【高德地图】iOS 开发汇总(一)
  19. 关于lower_bound( )和upper_bound( )的常见用法
  20. 数值分析笔记(一):方程求根

热门文章

  1. mysql中member_在MySql中实现MemberShip的权限管理
  2. _如何在各种Linux发行版中安装zip压缩与解压缩程序
  3. B - Dungeon Master
  4. CSDN上下标输入方法
  5. Chrome禁止http自动转为https
  6. 线性筛法求质数分解、欧拉函数
  7. 【Qt串口调试助手】1.4 - 16进制接收/发送
  8. UML--行为图(状态图、活动图)
  9. 面试—每日一题(3)
  10. selenium-webdriver——如何在启动firefox时加载扩展