本文介紹了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;
示例如下: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;