ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# Java JDBC `PreparedStatement`示例 > 原文: [https://howtodoinjava.com/java/jdbc/how-to-execute-preparedstatement-using-jdbc/](https://howtodoinjava.com/java/jdbc/how-to-execute-preparedstatement-using-jdbc/) 在数据库管理系统中, [**预备语句**](https://en.wikipedia.org/wiki/Prepared_statement)或**参数化语句**是用于高效重复执行相同或相似数据库语句的功能。 预备语句通常与 SQL 语句(例如查询或更新)一起使用,采用模板的形式,在每次执行期间将某些常量值替换为模板。 一个典型的模板如下所示:“`NSERT INTO EMPLOYEE (ID, NAME) VALUES (?, ?);`” 此处,值在运行时在以“`?`”表示的占位符处设置。 ## 预备语句如何工作? 大多数关系数据库通过四个步骤来处理 JDBC / SQL 查询: 1. 解析传入的 SQL 查询 2. 编译 SQL 查询 3. 规划/优化数据采集路径 4. 执行优化的查询/获取并返回数据 对于发送到数据库的每个 SQL 查询,一个`Statement`将始终执行上述四个步骤。 **在**上面的执行过程中,`PreparedStatement`预先执行步骤(1)–(3)。 因此,在创建`PreparedStatement`时,会立即执行一些预优化。 这样做的目的是减轻执行时数据库引擎的负担。 ## 使用预备语句与简单的 JDBC 语句相比的优势 * SQL 语句的预编译和数据库侧缓存可提高整体执行速度,并能够批量重用同一 SQL 语句。 * 通过内置对引号和其他特殊字符的转义,自动防止 SQL 注入攻击。 请注意,这要求您使用任何`PreparedStatement.setXxx()`方法来设置值,并且不能通过字符串连接使用 SQL 字符串中的值。 * 除了以上两种主要用法外,预备语句还使处理诸如 BLOB 和 CLOB 之类的复杂对象变得容易。 如果您错过了,在以前的文章中,我们了解了 [JDBC 驱动的类型](//howtodoinjava.com/java/jdbc/jdbc-basics-types-of-jdbc-drivers/ "JDBC Basics : Types of JDBC Drivers?")和一些基本操作,例如[使用 JDBC](//howtodoinjava.com/java/jdbc/jdbc-mysql-database-connection-example/ "JDBC MySQL Database Connection Example") 建立数据库连接,然后是[如何执行`SELECT`查询](//howtodoinjava.com/misc/jdbc-select-query-example/ "JDBC SELECT Query Example"),然后单击[`INSERT`查询示例](//howtodoinjava.com/java/jdbc/jdbc-sql-insert-query-example/ "JDBC SQL INSERT Query Example")。 ![JDBC-Icon](https://img.kancloud.cn/1c/97/1c97cbc2085a82c3870087e272080b29_335x146.png) **执行预备语句**需要执行以下步骤: 1)建立数据库连接 2)设置值并执行预备语句 前提条件包括至少设置数据库架构和创建表。 ```java CREATE SCHEMA 'JDBCDemo' ; CREATE TABLE 'JDBCDemo'.'EMPLOYEE' ( 'ID' INT NOT NULL DEFAULT 0 , 'FIRST_NAME' VARCHAR(100) NOT NULL , 'LAST_NAME' VARCHAR(100) NULL , 'STAT_CD' TINYINT NOT NULL DEFAULT 0 ); ``` 让我们在代码中编写以上步骤: ## 1)建立 JDBC 数据库连接 尽管我们在建立 [JDBC 连接](//howtodoinjava.com/java/jdbc/jdbc-mysql-database-connection-example/)时已经了解了它,但是让我们用这个简单的代码片段来回顾一下。 ```java Class.forName("com.mysql.jdbc.Driver"); connection = DriverManager .getConnection("jdbc:mysql://localhost:3306/JDBCDemo", "root", "password"); ``` ## 2)设置值并执行`PreparedStatement` 这是帖子中的主要步骤和核心部分。 它需要创建一个`Statement`对象,然后使用其`executeQuery()`方法。 ```java PreparedStatement pstmt = connection.prepareStatement(sql); pstmt.setInt(1, 87); pstmt.setString(2, "Lokesh"); pstmt.setString(3, "Gupta"); pstmt.setInt(4, 5); int affectedRows = pstmt.executeUpdate(); ``` 让我们看看整个代码在工作。 ## 完整的 JDBC `PreparedStatement`示例 ```java package com.howtodoinjava.jdbc.demo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; public class PreparedStatementDemo { public static void main(String[] args) { Connection connection = null; PreparedStatement pstmt = null; String sql = "INSERT INTO EMPLOYEE (ID,FIRST_NAME,LAST_NAME,STAT_CD) VALUES (?,?,?,?)"; try { Class.forName("com.mysql.jdbc.Driver"); connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/JDBCDemo", "root", "password"); pstmt = connection.prepareStatement(sql); pstmt.setInt(1, 87); pstmt.setString(2, "Lokesh"); pstmt.setString(3, "Gupta"); pstmt.setInt(4, 5); int affectedRows = pstmt.executeUpdate(); System.out.println(affectedRows + " row(s) affected !!"); } catch (Exception e) { e.printStackTrace(); }finally { try { pstmt.close(); connection.close(); } catch (Exception e) { e.printStackTrace(); } } } } Output: 1 row(s) affected !! ``` 以上就是这篇文章。 如果需要解释,请给我评论。 **快乐学习!**