报表类型
我们已经看到了最简单的Statement接口。虽然它非常适合工作,但不太适合复杂的查询。在一些消息来源中,表达的意见是根本没有必要使用Statement - 更复杂和功能更丰富的接口才是合适的。
- PreparedStatement
- 可调用语句
一个相当合理的问题出现了——为什么需要这些接口?让我们弄清楚。
首先,我们将看一下PreparedStatement接口和其他 JDBC 功能。稍后我们将转向CallableStatement接口- 首先,它的使用并不常见,其次,在考虑了所有因素之后,对话已经可以变得很短了。
此外,PreparedStatement对称为 SQL 注入的流行数据库黑客方法有很大帮助。
但稍后会详细介绍。
PreparedStatement
如果你尝试翻译名称PreparedStatement,你会得到类似“准备好的语句”的东西。这里最重要的词是“准备”。什么是“准备”?
在我们考虑这个问题之前,我建议从经常发生的便利性的角度来看一个相当重要的观点。因此,在某些应用程序中,我们需要将联系人数据插入到 CONTACT 表中。为此,我们需要准备如下查询:
INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL) VALUES (‘Harry’,'Potter','+79112345678','harry@example.com);
乍一看,似乎一切都没有那么困难和可怕。我们需要编写一段代码,从参数中收集我们需要的字符串:名字、姓氏、地址和电话号码。您只需要记住所有字符串数据都必须用单引号字符括起来。
如果我们在一个单独的函数中执行此操作,那么我们会得到如下内容:
public String buildInsert(String firstName,, String lastName, String phone, String email) {
String sql = "INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL) “+
”VALUES ('" + firstName + "','" + lastName + "','" + phone + "','" + email + ")";
return sql;
}
我们将名字、姓氏、电话号码和地址传递给表单中的参数函数,并从中组成一个 SQL 查询字符串。行情稍微破坏了画面,但到目前为止还不可怕。
好的,数字呢?它们不需要被引号包围。Opanki,在一种情况下你需要引号,在另一种情况下你不需要。情况越来越复杂。
现在让我们再增加一个问题——如果字符串中有一个普通的引号(甚至一个都没有)怎么办?您必须首先寻找此类报价并进行处理。Mdaaa。不知何故,我们开始感到不舒服。
如果我们现在添加日期处理,那么任务就会变得非常无聊——你必须做大量的工作。日期通常令人不快——不同的 SQL 服务器接受不同的日期格式。
那么我们看到了什么?如果我们需要在查询中使用参数,那么手动构建查询就变得非常不愉快。不仅令人不快——我什至会说无聊。有大量的案例需要考虑,这是一项非常无聊的工作。PreparedStatement接口基本上就是针对这种情况提出来的。
这个请求允许你做两件事:
- 提前准备一个请求,指出参数将被替换的地方
- 设置某种类型的参数,然后使用已设置的参数执行查询
PreparedStatement 示例
我们设置参数选项的PreparedStatement结构如下所示:
// Example variables
String firstName = "Harry";
String lastName = "Potter";
String phone = "+12871112233";
String email = "harry@example.com";
// Request with indication of places for parameters in the form of "?"
String sql = "INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL) VALUES (?, ?, ?, ?)";
// Create a request. The con variable is an object of type Connection
PreparedStatement stmt = con.prepareStatement(sql);
// Set parameters
stmt.setString(1, firstName);
stmt.setString(2, lastName);
stmt.setString(3, phone);
stmt.setString(4, email);
// Execute the request
stmt.executeUpdate();
如您所见,一切都非常简单。
首先,在写SQL查询的时候,需要代入参数的地方都写上了问号——“?”。
其次,请求是通过调用con.prepareStatement()创建的。
第三,参数的设置通过数字和数值的指示。请注意,参数的数量从 1 开始,而不是从 0 开始,就像我们在处理数组和集合时习惯的那样。
PreparedStatement接口包含用于设置字符串的方法 — setString(),用于设置数字的方法 — setInt()、setLong()、setDouble(),用于设置日期的方法 — setDate()。和更复杂的类型——这可以在文档中看到。
第四,对stmt.executeUpdate()的调用已在未指定查询字符串的情况下执行。
我强烈推荐与PreparedStatement交朋友——这是一个非常有效的工具。
GO TO FULL VERSION