JDBC 中的 PreparedStatement 是什么?

jdbcjava 8mysql

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 将值插入其中,如下所示。

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

将值设置为占位符

PreparedStatement 接口提供了几个 setter 方法,例如 setInt()、setFloat()、setArray()、setDate()、setDouble() 等,用于将值设置为准备好的语句的占位符。

这些方法接受两个参数,一个是代表位置文件夹位置索引的整数值,另一个是 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");

执行已准备语句

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

  • execute():此方法在当前已准备语句对象中执行常规静态 SQL 语句并返回布尔值。

  • executeQuery():此方法执行当前已准备语句并返回 ResultSet 对象。

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

您可以执行上面创建的准备好的语句,如下所示:

示例

在此示例中,我们尝试使用准备好的语句将值插入名为 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)

相关文章