MySQL的C++简单封装
/*
*介绍: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++简单封装的更多相关文章
- mysql使用pdo简单封装select语句
最终代码: function pdo_array_query($pdo, $table_name, $data, $fields=array('*')){ //Will contain SQL sni ...
- 对pymysql的简单封装
#coding=utf-8 #!/usr/bin/python import pymysql class MYSQL: """ 对pymysql的简单封装 "& ...
- DBUtils-对JDBC简单封装的开源工具类库
DBUtils 是对JDBC简单封装的开源工具类 详细介绍地址: https://baike.baidu.com/item/Dbutils/10655914?fr=aladdin 在使用DBUtil ...
- 进击的Python【第十二章】:mysql介绍与简单操作,sqlachemy介绍与简单应用
进击的Python[第十二章]:mysql介绍与简单操作,sqlachemy介绍与简单应用 一.数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数 ...
- .net core 中简单封装Dapper.Extensions 并使用sqlsuger自动生成实体类
引言 由公司需要使用dapper 同时支持多数据库 又需要支持实体类 又需要支持sql 还需要支持事务 所以采用了 dapper + dapperExtensions 并配套 生成实体类小工具的方 ...
- pymysql DAO简单封装
#!/usr/bin/env python # -*-coding:utf-8 -*- # # 无法执行多个query,self.conn.close()放在CdbConn类的单独函数中,每次quer ...
- python Mysql数据库连接池组件封装(转载)
以前一直在用Java来开发,数据库连接池等都是有组件封装好的,直接使用即可,最近在尝试Python的学习,碰到了和数据库打交道的问题,和数据库打交道我们都知道,数据库连接池必不可少,不然要么就是程序异 ...
- JDBC【2】-- JDBC工作原理以及简单封装
目录 1. 工作原理 1.1 加载驱动 1.1.1 类加载相关知识 1.1.2 为什么JDK 1.6之后不需要显示加载了? 1.2 驱动加载完成了,然后呢? 2. 简单封装 1. 工作原理 一般我们主 ...
- Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池
前言:由于最近在做SDK的功能,需要设计线程池.看了很多资料不知道从何开始着手,突然发现了AsyncTask有对线程池的封装,so,就拿它开刀,本文将从AsyncTask的基本用法,到简单的封装,再到 ...
随机推荐
- 【传】玩转Android---UI篇---ImageButton(带图标的按钮)
原文网址:http://hualang.iteye.com/blog/964049 除了Android系统自带的Button按钮一万,还提供了带图标的按钮ImageButton 要制作带图标的按钮,首 ...
- C# 加密解密(DES,3DES,MD5,Base64) 类
public sealed class EncryptUtils { #region Base64加密解密 /// <summary> ...
- ZOJ Problem Set - 3758 素数
Singles' Day Time Limit: 2 Seconds Memory Limit: 65536 KB Singles' Day(or One's Day), an unofficial ...
- 折腾iPhone的生活——我的越狱插件精品筛选
威锋上有人说的好,iOS系统越狱是为了装更多东西,安卓Root是为了删更多东西. 插件 众所周知,iOS系统是非常封闭的,基本上涉及到底层的功能在iOS上都不能实现,除非越狱装插件,所以插件就成为 ...
- 352. Data Stream as Disjoint Intervals
Plz take my miserable life T T. 和57 insert interval一样的,只不过insert好多. 可以直接用57的做法一个一个加,然后如果数据大的话,要用tree ...
- 【转载】nginx 并发数问题思考:worker_connections,worker_processes与 max clients
注:这个文章主要是作者一直在研究nginx作为http server和反向代理服务器时候所谓最大的max_clients和 worker_connections的计算公式, 其实最后的结论也没有卡上公 ...
- Hibernate常用接口
Hibernate的接口类型 在了解了Hibernate的基本配置,映射文件后,道路已经铺平了.我们继续往前走.接下来,我们应该做的是了解Hibernate常用的接口,对Hibernate的工作方式进 ...
- 用户体验设置和UI设计的10个不同点
在这个技术的世界,UX和UI这两个词条在差点儿全部公司都非常流行,不管大小,都在寻找招聘UX/UI设计师. 这两个缩写词条使得整个技术工业为之疯狂,由于它们是最先进的前沿技术. 那这两个词条实际上是什 ...
- Kruskal算法模拟讲解
Kruskal 算法是一个求最小生成树的算法,即求最小的开销等 算法可以这样,要求得最小生成树,那么n个节点只能包括n-1条边 所以我们应该转换为寻找这最短的n-1条边,因此,可以先对所有的 边进行从 ...
- 浙江大学PAT上机题解析之1014. 福尔摩斯的约会 (20)
1014. 福尔摩斯的约会 (20) 时间限制 50 ms 内存限制 32000 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Y ...