本文介绍了Prepare协议的概念、用途及在Java中的开启方法。
介绍
PolarDB-X 1.0提供对服务器端预处理语句的支持,支持利用高效的客户端/服务器二进制协议。使用准备好的语句和占位符来获取参数值具有以下优势:
- 每次执行时解析语句的开销都较小。通常情况下,数据库应用程序处理大量几乎相同的语句,只改变Prepare语句中的变量值,这样可以大幅度提升SQL执行效率。
- 防止SQL注入攻击。
详细说明
- Prepare协议支持范围
- Prepare协议目前支持:
- 支持使用Java及其他各种语言。
- MySQL支持范围参见Prepared Statements。
- Prepare协议SQL支持范围:支持所有DML语句,例如:SELECT、UPDATE、DELETE、INSERT等。
- Prepare协议SQL不支持范围:不支持DML以外其他SQL语句,例如:SHOW、SET等。
- Prepare协议不支持在MySQL命令行中使用如下方法:
mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse'; mysql> PREPARE stmt2 FROM @s; mysql> SET @a = 6; mysql> SET @b = 8; mysql> EXECUTE stmt2 USING @a, @b;
在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, "corona-db");
preparedStatement.executeUpdate();