JDBC Statement 和 PreparedStatement 对象之间的主要区别

在这篇文章中,我们将讨论 Statement 和 PreparedStatement 对象之间的主要区别,以及何时应该使用哪个对象。

语句对象:- 它是 JDBC 驱动程序软件提供的 Java 类的对象,它实现了 java.sql.Statement(I)。它也被称为简单语句,因为它与不带参数的简单 SQL 语句一起使用。简单语句对象使数据库软件在执行之前编译 SQL 查询。它始终只能处理静态 SQL 查询(没有输入或硬编码输入的查询)。

PreparedStatement 对象:它是 JDBC 驱动程序软件提供的 Java 类的对象,它实现了 java.sql.PreparedStatement(I)。它从 java.sql.Statement(I) 扩展而来,用于预编译可能包含输入参数的 SQL 语句。

Java 应用程序的 PreparedStatement 对象表示数据库软件的这种预编译 SQL 查询。我们可以使用该对象为 SQL 查询设置输入值,执行 SQL 查询并获取 SQL 查询的输出一次或多次。它可以处理静态和动态 SQL 查询,因为预编译的 SQL 查询可以是带有或不带有输入的静态查询,也可以是带有参数的动态查询。PreparedStatement 对象的 setXxx() 方法在内部将给定的 Java 输入转换为 SQL 输入。因此,程序员不需要显式地给出相同的转换。

表格显示 Statement 和 PreparedStatement 之间的区别

陈述准备好的语句
它只允许静态 SQL 查询。它允许静态和动态 SQL 查询。

该语句不支持预编译的 SQL 查询。
它仅适用于预编译的 SQL 查询。
它不允许我们
在 SQL 查询中使用参数(?)。
PreparedStatement 允许在 SQL 查询中使用参数(?)。
它可能会引发 SQL 注入问题。它不会引发 SQL 注入问题。
Statement 对象最好在没有输入或相同输入或不同输入的情况下多次执行相同的查询。适合多次执行同一个查询。
它可用于插入日期值,但最终用户必须以底层数据库软件支持的模式提供日期值。PreparedStatement 可以以任何模式从最终用户获取日期值。
它不能用于插入大对象,如图像、音频、视频、文件等它可用于插入大对象,如图像、音频、视频、文件等

用例

火车票预订系统,使用简单的Statement对象,一天可预订1,00,000次车票,

  • a) 1,00,000 次相同的插入 SQL 查询从 Java 应用程序进入数据库软件。因此,如果插入一个 SQL 查询需要 0.1 秒,那么总时间 => 1,00,000*0.1 秒 = 10,000 秒
  • b) 1,00,000 次相同的插入 SQL 查询将在数据库软件中解析。因此,如果解析一个 SQL 查询需要 0.2 秒,那么总时间 => 1,00,000*0.2 秒 = 20,000 秒
  • c) 1,00,000 次相同的插入 SQL 查询将在不同值或相同值的数据库软件中执行。因此,如果执行一个 SQL 查询需要 0.1 秒,那么总时间 => 1,00,000*0.1 秒 = 10,000 秒
  • d) 1,00,000 次相同的插入 SQL 查询输出将被提取。因此,如果完成一个 SQL 查询需要 0.1 秒,那么总时间 => 1,00,000*0.1 秒 = 10,000 秒

使用 Statement 对象的总时间 = 10,000 + 20,000 + 10,000 + 10,000 = 50,000 秒 => 13.88 小时(大约)

但是如果我们使用 PreparedStatement 对象,那么 a 和 b 操作只会在 SQL 查询上发生一次,即数据库引擎不会多次对同一个查询执行不必要的操作。因此,对于前面的用例(使用 Statement 对象),c 和 d 阶段将花费相同的时间,但 a 和 b 阶段将只花费 0.1 秒。因此,总时间 = 0.1 秒 + 0.1 秒 + 10, 000 秒 + 10, 000 秒 = 20,000.2 秒 ~ (大约 5.56 小时)。使用 Statement 对象,我们每天浪费 30,000 秒(8.3 小时)对同一个查询多次执行不必要的操作(a、b 操作)。

何时使用陈述对比准备好的语句目的

  • 如果需要在应用程序的整个执行过程中只执行一次没有输入值的 SQL 查询,则使用 java.sql.Statement。
  • 但是,如果需要使用相同或不同的输入值执行一次或多次输入值查询,则使用 java.sql.PreparedStatement。

获取笔记以简化您的学习过程。这些是专为希望通过简单的单词、程序和示例学习编码的初学者设计的。您可以将其用作参考和修订目的。

如果您喜欢这篇文章,请与您的朋友分享。您想分享有关上述主题的更多信息,还是您发现任何不正确的地方?让我们在评论中知道。谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值