mysql++实际上就是把mysql本身的一些api进行一次封装,是以面向对象的思想来处理问题了。 具体内容可以到网上查下我这里就不多说了。
这篇文章主要是举一个完整的例子方便大家学习。
1、首先做好准备我们先来建立一个简单的表这个我就不用命令了,因为不会。。。 只能用可视化的工具呵呵。
先使用navicat premium 工具连接上自己的mysql
输入自己的账号密码之后点击连接测试, 如果连接成功的话会显示如下图
然后就是先创建一个测试使用的表
鼠标放在上图的localhos 点击鼠标右键 ---》 新建数据库 按照下图进行配置点击确定之后 数据库就建好了
接下来开始建表
点击表里的新建表
如上图所示点击保存并把名字填上去我起名为testInfo
OK 第一步准备工作已经完成接下来我们开始写代码
1、 第一步连接数据库
#pragma once
#include <mysql++.h>
// DatabaseInstance.h文件
class DatabaseInstance
{
public:
DatabaseInstance();
~DatabaseInstance();
public:
// 第一步打开数据库 成功返回true 失败返回false
bool open(const char* dbName, const char* host, const char* user, const char* passwd );
// // 第二部数据库建立好,查询对象也赋值了,开始执行sql语句
// bool execSQL( const char* sql );
//
// // 第三步执行有返回结果的查询
// bool querySQL( const char* sql, CppMySQLQuery& pQuery);
private:
mysqlpp::Connection* m_pConn; // 建立一个连接对象
};
// DatabaseInstance.cpp文件
#include "DatabaseInstance.h"
DatabaseInstance::DatabaseInstance()
:m_pConn(NULL)
{
m_pConn = new mysqlpp::Connection(false);
}
DatabaseInstance::~DatabaseInstance()
{
}
bool DatabaseInstance::open(const char* dbName, const char* host, const char* user, const char* passwd )
{
// 首先设置字符集 如果你不设置的话到时候存进去的utf8格式会乱码
if ( m_pConn-> set_option( new mysqlpp::SetCharsetNameOption("utf8")) )
{
// TODO: 设置字符集成功
}
// 连接数据库
if ( m_pConn->connect( dbName, host, user, passwd ) == false ) return false;
// 用建立的m_pconn建立一个查询对象
printf("数据库名:%s, 连接成功\n", dbName );
return true;
}
// main.cpp文件
#include <iostream>
#include "DatabaseInstance.h"
// 由于是单独抽离出来的我就不再注意机构的优越性我直接在全局声明对象
DatabaseInstance database;
int main()
{
// 第一步连接数据库
database.open( "testdb", "localhost", "root", "123456" );
第二部测试插入数据
//database.execSQL("insert into testInfo(id,testValue1,testValue2) values(1,2,'helloworld')");
第三部分测试有返回结果的查询
//CppMySQLQuery mySqlQuery;
//database.querySQL("select * from testInfo", mySqlQuery );
//int id = mySqlQuery.getIntField("id");
//int nValue = mySqlQuery.getIntField("testValue1");
//const char* pcValue = mySqlQuery.getStringField("testValue2");
//printf("查询结果\n id:%d, testValue1:%d, testValue2:%s", id, nValue, pcValue );
getchar();
return 0;
}
第一步连接数据库 注意 运行时会说有两个文件找不到libmysql.dll和mysqlpp_d.dll文件, 这两个文件一个是mysql里面的一个文件一个是mysql++里面的一个文件, 直接拷贝的运行目录下, 即你生成的.exe文件的目录下。
还有一点主要你必须把你的mysql++的配置文件配好。 连接mysql++的库要搞好了我上面的代码才成立。 还有我头文件也是在配置文件里已经配置好的。
2、 连接上数据库之后就是简单的增删改查了我这边就直接把代码全部献上
// DatabaseInstance.h文件
#pragma once
#include <mysql++.h>
class CppMySQLQuery
{
friend class DatabaseInstance;
public:
CppMySQLQuery();
virtual ~CppMySQLQuery();
public:
// 获得语句指针
mysqlpp::StoreQueryResult* getQueryResultPlr(){ return &m_res; }
// 一共查询到多少行数据
u_long numRow();
// 一共有多少列
unsigned int numFields();
// 获得列的类型暂时不知道什么用 暂时不实现
// ------------------------------------------
// 获得各种类型数据
int getIntField( int nField, int nNullValue = 0 );
int getIntField( const char* szField, int nNullValue = 0 );
__int64 getLongField( int nField, __int64 nNullValue = 0 );
__int64 getLongField( const char* szField, __int64 nNullValue = 0 );
double getDoubleField( int nField, double fNullValue = 0.0f );
double getDoubleField( const char* szField, double fNullValue = 0.0f );
const char* getStringField( int nField, const char* szNullValue = "" );
const char* getStringField( const char* szField, const char* szNullValue = "" );
// 判断是否是最后一行
bool eof();
// 将当前行数往下移动一行
void nextRow();
// 释放资源
void freeRes();
protected:
// int fieldIndex( const char* szField );
// 判断传的字符是否在表中
bool findFiledName(const char* pszField);
// 逐字符转换大写为小写
static char* StringLower( const char* pString , char* out, int length = -1 );
private:
mysqlpp::StoreQueryResult m_res;
unsigned int m_CurselRow;
};
// DatabaseInstance.h文件
class DatabaseInstance
{
public:
DatabaseInstance();
~DatabaseInstance();
public:
// 第一步打开数据库 成功返回true 失败返回false
bool open(const char* dbName, const char* host, const char* user, const char* passwd );
// 第二部数据库建立好,查询对象也赋值了,开始执行sql语句
bool execSQL( const char* sql );
// 第三步执行有返回结果的查询
bool querySQL( const char* sql, CppMySQLQuery& pQuery);
private:
mysqlpp::Connection* m_pConn; // 建立一个连接对象
};
// DatabaseInstance.cpp 文件
#include "DatabaseInstance.h"
// CppMySQLQuery 所有成员函数定义
CppMySQLQuery::CppMySQLQuery()
:m_CurselRow(0)
{
m_res.clear();
}
CppMySQLQuery::~CppMySQLQuery()
{
}
u_long CppMySQLQuery::numRow()
{
if ( m_res.empty() )
{
return 0;
}
int a = m_res.num_rows();
return ( u_long )m_res.num_rows();
}
unsigned int CppMySQLQuery::numFields()
{
if ( m_res.empty() )
{
return 0;
}
return m_res.num_fields();
}
int CppMySQLQuery::getIntField( int nField, int nNullValue /*= 0*/ )
{
if ( m_res.empty() || nField + 1 > (int)numFields() || numRow() == 0 )
{
return nNullValue;
}
return (int)m_res[ m_CurselRow ][ nField ];
}
int CppMySQLQuery::getIntField( const char* szField, int nNullValue /*= 0*/ )
{
if ( m_res.empty() || 0 == numRow() || findFiledName( szField ) == false )
{
return nNullValue;
}
return m_res[m_CurselRow][szField];
}
__int64 CppMySQLQuery::getLongField( int nField, __int64 nNullValue /*= 0*/ )
{
if ( m_res.empty() || nField + 1 > (int)numFields() || 0 == numRow() )
{
return nNullValue;
}
return m_res[ m_CurselRow ][ nField ];
}
__int64 CppMySQLQuery::getLongField( const char* szField, __int64 nNullValue /*= 0*/ )
{
if ( m_res.empty() || NULL == szField || 0 == numRow() || findFiledName( szField ) == false )
{
return nNullValue;
}
return m_res[ m_CurselRow ][ szField ];
}
double CppMySQLQuery::getDoubleField( int nField, double fNullValue /*= 0*/ )
{
if ( m_res.empty() || nField + 1 > (int)numFields() || 0 == numRow() )
{
return fNullValue;
}
return m_res[ m_CurselRow ][ nField ];
}
double CppMySQLQuery::getDoubleField( const char* szField, double fNullValue /*= 0.0f*/ )
{
if ( m_res.empty() || NULL == szField || 0 == numRow() || findFiledName( szField ) == false )
{
return fNullValue;
}
return m_res[ m_CurselRow ][ szField ];
}
const char* CppMySQLQuery::getStringField( int nField, const char* szNullValue /*= ""*/ )
{
if ( m_res.empty() || nField + 1 > (int)numFields() || 0 == numRow() )
{
return szNullValue;
}
return m_res[ m_CurselRow ][ nField ];
}
const char* CppMySQLQuery::getStringField( const char* szField, const char* szNullValue /*= ""*/ )
{
if ( m_res.empty() || NULL == szField || 0 == numRow() || findFiledName( szField ) == false)
{
return szNullValue;
}
return m_res[ m_CurselRow ][ szField ];
}
void CppMySQLQuery::nextRow()
{
if ( m_res.empty() ) return;
m_CurselRow++;
}
void CppMySQLQuery::freeRes()
{
if ( m_res.empty() )
{
m_res.clear();
}
}
bool CppMySQLQuery::eof()
{
if ( m_CurselRow >= m_res.size() ) return true;
return false;
}
bool CppMySQLQuery::findFiledName(const char* pszField)
{
int nCol = numFields();
int nCount = strlen( pszField );
char szNewField[512];
for ( int i = 0; i < nCol; ++i )
{
memset( szNewField, 0, 512 );
std::string szStr = m_res.field_name(i);
StringLower( pszField, szNewField );
if ( szStr == szNewField ) return true;
}
return false;
}
char* CppMySQLQuery::StringLower( const char* pString , char* out, int length /*= -1*/ )
{
if( length == -1 )
length = (int)strlen( pString );
int i;
for(i = 0;i < length;i ++ )
{
out[i] = tolower( pString[i] );
}
out[i] = 0;
return out;
}
DatabaseInstance::DatabaseInstance()
:m_pConn(NULL)
{
m_pConn = new mysqlpp::Connection(false);
}
DatabaseInstance::~DatabaseInstance()
{
}
bool DatabaseInstance::open(const char* dbName, const char* host, const char* user, const char* passwd )
{
// 首先设置字符集 如果你不设置的话到时候存进去的utf8格式会乱码
if ( m_pConn-> set_option( new mysqlpp::SetCharsetNameOption("utf8")) )
{
// TODO: 设置字符集成功
}
// 连接数据库
if ( m_pConn->connect( dbName, host, user, passwd ) == false ) return false;
// 用建立的m_pconn建立一个查询对象
printf("数据库名:%s, 连接成功\n", dbName );
return true;
}
bool DatabaseInstance::execSQL( const char* sql )
{
mysqlpp::Query query = m_pConn->query();
std::string str = sql;
if ( query.exec(str) == false )
{
printf("%s failed", str.c_str());
return false;
}
printf(" 执行sql语句 %s success\n", str.c_str() );
return true;
}
bool DatabaseInstance::querySQL( const char* sql, CppMySQLQuery& pQuery)
{
mysqlpp::Query query = m_pConn->query();
// 将sql语句执行,查询到的结果在query.store()里
query << sql;
// 获得查询结果对象 这个我是已经封装好的你可以进去看一下
mysqlpp::StoreQueryResult* pQueryResult = pQuery.getQueryResultPlr();
// 将结果赋值给结果对象
*pQueryResult = query.store();
return true;
}
// main.cpp文件
#include <iostream>
#include "DatabaseInstance.h"
// 由于是单独抽离出来的我就不再注意机构的优越性我直接在全局声明对象
DatabaseInstance database;
int main()
{
// 第一步连接数据库
database.open( "testdb", "localhost", "root", "123456" );
// 第二部测试插入数据
database.execSQL("insert into testInfo(id,testValue1,testValue2) values(1,2,'helloworld')");
// 第三部分测试有返回结果的查询
CppMySQLQuery mySqlQuery;
database.querySQL("select * from testInfo", mySqlQuery );
int id = mySqlQuery.getIntField("id");
int nValue = mySqlQuery.getIntField("testValue1");
const char* pcValue = mySqlQuery.getStringField("testValue2");
printf("查询结果\n id:%d, testValue1:%d, testValue2:%s", id, nValue, pcValue );
getchar();
return 0;
}
再次强调我的代码可以正常执行的前提是mysql++的库你已经配置好 一下我将我的配置文件 及路径贴给大家
上图是附加的包含目录, 因此我头文件可以直接添加不需要添加路径
这个是我的文件路径 你可以跟上图的附加包含目录对应看下
这个是mysql++的库文件 , 注意你需要把常规里面的附加库目录配置好
以上是基本的mysql++的增删改查的方法, 如果有什么问题欢迎骚扰 邮箱354565113@qq.cpm