我知道与普通的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有什么区别?
正如您所指出的那样,您正在构建PreparedStatement,以便DB可以缓存它的执行计划等。因此,当驱动程序实际与DB进行通信时,所有性能增益都来自于此。
其他好处是代码。它是DRY-er(不要重复自己)你可以防止SQL注入攻击,因为你可以验证参数,他们不能添加“结构更改”到SQL。您可以保留对PreparedStatement对象的引用,因此无需重新创建它等。
但是你在这两种情况下都这样做,所以主要的好处是相同的。在封面下,将一系列参数传递给驱动程序以运行准备好的语句。
位置参数很可能只是索引到数组(取决于您的驱动程序的实现),而命名参数保持名称映射到位置并在需要时生成正确的数组。
鉴于SQL语句中的params数量往往很小(通常可以在一只或两只手上计算),创建数组非常快,与通过网络向DB运行查询的成本相比可忽略不计。
所以恕我直言使用哪个可以帮助你最好地推理你的代码。性能差异微不足道。