JDBC中的PreparedStatement是什么?

JDBC中的PreparedStatement是什么?

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

最初,该语句使用占位符 “?” 而不是参数,稍后您可以使用 PreparedStatement 接口的 setXXX() 方法动态地将参数传递到这些占位符中。

阅读更多:MySQL 教程

创建PreparedStatement

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

当您调用此方法时,连接对象将发送给定查询以编译并保存。如果查询成功编译,则方法才返回对象。

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

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

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

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

//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()等,用于将值设置到预处理语句的占位符中。

这些方法接受两个参数,一个是表示占位符位置索引的整数值,另一个是表示要在该位置插入的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对象,就可以使用其中一个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 {
      //注册驱动
      DriverManager.registerDriver(new com.mysql.jdbc.Driver());

      //建立连接
      String mysqlUrl = "jdbc:mysql://localhost/testdb";
      Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
      System.out.println("连接已建立...");

      //创建 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("行已插入....");
  }
}

输出结果

连接已建立...
行已插入: 1

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

+---------+--------+----------------+
| Name    | Salary | Location       |
+---------+--------+----------------+
| Amit    | 30000  | Hyderabad      |
| Kalyan  | 40000  | Vishakhapatnam |
| Renuka  | 50000  | Delhi          |
| Archana | 15000  | Mumbai         |
+---------+--------+----------------+
查询到 5 行记录

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程