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的基本用法,到简单的封装,再到 ...
随机推荐
- bzoj2743
其实和bzoj1878类似只不过要求的是区间内数量多于1个的数字种数其实还是按照bzoj1878做只不过我们是把每一种数字下一个出现的位置+1,并把这个位置置为0 ..] of longint; ma ...
- 转 @RenderBody()和@RenderSection()
强大的Razor引擎 一.Razor基础简介 Razor采用了cshtml后缀的文件名,截图如下: A. 版面布局 从图上看到,新的视图引擎已经没有了Site.Master这种MasterPage了, ...
- Linux学习笔记10——文件I/O之一
UNIX系统中的大多数文件I/O只需要用到5个函数:open,read,write,lseek以及close 文件描述符 文件描述符是一个非负整数,所有打开的文件都通过文件描述符引用 文件描述符的变化 ...
- Hdu 3966-Aragorn's Story LCT,动态树
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3966 Aragorn's Story Time Limit: 10000/3000 MS (Java/Ot ...
- 来更新一篇blog吧
最近做了一下hackerrank的20/20的比赛.平时都只能过2题,这周顺利地通过了四道题目竟然.当妄图冲击衬衫的时候,发现剩下三个题一点招数都没有,之后就跑去看了一下node.js了... 这次比 ...
- hdoj 1950 Bridging signals【二分求最大上升子序列长度】【LIS】
Bridging signals Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- javascript,jquery(闭包概念)(转)
偶尔听人说javascript闭包,让我联想起以前学编译原理和数字逻辑里讲的闭包,以前上课讲的闭包很难懂,而且含有递归的意思在里面,现在不想再查看里面的闭包概念. 但javascript我是经常要用, ...
- hdu5294||2015多校联合第一场1007 最短路+最大流
http://acm.hdu.edu.cn/showproblem.php? pid=5294 Problem Description Innocent Wu follows Dumb Zhang i ...
- 再回首,Java温故知新(十):数组
数组是程序中用来存储同一类型值的集合,基本所有编程语言中都有这种类型存在.声明数组时需要指出数组类型和数组变量名,初始化后数组的长度不可变,使用过程中通过下标来访问数组中的元素,示例代码如下: int ...
- mysql查看端口
在你的my.ini(Windows)或my.cfg(Linux) 中就有啊. 或者如果已经连入MySQL可以直接 SQL code ? 1 2 3 4 5 6 7 8 9 mysql> show ...