在学习数据库编程总结了笔记,并分享出来。有问题请及时联系博主:Alliswell_WP,转载请注明出处。
09-数据库编程day06(案例开发)
目录:
一、学习目标
二、MongoDB复习
三、MongoDB API
0、复习API构造函数、连接函数、插入、删除
1、通过API修改数据和查询分析
2、通过API查询文档
3、通过API查询文档、内容解析、异常捕捉
四、案例开发(网盘-服务器端)
1、案例需求分析、模型设计
2、搭建框架
3、MySQL端登录实现
4、SQL注入问题解决
5、查看功能实现
6、MySQL侧实现上传功能
7、上传文件MongoDB侧实现
8、MySQL与MongoDB类的调用
9、上传测试成功
10、下载功能实现
11、总结
一、学习目标
1. api 实现查询功能.
2. 案例的数据模型设计
3. 了解案例实现的核心原理
4. 案例的程序框架搭建
5. 了解案例实现的过程
二、MongoDB复习
》体系结构:库—集合
集合:对应关系型数据库的表,键值对的组合
文档:键值对,json
》删库分2步:
○ 切库use dbname
○ 删库db.dropDatabase()
》文档的新增:
---insert
db.collection_name.insert(json)
--save 指定了_id时,相当于修改
--find
db.collection_name.find({cond},{show})
db.collection.aggregate() $group group By col1,col2 —— _id:{col1,col2}
--按位置,年龄分组,计算人数
db.Barca.aggregate({ $group:{ _id:{pos:"$pos",age:"$age"},count:{$sum:1} } })
--update
db.collection_name.update({query},{update},{upsert:false,multi:false})
--remove
db.collection_name.remove({query},{justOne:false})
--index
db.collection_name.ensureIndex({field:1})
db.collection_name.dropIndex({field:1})
三、MongoDB API
0、复习API构造函数、连接函数、插入、删除
1)构造函数
DBClientConnection(bool auto_connect, 0, double so_timeout);
auto_connect(IN):连接失败后自动重连
so_timeout(IN):非连接超时,tcp的读写超时
2)连接函数
bool connect(string server, &string errmsg);
返回值:成功/失败
server(IN):连接的服务器
errmsg(OUT):出错信息
》示例:
bool auto_connect = true;
double so_timeout = 3;
string host = "127.0.0.1";
string port = "27017";
string errmsg = "";
DBClientConnection pConn = new DBClientConnection(auto_connect, 0, so_timeout);
pConn->connect(host+":"+port, errmsg);
3)插入
void insert(const string &ns, BSONObj obj, int flags);
ns(IN):命名空间,db_name.collection_name
obj(IN):插入的列
flags(IN):详见API文档,默认填零即可
》示例:
BSONObj insert = BSON("uid"<<10001<<"name"<<"skean1017");
pConn->insert(db+"."+collection, insert, 0);
其效果相当于:
insert into shool.student (uid, name) values (10001, “skean1017″);
4)删除
void remove(const string &ns, Query query, bool justOne);
ns(IN):命名空间,db_name.collection_name
query(IN):查询条件
justOne(IN):是否只删除匹配的第一条
》示例:
Query query = QUERY("name"<<"skean1017");
pConn->remove(db+"."+collection, query, true);
其效果相当于:
delete from shool.student where name=”skean1017″;
1、通过API修改数据和查询分析
--修改
void update( const string &ns,Query query,BSONObj obj,bool upsert = false, bool multi = false );
○ ns 库名.集合名
○ obj BSON对象
○ upsert 如果条件不成立是否新增,默认false
○ multi 是否更新多条,默认false
》示例:
Query query = QUERY("uid"<<10001);
BSONObj obj = BSON("$set"<update(db+"."+collection, query, obj, false, false);
其效果相当于:
update shool.student set name=”habadog1203” where uid=10001;
--查询
virtual auto_ptr<DBClientCursor> query(const string &ns, Query query=Query() , int nToReturn = 0, int nToSkip = 0,const BSONObj *fieldsToReturn = 0, int queryOptions = 0 , int batchSize = 0 ) { checkConnection();
return DBClientBase::query( ns, query, nToReturn, nToSkip, fieldsToReturn, queryOptions , batchSize );
}
—auto_ptr<DBClientCursor> 智能指针,自动释放<>内部的内存数据
—cusor 游标
—DBClientCursor 类
○ more()如果为真,调用next是安全的
○ next()返回BSONObj 对象
——query函数参数
○ ns 库名.集合名
○ query 查询条件
○ nToReturn 返回记录数
○ nToSkip 跳过的记录数
○ fieldsToReturn 要返回的字段
》示例:
string db = "shool";
string collection = "student";
Query condition = QUERY("age"<<20);
int limit = 10;
int offset = 5;
BSONObj columns = BSON("uid"<<1<<"name"<<1);
auto_ptr cursor;
cursor = pConn->query(db+"."+collection, condition, limit, offset, columns, 0, 0);
其效果相当于:
select uid,name from shool.student where age=20 limit 5,10;
对结果集的操作:
int uid=0;
string name="";
while(cursor->more())
{
BSONObj p = cursor->next();
uid = p["uid"].Int();
name = p["name"].String();
count << uid << " " << name << endl;
}
2、通过API查询文档
--BSONObj对象
○ BSONElement getField(const StringData& name) const; 获得对应字段
思路:通过getField 获得BSONElement(元素)对象,调用String(),Number()精确获得各个值?
但是,如果有的数据没有age,这样调用有问题:
——解决:需要调用hasField(char*)或hasElement(char*)来判断是否有该元素
3、通过API查询文档、内容解析、异常捕捉
》解析文档流程:
》mongodb的api的异常处理
mongodb为我们提供了DBException异常类,如果有错误会进行抛出,我们可以通过try catch的方式捕捉该类错误,然后通过打印 what()显示错误详细信息.具体所在头文件: assert_util.h.除了捕获mongo提供的异常信息,还需要捕获标准库的错误信息,最后有一个兜底的所有异常捕捉.
使用方法:
catch( mongo::DBException& e ) {
printf("MONGO Exception(set): %s\n", e.what());
return -1;
}
catch (std::exception& e) {
printf("MONGO Exception(set): %s\n", e.what());
return -1;
}
catch (...){
printf(“MONGO Exception\n”);
return -1;
}
》头文件准备:
--在VS中更改main.cpp
#include <iostream> #include <string> #include <mongo/client/dbclient.h> using namespace std; using namespace mongo; int main(int argc,char *argv[]) { if (argc != 2){ cout << "./main 1|2|3|4 ---- 1-insert,2-remove,3-update,4-query" << endl; return -1; } int op = atoi(argv[1]); //构造连接 DBClientConnection conn(false,0,3); std::string errmsg; if (!conn.connect("localhost:27018", errmsg)){//模拟一下错误端口27018 cout << "connect to mongo err" << endl; //return -1; } cout << "connect ok" << endl; try{ if (op == 1){ //insert //第一种玩法 BSONObjBuilder b1; b1.append("id", 1); b1.append("name", "yekai");//{id:1,name:'yekai'} conn.insert("yekai.langzi", b1.obj()); //第二种玩法 BSONObjBuilder b2; b2 << "id" << 2 << "name" << "fuhongxue"; conn.insert("yekai.langzi", b2.obj()); //第三种玩法 conn.insert("yekai.langzi", BSON("id" << 3 << "name" << "luxiaojia")); //第四种玩法 Query ins("{id:4,name:'lixunhuan',age:50,info:{like:'drink',wuqi:'feidao'}}"); conn.insert("yekai.langzi", ins.obj); } else if (op == 2){ //remove //删除id》=2 {id:{$gte:2}} Query qry("{id:{$gte:2}}"); conn.remove("yekai.biancheng", qry); } else if (op == 3){ //update Query qry("{id:1}");//查询条件 //Query bobj("{$set:{name:'fuhongxue'}}");//更新的内容 Query bobj("{name:'fuhongxue'}");//更新的内容 conn.update("yekai.langzi", qry, bobj.obj); } else if (op == 4){ //query auto_ptr<DBClientCursor> cursor = conn.query("yekai.langzi", Query("{}")); while (cursor->more()){//判断是否有下一条 mongo::BSONObj obj = cursor->next();//取下一条记录,为BSONObj格式 //cout << obj << endl; //解析数据 cout << "id:" << obj.getField("id").Number() << ",name:" << obj.getField("name").String(); if (obj.hasElement("age")){//是否存在该元素 cout << ",age:" << obj.getField("age").Number(); } if (obj.hasElement("info")){ cout << ",info:{ like:" << obj["info"]["like"].String() << ",wuqi:" << obj["info"]["wuqi"].String()<<"}";//使用重载操作符[] } cout << endl; } } } catch (mongo::DBException& e) { printf("MONGO Exception(set): %s\n", e.what()); return -1; } catch (std::exception& e) { printf("MONGO STD Exception(set): %s\n", e.what()); return -1; } catch (...){ printf("MONGO Exception\n"); return -1; } return 0; }