MySQL预处理「建议收藏」

MySQL预处理「建议收藏」MySQL的预处理在一定程度上可以提升程序运行效率。普通的SQL语句每次都需要经过词法和语义解析,优化 SQL 语句并制定执行计划。对于多次执行相同SQL语句的情况,MySQL预处理省去解析优化过程…

MySQL预处理

C++预处理接口: 
preparable_stmt 语句中的? 是个占位符,字符串类型需要加上单引号。 
创建预处理对象sql::PreparedStatement* tPreStmt = db_conn->prepareStatement(“update user_table set user_level=? where user_id=?”);  
参数设置接口:setBigInt,setBlob,setBoolean,setDateTime,setDouble,setInt,setUInt,setInt64,setUInt64,setNull,setString。 
每次调用结束之后需要调用clearParameters接口清空参数,方便下次调用。

实例代码:

#pragma once

#include <iostream>
#include <string>
#include <map>
#include <mysql_connection.h>
#include <mysql_driver.h>
#include <cppconn/exception.h>
#include <cppconn/driver.h>  
#include <cppconn/connection.h>  
#include <cppconn/resultset.h>  
#include <cppconn/prepared_statement.h>  
#include <cppconn/statement.h>

int main()
{
	std::string url = "127.0.0.1:3306";
	std::string user = "test";
	std::string passwd = "123";

	sql::Driver* driver = sql::mysql::get_driver_instance();
	if (driver)
	{
		sql::Connection*  conn = driver->connect(url, user, passwd);
		if (conn == nullptr)
		{
			return -1;
		}
		std::string stmt_str = "update user_table set user_level=? where user_id=?";
		sql::PreparedStatement* preStmt = m_conn->prepareStatement(stmt_str);
		preStmt->setUInt(0,1);
		preStmt->setUInt64(1,132129938);
		preStmt->executeUpdate();
	}
	else
	{
		return -1;
	}	
	return 0;
}

代码100分

项目实践中不会有这么简单的逻辑,通常需要在每个连接中初始化好预处理语句,甚至还需要建立MySql连接池,下面给出一个示例代码:

代码100分#pragma once

#include <iostream>
#include <string>
#include <map>
#include <mysql_connection.h>
#include <mysql_driver.h>
#include <cppconn/exception.h>
#include <cppconn/driver.h>  
#include <cppconn/connection.h>  
#include <cppconn/resultset.h>  
#include <cppconn/prepared_statement.h>  
#include <cppconn/statement.h>

class MysqlConn
{
public:
	MysqlConn();
	~MysqlConn();

	bool ConnectDb(const std::string& url, const std::string& user, const std::string& passwd);
	bool AddPreStatement(int id, const std::string& stmts);

	sql::Connection* GetConn() { return m_conn; }
	sql::PreparedStatement* GetPreStatement(int id);

private:
	std::string m_url;
	std::string m_user;
	std::string m_passwd;

	sql::Driver*   m_driver = nullptr;
	sql::Connection* m_conn = nullptr;

	std::map<int, sql::PreparedStatement*> m_stmts;
};

MysqlConn::MysqlConn()
{

}

MysqlConn::~MysqlConn()
{
	std::map<int, sql::PreparedStatement*>::iterator it = m_stmts.begin();
	while (it != m_stmts.end())
	{
		delete it->second;
		it->second = nullptr;
		it++;
	}
	m_stmts.clear();
	
	if (m_conn)
	{
		m_conn->close();
		delete m_conn;
		m_conn = nullptr;
	}
}

bool MysqlConn::ConnectDb(const std::string& url, const std::string& user, const std::string& passwd)
{
	m_url    = url;
	m_user   = user;
	m_passwd = passwd;

	m_driver = sql::mysql::get_driver_instance();
	
	if (m_driver)
	{
		m_conn = m_driver->connect(m_url, m_user, m_passwd);
		if (m_conn == nullptr)
		{
			return false;
		}
	}
	else
	{
		return false;
	}
	return true;
}

bool MysqlConn::AddPreStatement(int id, const std::string& stmts)
{
	sql::PreparedStatement* tVal = m_conn->prepareStatement(stmts);
	if (!tVal)
	{
		return false;
	}

	std::map<int, sql::PreparedStatement*>::iterator it = m_stmts.find(id);
	if (it != m_stmts.end())
	{
		delete it->second;
		it->second = tVal;
	}
	else
	{
		m_stmts[id] = tVal;
	}
	return true;
}

sql::PreparedStatement* MysqlConn::GetPreStatement(int id)
{
	std::map<int, sql::PreparedStatement*>::iterator it = m_stmts.find(id);
	if (it != m_stmts.end())
	{
		it->second->clearParameters();
		return it->second;
	}
	return nullptr;
}

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/9995.html

(0)
上一篇 2023-01-27
下一篇 2023-01-28

相关推荐

  • 用Python打印99乘法表

    用Python打印99乘法表乘法口诀表是小学数学教育中最基础的知识之一,也是计算机编程基础教育中重要的一环。Python作为一门强大而易学的编程语言,可以通过多种方法打印乘法表。本文将介绍Python打印乘法表的多种方法,并给出详细的代码示例。

    2024-04-21
    62
  • 运行自己编写的Python程序

    运行自己编写的Python程序Python是一种解释型的高级编程语言,易学易用,同时也非常强大。在日常编程工作和学习中,我们常常需要编写Python程序,并使用Python解释器来运行这些程序,从而实现我们的各种需求。

    2024-09-05
    24
  • InnoDB基础[亲测有效]

    InnoDB基础[亲测有效]在InnoDB中,数据存储在磁盘上,处理数据时需要先将数据从磁盘读取,再写到内存。InnoDB采用局部性原理加载。 一、局部性原理 从磁盘读取数据时,不需要一行一行读取,而是以页为单位读取,操作系统中

    2023-02-11
    151
  • flink1.12 hive_flink docker

    flink1.12 hive_flink dockerApache Flink社区宣布Flink 1.10.0正式发布! 本次Release版本修复1.2K个问题,对Flink作业的整体性能和稳定性做了重大改进,同时增加了对K8S,Python的支持。

    2023-01-28
    148
  • mysql存储过程返回结果集_mysql查看存储过程命令

    mysql存储过程返回结果集_mysql查看存储过程命令IN模式 : 参数输入模式 OUT模式 : 参数输出模式 INOUT模式 : 作为输入和输出模式 区别: in类型:内部运算变化不影响外部; out类型:内部运算变化影响外部变化并且传参到储存过程时…

    2023-03-12
    148
  • TimescaleDB比拼InfluxDB:如何选择合适的时序数据库?[通俗易懂]

    TimescaleDB比拼InfluxDB:如何选择合适的时序数据库?[通俗易懂]时序数据已用于愈来愈多的应用中,包括物联网、DevOps、金融、零售、物流、石油自然气、制造业、汽车、太空、SaaS,乃至机器学习和人工智能。虽然当前时序数据库仅局限于采集度量和监控,可是软件开发人员

    2023-04-27
    125
  • Hadoop2.7.7 centos7 完全分布式 配置与问题随记 – G

    Hadoop2.7.7 centos7 完全分布式 配置与问题随记 – GHadoop2.7.7 centos7 完全分布式 配置与问题随记 这里是当初在三个ECS节点上搭建hadoop+zookeeper+hbase+solr的主要步骤,文章内容未经过润色,请参考的同学搭

    2023-03-18
    158
  • 使用Python的collections.deque优化代码效率

    使用Python的collections.deque优化代码效率a href=”https://beian.miit.gov.cn/”苏ICP备号-1/a Copyright www.python100.com .Some Rights Reserved.

    2024-06-10
    52

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注