stmt对于多次执行的语句比直接执行快,主要原因在于,仅对查询执行一次解析操作。在直接执行的情况下,每次执行语句时,均将进行查询。此外,由于每次执行预处理语句时仅需发送参数的数据,从而减少了网络通信量
stmt主要的介绍可以参考:
https://blog.csdn.net/zhouxinfeng/article/details/77891771
主要的操作是将MYSQL_BIND 与 查询的参数和查询的结果相绑定,再按行进行输出。
参见:http://blog.chinaunix.net/uid-24219701-id-1745030.html
MYSQL_STMT *stmt = mysql_stmt_init(conn); //创建MYSQL_STMT句柄
char *query = "insert into stu values(?, ?);";
if(mysql_stmt_prepare(stmt, query, strlen(query)))
{
fprintf(stderr, "mysql_stmt_prepare: %s\n", mysql_error(conn));
return -1;
}
int id; char name[20];
printf("id name: ");
scanf("%d %s", &id, name);
MYSQL_BIND params[2];
memset(params, 0, sizeof(params));
params[0].buffer_type = MYSQL_TYPE_LONG;
params[0].buffer = &id;
params[1].buffer_type = MYSQL_TYPE_STRING;
params[1].buffer = name;
params[1].buffer_length = strlen(name);
mysql_stmt_bind_param(stmt, params);
mysql_stmt_execute(stmt); //执行与语句句柄相关的预处理
mysql_stmt_close(stmt);
mysql_close(conn);
MYSQL_STMT *stmt = mysql_stmt_init(conn); //创建MYSQL_STMT句柄
char *query = "select * from stu;";
if(mysql_stmt_prepare(stmt, query, strlen(query)))
{
fprintf(stderr, "mysql_stmt_prepare: %s\n", mysql_error(conn));
return -1;
}
int id; char name[20];
//printf("id name: ");
//scanf("%d %s", &id, name);
MYSQL_BIND params[2];
memset(params, 0, sizeof(params));
params[0].buffer_type = MYSQL_TYPE_LONG;
params[0].buffer = &id;
params[1].buffer_type = MYSQL_TYPE_STRING;
params[1].buffer = name;
params[1].buffer_length = sizeof(name);
//mysql_stmt_bind_param(stmt, params);
mysql_stmt_bind_result(stmt, params); //用于将结果集中的列与数据缓冲和长度缓冲关联(绑定)起来
mysql_stmt_execute(stmt); //执行与语句句柄相关的预处理
mysql_stmt_store_result(stmt); //以便后续的mysql_stmt_fetch()调用能返回缓冲数据
while(mysql_stmt_fetch(stmt) == 0) //返回结果集中的下一行
{
printf("%d\t%s\n", id, name);
}
mysql_stmt_close(stmt);
mysql_close(conn);
当要绑定的是字符串MYSQL_TYPE_VAR_STRING或是不定长的blob的时候,需要将长度设为0,再使用mysql_stmt_fetch_column 获取字段的真实长度分配内存。
(见https://dev.mysql.com/doc/refman/5.7/en/mysql-stmt-fetch.html)
real_length= 0;
bind[0].buffer= 0;
bind[0].buffer_length= 0;
bind[0].length= &real_length
mysql_stmt_bind_result(stmt, bind);
mysql_stmt_fetch(stmt);
if (real_length > 0)
{
data= malloc(real_length);
bind[0].buffer= data;
bind[0].buffer_length= real_length;
mysql_stmt_fetch_column(stmt, bind, 0, 0);
}
本人参考各种实现,写了一个mysql的 c++封装类,源码下载: https://github.com/alongL/mysqlmgr
欢迎不吝赐教。
参考:
1.http://blog.chinaunix.net/uid-24219701-id-1745030.html
2.https://dev.mysql.com/doc/refman/5.7/en/mysql-stmt-execute.html
3.https://dev.mysql.com/doc/refman/5.7/en/mysql-stmt-fetch.html
4.https://github.com/cgy1992/mysql-cpp/