在以前的项目中,发现工程是基于C++的,可是代码中数据库的链接却基于C api接口,主要接口以下:mysql
mysql_init mysql_real_connect mysql_query mysql_close
包括初始化,创建链接,执行查询操做以及关闭等等,能够看出,这实际上是纯C接口,更适合C代码下的数据库链接。 可是习惯了JAVA下数据库链接处理方式的我,仍是喜欢create_conn, create_statement, stmt.execute的一系列方式,那么MySQL是否有支持相似JAVA的数据库链接呢?
有! C++ MySQL Connector官方资源下载及示例文档sql
连接中给予了不一样操做系统,不一样位数CPU下C++ Connector的RPM安装包以及示例文档,一看就会,很是的easy。数据库
我基于C++ MySQL Connector实现了一个简单的数据库链接池,能够像使用JAVA同样,进行数据库链接访问。 我本身编写的示例以下:api
DBConnPool* db_conn_pool = DBConnPool::GetInstance(); db_conn_pool->InitDBConnPool("username", "passwd", "tcp://*.11.*.1*:3306", 10, 20); sql::Connection* conn = db_conn_pool->GetConn(); sql::Statement *stmt = conn->createStatement(); stmt->execute("use vip_download"); const std::string mysql= "select tx_id, tx_puburl from trans_mgr"; sql::ResultSet *res = stmt->executeQuery(mysql); while (res->next()) { cout << "taskid = " << res->getInt(1) << endl; cout << "taskpuburl = " << res->getString("tx_puburl") << endl; } delete res; delete stmt; db_conn_pool->ReleaseConn(conn);
有了链接池,我只须要跟DBConnPool要数据库链接便可,全部针对数据库表的操做以及对业务层提供的接口放到DBUtil中便可。而业务层的代码只须要GetData, SetData便可。将代码进行分层,业务层的代码能够清晰不少。tcp
另一个好处是: 读取数据是,不须要再作字符串转各类类型的工做; 在初始化sql语句时,能够经过各类set设置参数,不须要经过sprintf来生成SQL; 要简单不少,也不易出错。url
若是有大量相似操做,可使用PreparedStatement提升效率:操作系统
sql::PreparedStatement *prep_stmt = conn->prepareStatement(YOUR_SQL); for(ObjectMap::iterator cacheIter = ObjectMap.begin(); cacheIter != ObjectMap.end(); cacheIter++) { prep_stmt->setString(cacheIter->first); prep_stmt->setInt(taskID); prep_stmt->execute(); }
个人理解是经过将SQL语句预先编译,将变量经过set操做替换进去便可。无需每次从新编译。code