📜  在 JDBC 中运行 SQL 查询的一种不好的方法 (1)

📅  最后修改于: 2023-12-03 15:37:22.253000             🧑  作者: Mango

在 JDBC 中运行 SQL 查询的一种不好的方法

当我们要在 Java 应用程序中与数据库进行交互时,通常会使用 JDBC。其中运行 SQL 查询是一个常见的任务,但有一种不好的方法可能会降低程序的性能,本文将介绍这种方法以及为什么不要使用它。

JDBC 驱动程序基础

在介绍不好的方法之前,我们需要了解一些 JDBC 驱动程序基础。Java 应用程序通过 JDBC 驱动程序与数据库进行通信。JDBC 驱动程序可以分为两种类型:

  • 基于 JDBC-ODBC 桥接器的类型 1 驱动程序
  • 原生 JDBC 驱动程序的类型 2、3、4 驱动程序

Type 1 JDBC 驱动程序使用了一个由操作系统提供的 ODBC 驱动程序(Open Database Connectivity)来实现与数据库通信的桥接器。因此,这种驱动程序需要在应用程序和操作系统之间建立更多的通信连接,会因此导致性能损失。

Type 2、3、4 JDBC 驱动程序是原生的 JDBC 驱动程序,它们直接与数据库进行通信,不需要使用 ODBC 桥接器,因此通常比 Type 1 驱动程序具有更好的性能。

不好的方法

在运行 SQL 查询时,我们可以使用 Statement 接口或 PreparedStatement 接口来向数据库发送 SQL 语句,以获得要求的结果集。这些接口基于 JDBC 驱动程序发送 SQL 命令到数据库并返回结果。

在某些情况下,为了方便,我们可以使用以下方法来在 JDBC 中运行 SQL 查询:

Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM mytable");

这种方法直接将 SQL 查询语句嵌入 Java 代码中。但这样做存在以下问题:

  1. 如果查询语句需要更改,必须更改 Java 代码并重新编译。
  2. 由于 SQL 查询语句以文本字符串的形式嵌入 Java 代码中,因此存在 SQL 注入攻击的风险。
好的方法

为了解决这些问题,我们可以使用 PreparedStatement 接口代替 Statement 接口来向数据库发送 SQL 语句。PreparedStatement 接口允许使用占位符 '?' 将查询参数传递给查询语句,因此可以避免 SQL 注入攻击。

PreparedStatement pstmt = con.prepareStatement("SELECT * FROM mytable WHERE mycolumn = ?");
pstmt.setString(1, "myvalue");
ResultSet rs = pstmt.executeQuery();

即使查询语句需要更改,只需要更改数据库查询语句本身并重新编译 Java 代码,而无需重新编译整个程序。

此外,PreparedStatement 接口还提供了额外的优化措施(例如查询计划缓存),可提高查询性能。

结论

在 JDBC 中运行 SQL 查询时,应该尽可能使用 PreparedStatement 接口来代替 Statement 接口,并避免将 SQL 查询字符串嵌入 Java 代码中。这将提高程序的性能和安全性。