开发指南—Prepared语句

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 本文介绍了Prepare协议的概念、用途及在Java中的开启方法。

Prepare协议介绍

Prepare协议分为两种模式:

  • 二进制模式:该模式基于高效的客户端/服务器二进制协议,是程序开发中最常用的模式;
  • 文本模式:该模式基于SQL语法来实现,包括PREPARE/EXECUTE/DEALLOCATE PREPARE三种语句。

PolarDB-X对这两种模式均提供支持。使用预处理语句和占位符来获取参数值具有以下优势:

  • 每次执行时解析语句的开销都较小。通常情况下,数据库应用程序处理大量几乎相同的语句,只改变Prepare语句中的变量值,这样可以大幅度提升SQL执行效率。
  • 防止SQL注入攻击。

二进制模式

二进制Prepare协议支持使用JDBC及其他各种语言,MySQL支持范围可参见Prepared Statements。PolarDB-X的支持情况如下:

  • Prepare协议支持范围:
  • Prepare协议SQL支持范围:支持所有DML语句,例如:SELECT、UPDATE、DELETE、INSERT等。
  • Prepare协议SQL不支持范围:不支持DML以外其他SQL语句,例如:SHOW、SET等。

在Java中开启Prepare协议

  • 在JAVA客户端中,如果需要使用Prepare协议,需要显式在URL连接串中增加useServerPrepStmts=true参数,如果不指定此参数,则PreparedStatement默认会走普通查询。
  • 如:jdbc:mysql://xxxxxx:3306/xxxxxx?useServerPrepStmts=true

Java使用示例:


Class.forName("com.mysql.jdbc.Driver");
Connection connection =  DriverManager.getConnection("jdbc:mysql://xxxxxx:3306/xxxxxx?useServerPrepStmts=true", "xxxxx", "xxxxx");
String sql = "insert into batch values(?,?)";
PreparedStatement preparedStatement = connection.prepareStatement(sql); 
preparedStatement.setInt(1, 0);
preparedStatement.setString(2, "polardb-x");
preparedStatement.executeUpdate();

文本模式

首先通过PREPARE语句给预处理语句preparable_stmt指定名称stmt_name,其中stmt_name不区分大小写,并且preparable_stmt只能为单语句。


PREPARE stmt_name FROM preparable_stmt;

接着通过EXECUTE语句执行指定的预处理语句,如果预处理语句包含参数占位符的话,必须用USING子句指定用户定义变量作为参数。


EXECUTE stmt_name [USING @var_name [, @var_name] ...];

最后通过DEALLOCATE PREPARE语句来释放清理预处理语句。


DEALLOCATE PREPARE stmt_name;

示例如下:


mysql> PREPARE stmt2 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';

mysql> SET @a = 6;
mysql> SET @b = 8;
mysql> EXECUTE stmt2 USING @a, @b;
+------------+
| hypotenuse |
+------------+
| 10 |
+------------+
mysql> DEALLOCATE PREPARE stmt2;


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
NoSQL 编译器 API
关于thread使用的错误:pure virtual method called terminate called without an active exception
关于thread使用的错误:pure virtual method called terminate called without an active exception
465 1
|
机器学习/深度学习 人工智能 数据挖掘
如何做好互联网产品需求分析?看这里!
如何做好互联网产品需求分析?看这里!
502 0
|
存储 缓存 监控
Linux缓存管理:如何安全地清理系统缓存
在Linux系统中,内存管理至关重要。本文详细介绍了如何安全地清理系统缓存,特别是通过使用`/proc/sys/vm/drop_caches`接口。内容包括清理缓存的原因、步骤、注意事项和最佳实践,帮助你在必要时优化系统性能。
1192 78
|
9月前
|
测试技术 数据库
【YashanDB知识库】archivelog磁盘满导致数据库abnormal
【YashanDB知识库】archivelog磁盘满导致数据库abnormal
|
存储 NoSQL 网络协议
PG内核解读-第1节PostgreSQL系统概述
本文整理自阿里云数据库开源社区Maintainer于巍(花名漠雪),在PostgreSQL数据库内核解读系列的分享。本篇内容主要分为四个部分: 1. 本系列教程介绍 2. PostgreSQL概述(历史、架构) 3. PostgreSQL安装启动 4. PostgreSQL常用命令、调试
PG内核解读-第1节PostgreSQL系统概述
|
存储 Prometheus 监控
Prometheus 的报警机制:Alertmanager 的配置与使用
【8月更文第29天】Prometheus 是一个非常强大的监控系统,它不仅能够收集和存储时间序列数据,还能通过 Alertmanager 提供灵活的报警机制。Alertmanager 负责接收 Prometheus 发送的警报,并根据配置的规则执行相应的通知动作。本文将详细介绍如何配置 Alertmanager 以及如何使用它来实现基于 Prometheus 指标的报警通知。
4403 0
|
存储 网络协议 架构师
架构师之路 - 存储架构
架构师之路 - 存储架构
1819 1
|
存储 SQL 缓存
PostgreSQL 内核解读系列 - 第4节 存储管理(下)
本文整理自阿里云数据库开源社区 Maintainer 于巍(花名漠雪),在PostgreSQL数据库内核解读系列的分享。本篇内容主要分为四个部分: 1. 磁盘管理 2. 空闲空间映射表(FSM) 3. 可见性映射表(VM) 4. 内存管理。
PostgreSQL 内核解读系列 - 第4节 存储管理(下)
|
存储 关系型数据库 MySQL
数据架构:数据冷热分离实践思考
本篇分析了几个冷热分离的实现案例,并整理了一些问题和解决方案。通过mysql 和 Es的两种冷热分离实现,阐述了不同存储方案上冷热分离实现上的共同点和差别。回归本源,设计最终还是依赖于具体业务需求。后续还需要在实践中,通过足够的业务场景和数据量级支撑,来继续验证方案的可行性和潜在问题,不断进行完善升级。
2689 0