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的基本用法,到简单的封装,再到 ...
随机推荐
- page-object使用(3)---元素嵌套
很可能我们要定位的元素位于其他的元素里面,所有的元素都有一个*_element方法需找元素自身的上下文.例如,如果我想找一个unordered_list嵌套在一个div里面,可以这么做: div(:e ...
- Performance testing of web application
Testing the performance of web application is easy . It's easy to design unrealistic scenario . Easy ...
- .net开源工作流引擎ccflow
关于济南驰骋信息技术有限公司的.net开源工作流引擎 驰骋工作流引擎,工作流程管理系统:简称ccflow,驰骋一体化解决方案简称ccport. ccflow是济南驰骋信息技术有限公司向社会提供的一款1 ...
- duang体加班版
领导第一次让我加班的时候,其实我是拒绝的,因为我觉着加班这个事,不能你让我加我就加,晚了就没有地铁了..领导跟我说可以打车报销.加了一个月之后,我的钱包duang~,后来我知道报销其实是假的,我每天打 ...
- Java 集合框架 ArrayList 源码剖析
总体介绍 ArrayList实现了List接口,是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入null元素,底层通过数组实现.除该类未实现同步外,其余跟Vector大致相同.每个ArrayL ...
- 从Java视角理解CPU缓存(CPU Cache)
从Java视角理解系统结构连载, 关注我的微博(链接)了解最新动态众所周知, CPU是计算机的大脑, 它负责执行程序的指令; 内存负责存数据, 包括程序自身数据. 同样大家都知道, 内存比CPU慢很多 ...
- Validate XML using a XSD (XML Schema)
Consider this XML file howto.xml : <?xml version="1.0" encoding="ISO-8859-1"? ...
- IOS开发中 RunLoop,RunTime
1.Objective-C中的函数调用 对于C语言,函数调用是由编译器直接转化完成的,在编译时程序就开始查找要执行的函数(C语言函数调用原理).而在OC中,我们将函数调用称为消息发送.在编译时程序不查 ...
- BAE、SAE 与 GAE 对比
从数据库.应用配置.计费.域名绑定.平台服务对比了 BAE.SAE 以及 GAE 的优劣,最后给出云平台选型的建议. 数据库SAE 不支持 InnoDB(可申请支持),BAE 默认支持. BAE 不支 ...
- CentOS6.5解决中文乱码与设置字符集
[ CleverCode发表在csdn博客中的原创作品,请勿转载,原创地址:http://blog.csdn.net/clevercode/article/details/46377577] 1)说明 ...