原文: https://howtodoinjava.com/java/jdbc/how-to-execute-preparedstatement-using-jdbc/
在数据库管理系统中, 预备语句或参数化语句是用于高效重复执行相同或相似数据库语句的功能。 预备语句通常与 SQL 语句(例如查询或更新)一起使用,采用模板的形式,在每次执行期间将某些常量值替换为模板。
一个典型的模板如下所示:“NSERT INTO EMPLOYEE (ID, NAME) VALUES (?, ?);
”
此处,值在运行时在以“?
”表示的占位符处设置。
预备语句如何工作?
大多数关系数据库通过四个步骤来处理 JDBC / SQL 查询:
- 解析传入的 SQL 查询
- 编译 SQL 查询
- 规划/优化数据采集路径
- 执行优化的查询/获取并返回数据
对于发送到数据库的每个 SQL 查询,一个Statement
将始终执行上述四个步骤。 在上面的执行过程中,PreparedStatement
预先执行步骤(1)–(3)。 因此,在创建PreparedStatement
时,会立即执行一些预优化。 这样做的目的是减轻执行时数据库引擎的负担。
使用预备语句与简单的 JDBC 语句相比的优势
- SQL 语句的预编译和数据库侧缓存可提高整体执行速度,并能够批量重用同一 SQL 语句。
- 通过内置对引号和其他特殊字符的转义,自动防止 SQL 注入攻击。 请注意,这要求您使用任何
PreparedStatement.setXxx()
方法来设置值,并且不能通过字符串连接使用 SQL 字符串中的值。 - 除了以上两种主要用法外,预备语句还使处理诸如 BLOB 和 CLOB 之类的复杂对象变得容易。
如果您错过了,在以前的文章中,我们了解了 JDBC 驱动的类型和一些基本操作,例如使用 JDBC 建立数据库连接,然后是如何执行SELECT
查询,然后单击INSERT
查询示例。
执行预备语句需要执行以下步骤:
1)建立数据库连接
2)设置值并执行预备语句
前提条件包括至少设置数据库架构和创建表。
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 连接时已经了解了它,但是让我们用这个简单的代码片段来回顾一下。
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager
.getConnection("jdbc:mysql://localhost:3306/JDBCDemo", "root", "password");
2)设置值并执行PreparedStatement
这是帖子中的主要步骤和核心部分。 它需要创建一个Statement
对象,然后使用其executeQuery()
方法。
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
示例
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 !!
以上就是这篇文章。 如果需要解释,请给我评论。
快乐学习!