mysql 预处理stmt操作(写入数据库和从数据库中取出)

stmt操作

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/

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用JDBC从MySQL数据库查询数据的方法可以分为以下几步: 1. 加载驱动:使用Class.forName()方法加载MySQL的JDBC驱动。 2. 获取连接:使用DriverManager.getConnection()方法获取数据库连接。 3. 创建Statement对象:使用Connection对象的createStatement()方法创建Statement对象。 4. 执行查询语句:使用Statement对象的executeQuery()方法执行查询语句,并将结果保存在ResultSet对象。 5. 处理结果集:使用ResultSet对象的getXXX()方法获取查询结果。 6. 关闭连接:使用Connection对象的close()方法关闭连接。 下面是一个简单的示例代码: ```java import java.sql.*; public class QueryDemo { public static void main(String[] args) { try { // 加载驱动 Class.forName("com.mysql.jdbc.Driver"); // 获取连接 String url = "jdbc:mysql://localhost:3306/test"; String user = "root"; String password = "123456"; Connection conn = DriverManager.getConnection(url, user, password); // 创建Statement对象 Statement stmt = conn.createStatement(); // 执行查询语句 String sql = "SELECT * FROM student"; ResultSet rs = stmt.executeQuery(sql); // 处理结果集 while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); int age = rs.getInt("age"); System.out.println("id:" + id + ", name:" + name + ", age:" + age); } // 关闭连接 rs.close(); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 注意:在使用完ResultSet、Statement和Connection对象后,需要及时关闭连接,以释放资源。另外,为了避免SQL注入等安全问题,应该使用PreparedStatement对象来执行带有参数的SQL语句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路边闲人2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值