如何在 Java 中使用 PreparedStatement?
在 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 的一些示例。