/*
*介绍:MySQL的简单封装,支持流操作输入输出MySQL语句,然而并没有什么软用,大二学生自娱自乐,有不足求指点
*作者:MrEO
*日期:2016.3.26
*/

头文件 my_sql.h

 #ifndef MY_SQL_H
#define MY_SQL_H #include <mysql.h>
#include <iostream>
#include <string>
#include <iomanip> class My_sql
{
public:
My_sql();  //初始化API、初始化结构、设置字符集、连接数据库
~My_sql(); //释放内存、关闭服务器连接、结束服务器库、结束API库
unsigned row_count();   //返回集中的行数
unsigned field_count(); //返回集中的列数
friend std::ostream & operator <<(std::ostream &out, My_sql &sql);
     //通过std::ostream输出列名、结果集
friend std::istream & operator >>(std::istream &in, My_sql &sql);
     //通过std::istream输入执行SQL语句,并保存结果集地址至成员变量result
// friend My_sql & operator >>(const std::string &q, My_sql &sql);
     //通过std::string输入执行SQL语句 ,并保存结果集地址至成员变量result
friend My_sql & operator <<(My_sql &sql, const std::string &q);
     //通过std::string输入执行SQL语句 ,并保存结果集地址至成员变量result protected:
bool query(const std::string &q);    //执行SQL语句,保存完整的结果集地址至成员变量result
My_sql & display_field_name(std::ostream &out = std::cout, int setw_n = ); //输出列名
My_sql & display_result(std::ostream &out = std::cout, int setw_n = ); //输出结果集
MYSQL mysql; //对象
MYSQL_RES *result = NULL; //结果集
MYSQL_FIELD *field = NULL; //列
MYSQL_ROW row; //行
}; #endif

实现文件 my_sql.cpp

 #include "my_sql.h"

 My_sql::My_sql()
{
mysql_library_init( NULL, , ); //初始化MySQL C API库
mysql_init( &mysql ); //获取或初始化MYSQL结构。
mysql_options( &mysql, MYSQL_SET_CHARSET_NAME, "utf8" ); //设置字符集
mysql_real_connect( &mysql, "localhost", "root", "password", "my_sql", , NULL, CLIENT_MULTI_STATEMENTS );
//连接数据库
}
My_sql::~My_sql()
{
mysql_free_result( result ); //释放结果集使用的内存
mysql_close( &mysql ); //关闭服务器连接
mysql_server_end(); //最终确定嵌入式服务器库
mysql_library_end(); //最终确定MySQL C API库
}
bool My_sql::query(const std::string &q)
{
result = NULL;
mysql_query( &mysql, q.c_str() ); //执行指定为“以Null终结的字符串”的SQL查询。
result = mysql_store_result( &mysql ); //检索完整的结果集至客户端
if ( NULL == result ) {
std::cerr << "Query Error!";
return false;
}
return true;
} unsigned My_sql::row_count()
{
return mysql_num_rows( result ); //返回集中的行数
}
unsigned My_sql::field_count()
{
return mysql_num_fields( result ); //返回集中的列数
} My_sql & My_sql::display_field_name(std::ostream &out, int setw_n)
{
for ( unsigned int i = ; i < field_count(); ++i ) {
out << std::setw(setw_n) << ( mysql_fetch_field_direct( result, i ) -> name );
//给定字段编号,返回表字段的类型。输出列名
}
out << std::endl;
return *this;
} My_sql & My_sql::display_result(std::ostream &out, int setw_n)
{
while( row = mysql_fetch_row( result ) ) //从结果集中获取下一行
{
for(int i = ; i < field_count(); ++i )
{
if ( NULL == row[i]) {
out << std::setw(setw_n) << "(NULL)";
}
else {
out << std::setw(setw_n) << row[i];
}
}
out << std::endl;
}
return *this;
} std::ostream & operator <<(std::ostream &out, My_sql &sql)
{
sql.display_field_name(out).display_result(out);
//输出列名和结果集 return out;
} std::istream & operator >>(std::istream &in, My_sql &sql)
{
std::string q;
std::getline(in, q); //输入整行
if ( !sql.query(q) ) {
exit();
}
return in;
} //My_sql & operator >>(const std::string &q, My_sql &sql)
//{
// if ( !sql.query(q) ) {
// exit(1);
// }
// return sql;
//} My_sql & operator <<(My_sql &sql, const std::string &q)
{
if ( !sql.query(q) ) {
exit();
}
return sql;
}

调用实例 main.cpp

 #include <iostream>
#include "my_sql.h" using std::cin;
using std::cout; int main(int argc, char* argv[])
{
My_sql sql;
sql << "SELECT * FROM my_table";
cout << sql;
cin >> sql;
cout << sql;
return ;
}

MySQL的C++简单封装的更多相关文章

  1. mysql使用pdo简单封装select语句

    最终代码: function pdo_array_query($pdo, $table_name, $data, $fields=array('*')){ //Will contain SQL sni ...

  2. 对pymysql的简单封装

    #coding=utf-8 #!/usr/bin/python import pymysql class MYSQL: """ 对pymysql的简单封装 "& ...

  3. DBUtils-对JDBC简单封装的开源工具类库

    DBUtils 是对JDBC简单封装的开源工具类 详细介绍地址:  https://baike.baidu.com/item/Dbutils/10655914?fr=aladdin 在使用DBUtil ...

  4. 进击的Python【第十二章】:mysql介绍与简单操作,sqlachemy介绍与简单应用

    进击的Python[第十二章]:mysql介绍与简单操作,sqlachemy介绍与简单应用 一.数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数 ...

  5. .net core 中简单封装Dapper.Extensions 并使用sqlsuger自动生成实体类

    引言 由公司需要使用dapper  同时支持多数据库 又需要支持实体类 又需要支持sql 还需要支持事务 所以采用了 dapper + dapperExtensions  并配套 生成实体类小工具的方 ...

  6. pymysql DAO简单封装

    #!/usr/bin/env python # -*-coding:utf-8 -*- # # 无法执行多个query,self.conn.close()放在CdbConn类的单独函数中,每次quer ...

  7. python Mysql数据库连接池组件封装(转载)

    以前一直在用Java来开发,数据库连接池等都是有组件封装好的,直接使用即可,最近在尝试Python的学习,碰到了和数据库打交道的问题,和数据库打交道我们都知道,数据库连接池必不可少,不然要么就是程序异 ...

  8. JDBC【2】-- JDBC工作原理以及简单封装

    目录 1. 工作原理 1.1 加载驱动 1.1.1 类加载相关知识 1.1.2 为什么JDK 1.6之后不需要显示加载了? 1.2 驱动加载完成了,然后呢? 2. 简单封装 1. 工作原理 一般我们主 ...

  9. Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池

    前言:由于最近在做SDK的功能,需要设计线程池.看了很多资料不知道从何开始着手,突然发现了AsyncTask有对线程池的封装,so,就拿它开刀,本文将从AsyncTask的基本用法,到简单的封装,再到 ...

随机推荐

  1. 如何实现View上添加标签

    效果图: 利用 https://github.com/linger1216/labelview 类库来实现 具体代码 问度娘. {LabelView label = new LabelView(thi ...

  2. MySQL中的类Decode用法

    SELECT DISTINCT ( CASE ' THEN '关羽' ' THEN ' 张飞' ' THEN ' 赵云' ' THEN ' 马超' ' THEN ' 黄忠' ' THEN ' 魏延' ...

  3. [转]让程序在崩溃时体面的退出之Dump文件

    原文地址:http://blog.csdn.net/starlee/article/details/6630816 在我的那篇<让程序在崩溃时体面的退出之CallStack>中提供了一个在 ...

  4. Windbg扩展的一些参考文章

    Windbg脚本和扩展工具开篇http://www.cnblogs.com/pugang/archive/2012/11/30/2796617.html WinDbg简单扩展DLL http://ww ...

  5. poj 1228 凸包

    题目链接:http://poj.org/problem?id=1228 #include<cstdio> #include<cstring> #include<cmath ...

  6. python 3 操作 excel

    看到一篇很好的python读写excel方式的对比文章: 用Python读写Excel文件 关于其他版本的excel,可以通过他提供的链接教程进行学习. XlsxWriter: https://git ...

  7. 通过例子学python(2.1)

    第二章 列表和元组 2.1 序列概览 #第2章 列表和元组 #2.1 序列概览 #序列sequence , 序列中每一个元素被分配一个序号,即元素的位置,也称为索引. #从前往后,0,1,2,3,:从 ...

  8. Linux 下挂载硬盘的 方法

    1. 添加磁盘,查看磁盘状况 [root@db1 /]# fdisk -l Disk /dev/sda: 10.7 GB, 10737418240 bytes 255 heads, 63 sector ...

  9. Page Cache buffer Cache

    https://www.thomas-krenn.com/en/wiki/Linux_Page_Cache_Basics References Jump up ↑ The Buffer Cache ( ...

  10. 53个要点提高php效率

    用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说 ...