如何在 Java 中使用 PreparedStatement?

javaserver side programmingprogramming

在 Java 中使用数据库和 SQL 查询 时,必须使用 PreparedStatement 来安全有效地运行参数化查询。

在这个数据驱动的世界中,与数据库交互的能力是许多软件程序的重要要求。Java 是一种多功能且强大的编程语言,它提供 Java 数据库连接 (JDBC),这是一种有效的机制,可以实现与不同数据库系统的顺畅交互。

Java 的 PreparedStatement 功能允许程序员在执行 SQL 查询之前对其进行预编译。通过减少解析时间和重用执行计划,与常规 Statement 对象相比,PreparedStatement 可以提高数据库性能。此外,它还提供了一种处理动态输入的安全方法,可防止 SQL 注入攻击。

从上面的段落中,我们了解了使用 PreparedStatement 的定义和优点,现在我们将借助一些示例深入研究 PreparedStatement 的用法。

首先,让我们在 MYSQL 数据库中创建一个表,或者您可以使用任何您熟悉的数据库。

让我们创建一个表:-

打开 Mysql 数据库,现在我们将创建一个新的数据库并使用它。

create database Test;
use Test;

现在让我们创建一个包含 emp_id 、 emp_name 、 emo_email 的员工表。

查询

create table Employee(emp_id int primary key,emp_name varchar(20), emp_email varchar(20));
desc Employee;

输出

在员工表中插入一些记录:-

insert into Employee values(1,"Hari","hari123@gmail.com");
insert into Employee values(2,"Syam","syam98@gmail.com");
insert into Employee values(3,"Revanth","Revanth53@gmail.com");

让我们检查数据是否已插入表中:-

查询

select *from Employee;

输出

现在我们准备好了数据。让我们创建一个 Java 应用程序并尝试在 Eclipse IDE 的帮助下连接到该数据库。 PreparedStatement 的使用主要包括 5 个步骤:-

  • 建立连接。

  • 创建 PreparedStatement。

  • 设置参数。

  • 执行查询。

  • 关闭连接。

在建立与数据库的连接之前,我们需要加载 JDBC 驱动程序,或者只是从 maven 存储库中添加建立连接所需的 mysql 依赖项,驱动程序类名将根据我们使用的数据库而有所不同。

Class.forName("com.mysql.jdbc.Driver");

或者

依赖项

<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>8.0.27</version>
</dependency>

现在我们将使用 JDBC url、用户名和密码建立与数据库的连接。

Connection con = DriverManager.getConnection( "jdbc:mysql://localhost:3306/Test","root", "root");

一旦建立连接,我们就可以使用 PreparedStatement 类执行我们的 sql 语句。

我们将在查询中使用 问号 作为占位符,如

select *from Employee where emp_name= ?

示例 1

import java.net.ConnectException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.PreparedStatement;

public class App {

   
   public static void main(String[] args) throws Exception
   {
      String url = "jdbc:mysql://localhost:3306/Test";
      String user ="root";
      String password = "root";
      Connection myConn = null;
      ResultSet result = null;
      try {
        //我们将提供 url、用户名和密码来建立连接
        myConn = DriverManager.getConnection(url,user,password);
        
        //我们将形成查询并保留占位符以传递任何参数
        String qp= "select * from Employee where emp_name =!";
        
        //创建 PreparedStatement
        PreparedStatement myStmnt = myConn.prepareStatement(qp);
        
        //现在我们将设置参数
        //根据参数类型,我们将使用不同的方法来设置值,例如
        //myStmnt.setInt()、myStmnt.setFloat()、myStmnt.setDouble()、setString()
        
        //setString() 中的第一个值表示 paramterIndex,第二个值表示值
        myStmnt.setString(1, "Hari");
        
        //对于执行查询,我们主要有两种方法
        //1. executeQuery() - 当我们使用选择查询时,我们需要使用它,它返回 ResultSet
        //2. executeUpdate()- 当我们需要执行创建、插入、删除、删除、更新等操作时,我们使用这个方法
        result= myStmnt.executeQuery();
        System.out.println("EmpID"+ " " + "EmpName");
        System.out.println("=============");
        while(result.next()) {
        System.out.println(result.getInt("emp_id") + " \t " + result.getString("emp_name"));
        }
      }
      catch(Exception e){
         // 此 catch 块用于处理异常
         e.printStackTrace();
      }
      
      finally {
         //关闭连接
         myConn=null;
         result=null;
      }

   }
}

输出

EmpID  EmpName
=============
1      Hari

示例 2

现在我们将看到一个使用 PreparedStatement 向 Employee 表中插入记录的示例。

import java.net.ConnectException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.PreparedStatement;

public class App {

   
   public static void main(String[] args) throws Exception
   {
      String url = "jdbc:mysql://localhost:3306/Test";
      String user ="root";
      String password = "root";
      Connection myConn = null;
      ResultSet result = null;
      try {
        //我们将提供 url、用户名和密码来建立连接
        myConn = DriverManager.getConnection(url,user,password);
        
        //我们将形成查询并保留占位符以传递任何参数
        String qp= "insert into Employee values(?,?,?)";
        
        //创建 PreparedStatement
        PreparedStatement myStmnt = myConn.prepareStatement(qp);
        
        //现在我们将设置参数
        //根据参数类型,我们将使用不同的方法来设置值,例如
        //myStmnt.setInt(),myStmnt.setFloat(),myStmnt.setDouble(),setString()
        
        myStmnt.setInt(1, 4);
        myStmnt.setString(2, "Latha");
        myStmnt.setString(3, "latha1210@gmail.com");
        
        //执行查询主要有两种方法
        //1. executeQuery() - 当我们使用选择查询时需要使用此方法,它返回 ResultSet
        //2. executeUpdate()- 当我们需要执行创建、插入、删除、删除、更新等操作时使用此方法
        int recCount= myStmnt.executeUpdate();
        System.out.println(recCount + " record(s) replaced");
         
      }
      catch(Exception e){
         // 此 catch 块用于处理异常
         e.printStackTrace();
      }
      
      finally {
         //关闭连接
         myConn=null;
         result=null;
      }

   }
}

输出

在将数据插入表中之前:

运行上述程序后,即插入一条记录:

结论

在本文中,我们研究了 PreparedStatement 的定义及其相对于常规语句的优势,包括提高效率、防止 SQL 注入。我们还在 JDBC 的帮助下看到了 Java 中 PreparedStatement 的一些示例。


相关文章