暂无图片
prepared statement具体是啥语句?存储过程吗?
我来答
分享
暂无图片 匿名用户
prepared statement具体是啥语句?存储过程吗?

prepared statement具体是啥语句?存储过程吗?

举个样例,便于理解

我来答
添加附件
收藏
分享
问题补充
3条回答
默认
最新
Mjwlan

Prepared statement(预编译语句)是一种数据库查询语句的机制,它允许将参数化查询语句在数据库中进行预编译,并在稍后的执行过程中提供实际的参数值。

与直接执行普通查询语句不同,预编译语句由两个步骤组成:

  1. 准备(prepare): 在此步骤中,应用程序发送查询语句给数据库,但参数位置(如 WHERE 子句中的占位符)由特殊的占位符代替。例如,对于 MySQL 数据库,占位符可以使用问号 ? 表示。

  2. 执行(execute): 在此步骤中,应用程序再次向数据库发送相同的查询语句,但这次会传递实际的参数值。数据库使用预先编译的查询计划来执行该语句,以提高性能。

预编译语句的优点包括:

  • 性能提升: 预编译语句可以多次执行,只需编译一次,后续执行只需要传递参数即可,避免了每次执行都需要重新解析和优化查询的开销。
  • 安全性增强: 使用参数化查询可以防止SQL注入攻击,因为参数值被正确地处理,而不是直接嵌入到查询语句中。

下面是一个简单的示例,使用 Java 的 JDBC API 执行预编译语句:

java复制代码

import java.sql.*; public class PreparedStatementExample { public static void main(String[] args) { String query = "SELECT * FROM customers WHERE age > ?"; int ageThreshold = 25; try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "username", "password"); PreparedStatement statement = conn.prepareStatement(query)) { statement.setInt(1, ageThreshold); // 绑定参数值到占位符 ResultSet resultSet = statement.executeQuery(); while (resultSet.next()) { // 处理结果集 String name = resultSet.getString("name"); int age = resultSet.getInt("age"); System.out.println("Name: " + name + ", Age: " + age); } } catch (SQLException e) { e.printStackTrace(); } } }

在这个示例中,我们使用了 PreparedStatement 类来执行预编译语句。通过调用 setInt() 方法,我们将实际的参数值绑定到占位符位置。然后,通过执行 executeQuery() 方法,我们可以获得匹配条件的结果集并进行处理。

需要注意的是,存储过程与预编译语句是不同的概念。存储过程是一组已经编译和存储在数据库中的SQL语句,可以由应用程序通过调用存储过程的名称来执行。而预编译语句仅表示单个查询语句的编译和执行方式。

暂无图片 评论
暂无图片 有用 8
大大刺猬

同一类sql, 只有条件不一样, 每次都发送到服务器上去解析, 成本太高, 还占带宽. 所以有prapare statement. 一般开发用得多, dba不常用

官网有详细介绍, 还有例子:
The first example shows how to create a prepared statement by using a string literal to supply the text of the statement:

mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> SET @a = 3;
mysql> SET @b = 4;
mysql> EXECUTE stmt1 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|          5 |
+------------+
mysql> DEALLOCATE PREPARE stmt1;

The second example is similar, but supplies the text of the statement as a user variable:

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;
+------------+
| hypotenuse |
+------------+
|         10 |
+------------+
mysql> DEALLOCATE PREPARE stmt2;

Here is an additional example that demonstrates how to choose the table on which to perform a query at runtime, by storing the name of the table as a user variable:

mysql> USE test;
mysql> CREATE TABLE t1 (a INT NOT NULL);
mysql> INSERT INTO t1 VALUES (4), (8), (11), (32), (80);

mysql> SET @table = 't1';
mysql> SET @s = CONCAT('SELECT * FROM ', @table);

mysql> PREPARE stmt3 FROM @s;
mysql> EXECUTE stmt3;
+----+
| a  |
+----+
|  4 |
|  8 |
| 11 |
| 32 |
| 80 |
+----+

mysql> DEALLOCATE PREPARE stmt3;
暂无图片 评论
暂无图片 有用 1

应该是预处理 不是预编译 ORACLE和PG 都会把重复的SQL编译后保存在内存里,以后重复使用. 开发端自然是没有必要再多次一举!

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏