命名参数和位置参数之间的性能差异

问题描述 投票:1回答:1

我知道与普通的Select比较,将值直接放入SQL语句中,就像这样:

Statement command = connection.createStatement( "SELECT * FROM person WHERE name = "+ nameVar);

使用JDBC和位置参数执行此操作,如下所示:

String statment= "SELECT * from Users WHERE name=? and pass =?";
sentence = conexion.prepareStatement(consulta);
sentence.setString(1, nameVar);
sentence.setString(2, passVar);

对于一些事情更好,例如避免SQL注入,并且还使用更少的内存(仅用于缓存执行计划一次)和性能(因为不一次又一次地执行相同的执行计划)

但是如果你有很多“?”可能很难将参数与变量相关联,这可能会导致错误。

我的问题是,如果执行上述位置参数与执行“命名参数”之间存在差异,如下所示:

String statment= "SELECT * from Users WHERE name=:nameParam and pass =:passParam";
sentence = conexion.prepareStatement(consulta);
sentence.setString("nameParam", nameVar);
sentence.setString("passParam", passVar);

因为更容易,可以跳过错误

UPDATE

通过评论似乎只使用JPA / Hibernate可以使用:parameters。那问题仍然存在。使用Hibernate有什么区别?

java sql hibernate jdbc parameter-passing
1个回答
1
投票

正如您所指出的那样,您正在构建PreparedStatement,以便DB可以缓存它的执行计划等。因此,当驱动程序实际与DB进行通信时,所有性能增益都来自于此。

其他好处是代码。它是DRY-er(不要重复自己)你可以防止SQL注入攻击,因为你可以验证参数,他们不能添加“结构更改”到SQL。您可以保留对PreparedStatement对象的引用,因此无需重新创建它等。

但是你在这两种情况下都这样做,所以主要的好处是相同的。在封面下,将一系列参数传递给驱动程序以运行准备好的语句。

位置参数很可能只是索引到数组(取决于您的驱动程序的实现),而命名参数保持名称映射到位置并在需要时生成正确的数组。

鉴于SQL语句中的params数量往往很小(通常可以在一只或两只手上计算),创建数组非常快,与通过网络向DB运行查询的成本相比可忽略不计。

所以恕我直言使用哪个可以帮助你最好地推理你的代码。性能差异微不足道。

© www.soinside.com 2019 - 2024. All rights reserved.