全部產品
Search
文件中心

PolarDB:Prepared語句

更新時間:Jul 06, 2024

本文介紹了Prepare協議的概念、用途及在Java中的開啟方法。

Prepare協議介紹

Prepare協議分為兩種模式:
  • 二進位模式:該模式基於高效的用戶端/伺服器二進位協議,是程式開發中最常用的模式;
  • 文字模式:該模式基於SQL文法來實現,包括PREPARE/EXECUTE/DEALLOCATE PREPARE三種語句。
PolarDB-X對這兩種模式均提供支援。使用預先處理語句和預留位置來擷取參數值具有以下優勢:
  • 每次執行時解析語句的開銷都較小。通常情況下,資料庫應用程式處理大量幾乎相同的語句,只改變Prepare語句中的變數值,這樣可以大幅度提升SQL執行效率。
  • 防止SQL注入攻擊。

二進位模式

二進位Prepare協議支援使用JDBC及其他各種語言,MySQL支援範圍可參見Prepared StatementsPolarDB-X的支援情況如下:

在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;
樣本如下:
PREPARE stmt2 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
SET @a = 6;
SET @b = 8;
EXECUTE stmt2 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|         10 |
+------------+

DEALLOCATE PREPARE stmt2;