C++鏈接MySQL

在以前的項目中,發現工程是基於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

相關文章
相關標籤/搜索