当前位置: 首页 > 知识库问答 >
问题:

java - 请教jdbc PreparedStatement设置参数的时候,为何需要指定具体参数类型?

唐元凯
2024-04-23

jdbc PreparedStatement接口中,提供了一系列方法用来设置 SQL参数。比如:

void setInt(int parameterIndex, int x);void setString(int parameterIndex, String x);void setObject(int parameterIndex, Object x);

既然,setObject(int parameterIndex, Object x)作为一个通用的方法,可以适配任何参数的设置,那么jdbc api中提供更具体的 类似setInt(int parameterIndex, int x)的作用何在呢?

感谢解答!

共有2个答案

闻人宇定
2024-04-23

如果你的SQL里需要的参数是一个数字类型的数字123,但是我传的是一个字符串abc,使用setObject的时候编译器会报错吗?并不会,因为什么类型的对象都可以往里填,同理传其他类型的对象也有可能会造成SQL异常,如果使用的是setInt()方法就会报错了,因为编译器知道这里必须传的是一个int类型的数值。在编写程序的时候能够发现的异常肯定比你运行这段代码发现异常后来修改的代价要来的小。
还有一点,假设全部用setObject()方法并且传了正确数值能正常运行代码,当你很久之后或者其他人重新看到了这段代码:

xxx.setObject(1,xxx.get());//我就是任性,传的参数就是一个Object不告诉你它是什么类型

你还能记起来你当时是往SQL的这个位置传一个什么类型的参数吗?恐怕这个时候要去往前翻代码才能知道它具体是什么类型了,这给修改和搜索带来了麻烦。

杜禄
2024-04-23

在 JDBC 中,PreparedStatement 的设计初衷是为了提高 SQL 语句的执行效率,并减少 SQL 注入的风险。当你使用 PreparedStatement 时,数据库可以预先编译 SQL 语句,然后在每次执行时,只需替换其中的参数值,而无需每次都重新解析整个 SQL 语句。

具体到你的问题,虽然 setObject(int parameterIndex, Object x) 方法可以处理任何类型的参数,但使用更具体的方法(如 setInt、setString 等)有几个优势:

  1. 性能优化:数据库在执行 SQL 语句时,需要知道参数的类型,以便能够更有效地处理它们。如果你使用 setObject 方法,数据库可能需要额外的步骤来确定参数的实际类型,这可能会影响性能。而使用更具体的方法,数据库可以直接知道参数的类型,从而优化处理过程。
  2. 类型安全:使用更具体的方法,你可以确保传递给 PreparedStatement 的参数类型是正确的。如果你错误地传递了一个错误的类型(例如,将一个字符串传递给一个期望整数的参数),那么将会抛出一个异常。这有助于在开发阶段就捕获并修复错误。
  3. 代码可读性:使用更具体的方法可以使代码更具可读性。当你看到 setInt、setString 等方法时,你可以立即知道参数的类型。而如果你使用 setObject,则需要查看方法调用的上下文才能确定参数的类型。

总的来说,虽然 setObject 方法提供了灵活性,但在可能的情况下,最好使用更具体的方法来设置 PreparedStatement 的参数。这可以提高性能,增强类型安全,并提高代码的可读性。

 类似资料:
  • 问题内容: 鉴于: 涉及并编译的语句很好,但是失败: 可以通过提供显式类型参数来解决编译器错误。 Java 8何时需要显式类型参数?意思是,是否存在一种打破类型推断的已知模式? 能和改变,以避免显式类型参数不失使用生成器的配置的收藏家? 更新 : 为什么涉及工作的陈述?它与所涉及的陈述有何不同? 问题答案: 要回答您的问题“意思是,是否存在一种已知的打破类型推断的模式?” 简短地说:当然,有一种模

  • 鉴于: 涉及和的语句编译良好,但失败,原因如下: 编译器错误可以通过提供显式类型参数

  • 我正在react(版本0.13.3)组件中指定所需的函数proptype。。。 正如您所看到的,我的onClick prop不仅需要是一个函数,还需要接受两个参数。是否有任何方法可以使用React PropTypes指定这一点? 我已经阅读了React docs关于可重用组件的条目,似乎只有一种方法可以定义对象类型的形状,而不是函数类型。

  • 问题内容: 我最近下载了watij。他们在他们的网站上说 注意:如果在Mac上运行,则必须添加Java VM参数。 我想知道这样做的步骤是什么,因为它们没有指定。 问题答案: 将-d32添加到vm参数意味着在运行应用程序时: 相反,您可以这样做: 它指定程序将在32位体系结构上运行。 要从 Eclipse 设置JVM参数,请执行以下操作: 1.右键单击要运行的类。 2.单击运行配置 。3.转到参数

  • 问题内容: 在回答这个问题时,谈到要调用时需要参数标签。这在Swift中很正常。 但是,陌生力量在起作用: 要在此处使用参数标签,必须明确声明。 在文档中,我还没有看到非常详尽的解释。哪些种类的类/实例/全局函数需要自变量标签?是否始终使用参数标签导出和导入Obj-C方法? 问题答案: 从Swift 3.0开始,这种情况再次发生了变化:除非您使用外部名称明确选择退出,否则所有方法,函数和初始化器都

  • /** 设置超媒体自定义参数 @param parameter 自定义参数 例如:@{@"token": @"18231yy31hh12",@"xxx": @"yyyy"} */ [Ntalker ntalker_setHyperMediaData:@{@"token": @"18231yy31hh12",@"xxx": @"yyyy"}];