
一、使用工具:java语言、Myeclipse。
二、 *** 作步骤:
1、第一步:加载MySQL的JDBC的驱动
2、第二步:创建与MySQL数据库的连接类的实例
3、第三步:获取连接类实例con,用con创建Statement对象类实例 sql_statement
4、第四步:执行查询,用ResultSet类的对象,返回查询的结果
5、得出数据
三、注意事项:有几处是需要根据自身情况修改的
1、如下图中的url和账号,密码需要与你自己的相一致。
2、这些需要访问的数据必须要与数据库中的类型相互匹配,才能打印出正确的结果。
/ project: 通用模块 ( 用 c++ 处理 mysql 数据库类,像ADO ) description: 通过DataBase,RecordSet,Record,Field类,实现对mysql数据库的 *** 作 包括连接、修改、添加、删除、查询等等,像ADO一样 *** 作数据库,使 用方便 ( the end of this file have one sample, welcom to use ) file:zlb_mysqlh author: @ zlb time:2005-12-12 --/ #ifndef ZLB_MYSQL_H #define ZLB_MYSQL_H #include "mysqlh" #include <iostream> #include <vector> #include <string> using namespace std; namespace zlb_mysql{ / 字段 *** 作 / class Field { public : / 字段名称 / vector<string> m_name; / 字段类型 / vector<enum_field_types> m_type; public : Field(); ~Field(); / 是否是数字 / bool IsNum(int num); / 是否是数字 / bool IsNum(string num); / 是否是日期 / bool IsDate(int num); / 是否是日期 / bool IsDate(string num); / 是否是字符 / bool IsChar(int num); / 是否是字符 / bool IsChar(string num); / 是否为二进制数据 / bool IsBlob(int num); / 是否为二进制数据 / bool IsBlob(string num); / 得到指定字段的序号 / int GetField_NO(string field_name); }; / 1 单条记录 2 [int ] *** 作 [""] *** 作 / class Record { public: / 结果集 / vector<string> m_rs; / 字段信息 占用4字节的内存 当记录数很大是回产生性能问题 / Field m_field; public : Record(){}; Record(Field m_f); ~Record(); void SetData(string value); / [""] *** 作 / string operator[](string s); string operator[](int num); / null值判断 / bool IsNull(int num); bool IsNull(string s); / 用 value tab value 的形式 返回结果 / string GetTabText(); }; / 1 记录集合 2 [int ] *** 作 [""] *** 作 3 表结构 *** 作 4 数据的插入修改 / class RecordSet { private : / 记录集 / vector<Record> m_s; / 游标位置/ unsigned long pos; / 记录数 / int m_recordcount; / 字段数 / int m_field_num; / 字段信息 / Field m_field; MYSQL_RES res ; MYSQL_FIELD fd ; MYSQL_ROW row; MYSQL m_Data ; public : RecordSet(); RecordSet(MYSQL hSQL); ~RecordSet(); / 处理返回多行的查询,返回影响的行数 / int ExecuteSQL(const char SQL); / 得到记录数目 / int GetRecordCount(); / 得到字段数目 / int GetFieldNum(); / 向下移动游标 / long MoveNext(); / 移动游标 / long Move(long length); / 移动游标到开始位置 / bool MoveFirst(); / 移动游标到结束位置 / bool MoveLast(); / 获取当前游标位置 / unsigned long GetCurrentPos()const; / 获取当前游标的对应字段数据 / bool GetCurrentFieldValue(const char sFieldName,char sValue); bool GetCurrentFieldValue(const int iFieldNum,char sValue); / 获取游标的对应字段数据 / bool GetFieldValue(long index,const char sFieldName,char sValue); bool GetFieldValue(long index,int iFieldNum,char sValue); / 是否到达游标尾部 / bool IsEof(); / 返回字段 / Field GetField(); / 返回字段名 / const char GetFieldName(int iNum); / 返回字段类型 / const int GetFieldType(char sName); const int GetFieldType(int iNum); / 返回指定序号的记录 / Record operator[](int num); }; / 1 负责数据库的连接关闭 2 执行sql 语句(不返回结果) 3 处理事务 / class DataBase { public : DataBase(); ~DataBase(); private : / msyql 连接句柄 / MYSQL m_Data; public : / 返回句柄 / MYSQL GetMysql(); / 连接数据库 / int Connect(string host, string user, string passwd, string db, unsigned int port, unsigned long client_flag); / 关闭数据库连接 / void DisConnect(); / 执行非返回结果查询 / int ExecQuery(string sql); / 测试mysql服务器是否存活 / int Ping(); / 关闭mysql 服务器 / int ShutDown(); / 主要功能:重新启动mysql 服务器 / int ReBoot(); / 说明:事务支持InnoDB or BDB表类型 / / 主要功能:开始事务 / int Start_Transaction(); / 主要功能:提交事务 / int Commit(); / 主要功能:回滚事务 / int Rollback(); / 得到客户信息 / const char Get_client_info(); / 主要功能:得到客户版本信息 / const unsigned long Get_client_version(); / 主要功能:得到主机信息 / const char Get_host_info(); / 主要功能:得到服务器信息 / const char Get_server_info(); /主要功能:得到服务器版本信息/ const unsigned long Get_server_version(); /主要功能:得到 当前连接的默认字符集/ const char Get_character_set_name(); / 主要功能返回单值查询 / char ExecQueryGetSingValue(string sql); / 得到系统时间 / const char GetSysTime(); / 建立新数据库 / int Create_db(string name); / 删除制定的数据库/ int Drop_db(string name); }; }; #endif //ZLB_MYSQL_H / project: 通用模块 ( 用 c++ 处理 mysql 数据库类,像ADO ) description: 通过DataBase,RecordSet,Record,Field类,实现对mysql数据库的 *** 作 包括连接、修改、添加、删除、查询等等,像ADO一样 *** 作数据库,使 用方便 ( the end of this file have one sample, welcom to use ) file:zlb_mysqlcpp author: @ zlb time:2005-12-12 --/ #include "stdafxh" #include "zlb_mysqlh" namespace zlb_mysql{ / +++++++++++++++++++++++++++++++++++++++++++++++++++ / / 字段 *** 作 / Field::Field(){} Field::~Field(){} / 是否是数字 / bool Field::IsNum(int num) { if(IS_NUM(m_type[num])) return true; else return false; } / 是否是数字 / bool Field::IsNum(string num) { if(IS_NUM(m_type[GetField_NO(num)])) return true; else return false; } / 是否是日期 / bool Field::IsDate(int num) { if( FIELD_TYPE_DATE == m_type[num] || FIELD_TYPE_DATETIME == m_type[num] ) return true; else return false; } / 是否是日期 / bool Field::IsDate(string num) { int temp; temp=GetField_NO(num); if(FIELD_TYPE_DATE == m_type[temp] || FIELD_TYPE_DATETIME == m_type[temp] ) return true; else return false; } / 是否是字符 / bool Field::IsChar(int num) { if(m_type[num]==FIELD_TYPE_STRING || m_type[num]==FIELD_TYPE_VAR_STRING || m_type[num]==FIELD_TYPE_CHAR ) return true; else return false; } / 是否是字符 / bool Field::IsChar(string num) { int temp; temp=this->GetField_NO (num); if(m_type[temp]==FIELD_TYPE_STRING || m_type[temp]==FIELD_TYPE_VAR_STRING || m_type[temp]==FIELD_TYPE_CHAR ) return true; else return false; } / 是否为二进制数据 / bool Field::IsBlob(int num) { if(IS_BLOB(m_type[num])) return true; else return false; } / 是否为二进制数据 / bool Field::IsBlob(string num) { if(IS_BLOB(m_type[GetField_NO(num)])) return true; else return false; } / 得到指定字段的序号 / int Field::GetField_NO(string field_name) { for(unsigned int i=0;i<m_namesize ();i++) { if(!m_name[i]compare (field_name)) return i; } return -1; } /-----------------------------------------------------/ / +++++++++++++++++++++++++++++++++++++++++++++++++++ / / 1 单条记录 2 [int ] *** 作 [""] *** 作 / Record::Record(Field m_f) { m_field =m_f; } Record::~Record(){}; void Record::SetData(string value) { m_rspush_back (value); } / [""] *** 作 / string Record::operator[](string s) { return m_rs[m_field->GetField_NO(s)]; } string Record::operator[](int num) { return m_rs[num]; } / null值判断 / bool Record::IsNull(int num) { if("" == m_rs[num]c_str ()) return true; else return false; } bool Record::IsNull(string s) { if("" == m_rs[m_field->GetField_NO(s)]c_str()) return true; else return false; } / 主要-功能:用 value tab value 的形式 返回结果 / string Record::GetTabText() { string temp; for(unsigned int i=0 ;i<m_rssize();i++) { temp+=m_rs[i]; if(i<m_rssize ()-1) temp+="\t"; } return temp; } /-----------------------------------------------------/ / +++++++++++++++++++++++++++++++++++++++++++++++++++ / / 1 记录集合 2 [int ] *** 作 [""] *** 作 3 表结构 *** 作 4 数据的插入修改 / RecordSet::RecordSet() { res = NULL; row = NULL; pos = 0; } RecordSet::RecordSet(MYSQL hSQL) { res = NULL; row = NULL; m_Data = hSQL; pos = 0; } RecordSet::~RecordSet() { } / 处理返回多行的查询,返回影响的行数 成功返回行数,失败返回-1 / int RecordSet::ExecuteSQL(const char SQL) { if ( !mysql_real_query(m_Data,SQL,strlen(SQL))) { //保存查询结果 res = mysql_store_result(m_Data ); //得到记录数量 m_recordcount = (int)mysql_num_rows(res) ; //得到字段数量 m_field_num = mysql_num_fields(res) ; for (int x = 0 ; fd = mysql_fetch_field(res); x++) { m_fieldm_namepush_back(fd->name); m_fieldm_typepush_back(fd->type); } //保存所有数据 while (row = mysql_fetch_row(res)) { Record temp(&m_field); for (int k = 0 ; k < m_field_num ; k++ ) { if(row[k]==NULL||(!strlen(row[k]))) { tempSetData (""); } else { tempSetData(row[k]); } } //添加新记录 m_spush_back (temp); } mysql_free_result(res ) ; return m_ssize(); } return -1; } / 向下移动游标 返回移动后的游标位置 / long RecordSet::MoveNext() { return (++pos); } / 移动游标 / long RecordSet::Move(long length) { int l = pos + length; if(l<0) { pos = 0; return 0; }else { if(l >= m_ssize()) { pos = m_ssize()-1; return pos; }else { pos = l; return pos; } } } / 移动游标到开始位置 / bool RecordSet::MoveFirst() { pos = 0; return true; } / 移动游标到结束位置 / bool RecordSet::MoveLast() { pos = m_ssize()-1; return true; } / 获取当前游标位置 / unsigned long RecordSet::GetCurrentPos()const { return pos; } / 获取当前游标的对应字段数据 / bool RecordSet::GetCurrentFieldValue(const char sFieldName, char sValue) { strcpy(sValue,m_s[pos][sFieldName]c_str()); return true; } bool RecordSet::GetCurrentFieldValue(const int iFieldNum,char sValue) { strcpy(sValue,m_s[pos][iFieldNum]c_str()); return true; } / 获取游标的对应字段数据 / bool RecordSet::GetFieldValue(long index,const char sFieldName, char sValue) { strcpy(sValue,m_s[index][sFieldName]c_str()); return true; } bool RecordSet::GetFieldValue(long index,int iFieldNum,char sValue) { strcpy(sValue,m_s[index][iFieldNum]c_str()); return true; } / 是否到达游标尾部 / bool RecordSet::IsEof() { return (pos == m_ssize())true:false; } / 得到记录数目 / int RecordSet::GetRecordCount() { return m_recordcount; } / 得到字段数目 / int RecordSet::GetFieldNum() { return m_field_num; } / 返回字段 / Field RecordSet::GetField() { return &m_field; } / 返回字段名 / const char RecordSet::GetFieldName(int iNum) { return m_fieldm_nameat(iNum)c_str(); } / 返回字段类型 / const int RecordSet::GetFieldType(char sName) { int i = m_fieldGetField_NO(sName); return m_fieldm_typeat(i); } const int RecordSet::GetFieldType(int iNum) { return m_fieldm_typeat(iNum); } / 返回指定序号的记录 / Record RecordSet::operator[](int num) { return m_s[num]; } / -------------------------------------------------- / / +++++++++++++++++++++++++++++++++++++++++++++++++++ / / 1 负责数据库的连接关闭 2 执行sql 语句(不返回结果) 3 处理事务 / DataBase::DataBase() { m_Data = NULL; } DataBase::~DataBase() { if(NULL != m_Data) { DisConnect(); } } / 返回句柄 / MYSQL DataBase::GetMysql() { return m_Data; } / 主要功能:连接数据库 参数说明: 1 host 主机ip地址或者时主机名称 2 user 用户名 3 passwd 密码 4 db 欲连接的数据库名称 5 port 端口号 6 uinx 嵌套字 7 client_flag 客户连接参数 返回值: 0成功 -1 失败 / int DataBase::Connect(string host, string user, string passwd, string db, unsigned int port, unsigned long client_flag) { if((m_Data = mysql_init(NULL)) && mysql_real_connect( m_Data, hostc_str(), userc_str(), passwdc_str(), dbc_str(),port , NULL, client_flag)) { //选择制定的数据库失败 if ( mysql_select_db( m_Data, dbc_str () ) < 0 ) { mysql_close( m_Data) ; return -1 ; } } else { //初始化mysql结构失败 mysql_close( m_Data ); return -1 ; } //成功 return 0; } / 关闭数据库连接 / void DataBase::DisConnect( ) { mysql_close(m_Data) ; } / 主要功能: 执行非返回结果查询 参数:sql 待执行的查询语句 返回值; n为成功 表示受到影响的行数 -1 为执行失败 / int DataBase::ExecQuery(string sql) { if(!mysql_real_query(m_Data,sqlc_str (),(unsigned long)sqllength()) ) { //得到受影响的行数 return (int)mysql_affected_rows(m_Data) ; } else { //执行查询失败 return -1; } } / 主要功能:测试mysql服务器是否存活 返回值:0 表示成功 -1 失败 / int DataBase::Ping() { if(!mysql_ping(m_Data)) return 0; else return -1; } / 主要功能:关闭mysql 服务器 返回值;0成功 -1 失败 / int DataBase::ShutDown() { if(!mysql_shutdown(m_Data,SHUTDOWN_DEFAULT)) return 0; else return -1; } / 主要功能:重新启动mysql 服务器 返回值;0表示成功 -1 表示失败 / int DataBase::ReBoot() { if(!mysql_reload(m_Data)) return 0; else return -1; } / 说明:事务支持InnoDB or BDB表类型 / / 主要功能:开始事务 / int DataBase::Start_Transaction() { if(!mysql_real_query(m_Data, "START TRANSACTION" , (unsigned long)strlen("START TRANSACTION") )) { return 0; } else //执行查询失败 return -1; } / 主要功能:提交事务 返回值:0 表示成功 -1 表示失败 / int DataBase::Commit() { if(!mysql_real_query( m_Data, "COMMIT", (unsigned long)strlen("COMMIT") ) ) { return 0; } else //执行查询失败 return -1; } / 主要功能:回滚事务 返回值:0 表示成功 -1 表示失败 / int DataBase::Rollback() { if(!mysql_real_query(m_Data, "ROLLBACK", (unsigned long)strlen("ROLLBACK") ) ) return 0; else //执行查询失败 return -1; } / 得到客户信息 / const char DataBase::Get_client_info() { return mysql_get_client_info(); } /主要功能:得到客户版本信息/ const unsigned long DataBase::Get_client_version() { return mysql_get_client_version(); } / 主要功能:得到主机信息 / const char DataBase::Get_host_info() { return mysql_get_host_info(m_Data); } / 主要功能:得到服务器信息 / const char DataBase::Get_server_info() { return mysql_get_server_info( m_Data ); } / 主要功能:得到服务器版本信息 / const unsigned long DataBase::Get_server_version() { return mysql_get_server_version(m_Data); } /主要功能:得到 当前连接的默认字符集/ const char DataBase::Get_character_set_name() { return mysql_character_set_name(m_Data); } / 主要功能返回单值查询 / char DataBase::ExecQueryGetSingValue(string sql) { MYSQL_RES res; MYSQL_ROW row ; char p = NULL; if(!mysql_real_query( m_Data, sqlc_str(),(unsigned long)sqllength())) { //保存查询结果 res = mysql_store_result( m_Data ) ; row = mysql_fetch_row( res ) ; p = ((row[0]==NULL)||(!strlen(row[0])))"-1":row[0]; mysql_free_result( res ) ; } else //执行查询失败 p = "-1"; return p; } / 得到系统时间 / const char DataBase::GetSysTime() { return ExecQueryGetSingValue("select now()"); } / 主要功能:建立新数据库 参数:name 为新数据库的名称 返回:0成功 -1 失败 / int DataBase::Create_db(string name) { string temp ; temp="CREATE DATABASE "; temp+=name; if(!mysql_real_query( m_Data,tempc_str () , (unsigned long)templength ()) ) return 0; else //执行查询失败 return -1; } / 主要功能:删除制定的数据库 参数:name 为欲删除数据库的名称 返回:0成功 -1 失败 / int DataBase::Drop_db(string name) { string temp ; temp="DROP DATABASE "; temp+=name; if(!mysql_real_query( m_Data,tempc_str () , (unsigned long)templength ()) ) return 0; else //执行查询失败 return -1; } /-----------------------------------------------------/ }; / 使用例子 / #include "zlb_mysqlh" using namespace std; void main() { zlb_mysql::DataBase zlb; //连接数据库 if(-1 == zlbConnect("localhost"/本地数据库,可以是远程 ip/, "root"/用户名/,"apple"/密码/, "test"/数据库名/, 0,0/两个标志,mysql文档有说明,一般为0/)) { std::cout<<"connect failed "<<std::endl; } else { std::cout<<"connect success"<<std::endl; } //通过返回的数据库句柄,建立记录急,你可以通过返回的这个句柄建立多个记录急 zlb_mysql::RecordSet rs(zlbGetMysql()); rsExecuteSQL("select from testtable");//这个语句大家都知道是什么意思了 cout<<rsGetRecordCount()/返回的总的记录数/<<endl; cout<<rsGetFieldNum()/返回的总的字段数/<<endl; cout<<rs[0]GetTabText()/返回第一条记录,你也可以rs[1]GetTabText() 如果你有多条记录, / <<endl; /实现遍列,也可以使用后面的遍列方式/ for(int i=0;i<rsGetRecordCount();++i) { for(int j =0;j<rsGetFieldNum();++j) cout<<rs[i][j]; cout<<endl; } zlb_mysql::Field fd = rsGetField();/你可以通过这样的方式,获取字段的信息/ cout<<fd->GetField_NO("Password")/返回我表里的 Password 字段的位置,不 是记录的位置/ <<endl; cout<<rs[0]["Password"]<<endl;/输出第0行第Password列的值/ cout<<rs[0][fd->GetField_NO("Password")]<<endl;/你也可以这样/ cout<<rsGetFieldName(0)/获取字段的名字/<<endl; cout<<rsGetFieldType("UserName")/获取字段的类型,是mysql里定义的/<<endl; cout<<rsGetCurrentPos()/获取当前记录的位置/<<endl; char s[50]; rsGetCurrentFieldValue(1,s);/获取当前记录对应字段的值/ cout<<s<<endl; cout<<rsMove(1)<<endl;/移动游标,正数往前 负数往后/ cout<<rsGetCurrentPos()<<endl; rsGetCurrentFieldValue(1,s); cout<<s<<endl; rsMoveFirst();/移动游标到最前/ while(!rsIsEof()/判断是否到达游标尾,实现遍列/) { rsGetCurrentFieldValue("UserName",s); cout<<s<<"\t"; rsGetCurrentFieldValue("Password",s); cout<<s<<"\t
"; rsMoveNext(); } rsGetFieldValue(0,"UserName",s);/获取指定行 的记录值/ cout<<s<<"\t"; rsGetFieldValue(0,"Password",s); cout<<s<<"\t
"; }
简单用户表 tb_user:
userid , username
用户详细信息表 tb_userinfo
userid , email , homepage , phone , address
把用户信息分开的目的就是保证经常查询的数据在一张表,其它信息放到另一张表
论坛主题表 tb_bbs
bbsid , userid , title , ip , repleycount , replyuserid , createtime , lastreplytime
论坛内容标 tb_bbs_content (此表可按照bbsid进行分表存储)
bbsid , content;
论坛回复表 tb_bbs_reply (此表可按照bbsid进行分表存储)
replyid , bbsid , userid , content , replytime , ip
本文来自CSDN博客,转载请标明出处:>
以上就是关于Yii2框架 *** 作数据库的方法分析【以mysql为例】全部的内容,包括:Yii2框架 *** 作数据库的方法分析【以mysql为例】、怎么链接一个服务器上的mysql数据库、如何在Java程序中访问mysql数据库中的数据并进行简单的 *** 作等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)