JDBC中的PreparedStatement是什么?


PreparedStatement 接口扩展了 Statement 接口,它表示一个预编译的SQL语句,可以执行多次。它接受参数化的SQL查询,您可以向该查询传递0个或多个参数。

最初,此语句使用占位符“?”代替参数,之后您可以使用PreparedStatement接口的setXXX()方法动态地向这些占位符传递参数。

创建PreparedStatement

您可以使用Connection接口的prepareStatement()方法创建PreparedStatement(接口)的对象。此方法接受一个(参数化的)查询并返回一个PreparedStatement对象。

当您调用此方法时,Connection对象将给定的查询发送到数据库进行编译和保存。只有在查询成功编译后,它才会返回对象。

要编译查询,数据库不需要任何值,因此您可以在查询中的值位置使用(零个或多个)占位符(问号”?”)。

例如,如果您在数据库中有一个名为Employee的表,使用以下查询创建。

CREATE TABLE Employee(Name VARCHAR(255), Salary INT NOT NULL, Location VARCHAR(255));

那么您可以使用Prepared Statement将值插入到其中,如下所示。

//Creating a Prepared Statement
String query="INSERT INTO Employee(Name, Salary, Location)VALUES(?, ?, ?)";
Statement pstmt = con.prepareStatement(query);

为占位符设置值

PreparedStatement接口提供了一些setter方法,例如setInt()、setFloat()、setArray()、setDate()、setDouble()等,用于为prepared statement的占位符设置值。

这些方法接受两个参数,一个是表示占位符位置索引的整数值,另一个是int、String、float等…,表示您需要在该特定位置插入的值。

您可以使用setter方法为上面创建的语句的占位符设置值,如下所示

pstmt.setString(1, "Amit");
pstmt.setInt(2, 3000);
pstmt.setString(3, "Hyderabad");

pstmt.setString(1, "Kalyan");
pstmt.setInt(2, 4000);
pstmt.setString(3, "Vishakhapatnam");

pstmt.setString(1, "Renuka");
pstmt.setInt(2, 5000);
pstmt.setString(3, "Delhi");

pstmt.setString(1, "Archana");
pstmt.setInt(2, 15000);
pstmt.setString(3, "Mumbai");

Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.

执行Prepared Statement

创建PreparedStatement对象后,您可以使用PreparedStatement接口的execute()方法之一来执行它,即execute()executeUpdate()和executeQuery()。

  • execute(): 此方法在当前prepared statement对象中执行普通的静态SQL语句,并返回一个布尔值。

  • executeQuery(): 此方法执行当前prepared statement并返回一个ResultSet对象。

  • executeUpdate(): 此方法执行SQL DML语句,例如在当前Prepared statement中插入、更新或删除。它返回一个整数值,表示受影响的行数。

您可以执行上面创建的prepared statement,如下所示

示例

在这个例子中,我们尝试使用prepared statement将值插入到名为Employees的表中。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class PreparedStatementExample {
   public static void main(String args[]) throws SQLException {
      //Registering the Driver
      DriverManager.registerDriver(new com.mysql.jdbc.Driver());

      //Getting the connection
      String mysqlUrl = "jdbc:mysql://localhost/testdb";
      Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
      System.out.println("Connection established......");

      //Creating a Prepared Statement
      String query = "INSERT INTO Employees(Name, Salary, Location) VALUES (?, ?, ?)";
      PreparedStatement pstmt = con.prepareStatement(query);

      pstmt.setString(1, "Amit");
      pstmt.setInt(2, 3000);
      pstmt.setString(3, "Hyderabad");

      pstmt.setString(1, "Kalyan");
      pstmt.setInt(2, 4000);
      pstmt.setString(3, "Vishakhapatnam");

      pstmt.setString(1, "Renuka");
      pstmt.setInt(2, 5000);
      pstmt.setString(3, "Delhi");

      pstmt.setString(1, "Archana");
      pstmt.setInt(2, 15000);
      pstmt.setString(3, "Mumbai");

      int num = pstmt.executeUpdate();
      System.out.println("Rows inserted ....");
   }
}

输出

Connection established......
Number of rows inserted: 1

如果您验证数据库,您可以在表中观察插入的值为

+---------+--------+----------------+
| Name    | Salary | Location       |
+---------+--------+----------------+
| Amit    | 30000  | Hyderabad      |
| Kalyan  | 40000  | Vishakhapatnam |
| Renuka  | 50000  | Delhi          |
| Archana | 15000  | Mumbai         |
+---------+--------+----------------+
5 rows in set (0.00 sec)

更新于:2019年7月30日

11K+ 次浏览

启动您的职业生涯

通过完成课程获得认证

开始
广告